#include <xbt/base.h>
#include "simgrid/forward.h"
+#include <atomic>
#include <simgrid/simix.hpp>
namespace simgrid {
virtual void resume()=0;
virtual void post() =0; // What to do when a simcall terminates
+ // boost::intrusive_ptr<Activity> support:
+ friend void intrusive_ptr_add_ref(ActivityImpl * activity)
+ {
+ // Atomic operation! Do not split in two instructions!
+ auto previous = (activity->refcount_)++;
+ xbt_assert(previous != 0);
+ (void)previous;
+ }
+
+ friend void intrusive_ptr_release(ActivityImpl * activity)
+ {
+ // Atomic operation! Do not split in two instructions!
+ auto count = --(activity->refcount_);
+ if (count == 0)
+ delete activity;
+ }
+
+ /** @brief Increase the refcount */
void ref();
- void unref();
+ /** @brief Reduce the refcount; returns true if the object was destroyed */
+ bool unref();
+
private:
+ std::atomic_int_fast32_t refcount_{1};
int refcount = 1;
};
}}} // namespace simgrid::kernel::activity