+void ActivityImpl::resume()
+{
+ if (surf_action_ == nullptr)
+ return;
+ XBT_VERB("This activity is resumed (remain: %f)", surf_action_->get_remains());
+ surf_action_->resume();
+ on_resumed(*this);
+}
+
+void ActivityImpl::cancel()
+{
+ XBT_VERB("Activity %p is canceled", this);
+ if (surf_action_ != nullptr)
+ surf_action_->cancel();
+ state_ = SIMIX_CANCELED;
+}
+
+// boost::intrusive_ptr<Activity> support:
+void intrusive_ptr_add_ref(simgrid::kernel::activity::ActivityImpl* activity)
+{
+ activity->refcount_.fetch_add(1, std::memory_order_relaxed);
+}
+
+void intrusive_ptr_release(simgrid::kernel::activity::ActivityImpl* activity)
+{
+ if (activity->refcount_.fetch_sub(1, std::memory_order_release) == 1) {
+ std::atomic_thread_fence(std::memory_order_acquire);
+ delete activity;
+ }
+}
+xbt::signal<void(ActivityImpl const&)> ActivityImpl::on_resumed;
+xbt::signal<void(ActivityImpl const&)> ActivityImpl::on_suspended;
+}