102c102,103
< static const FlagsType AutoDelete = 0x0004; // delete after dispatch
---
> static const FlagsType Managed = 0x0004; // Use life cycle manager
> static const FlagsType AutoDelete = Managed; // delete after dispatch
284a286,334
> protected: /* Memory management */
> /**
> * @{
> * Memory management hooks for events that have the Managed flag set
> *
> * Events can use automatic memory management by setting the
> * Managed flag. The default implementation automatically deletes
> * events once they have been removed from the event queue. This
> * typically happens when events are descheduled or have been
> * triggered and not rescheduled.
> *
> * The methods below may be overridden by events that need custom
> * memory management. For example, events exported to Python need
> * to impement reference counting to ensure that the Python
> * implementation of the event is kept alive while it lives in the
> * event queue.
> *
> * @note Memory managers are responsible for implementing
> * reference counting (by overriding both acquireImpl() and
> * releaseImpl()) or checking if an event is no longer scheduled
> * in releaseImpl() before deallocating it.
> */
>
> /**
> * Managed event scheduled and being held in the event queue.
> */
> void acquire()
> {
> if (flags.isSet(Event::Managed))
> acquireImpl();
> }
>
> /**
> * Managed event removed from the event queue.
> */
> void release() {
> if (flags.isSet(Event::Managed))
> releaseImpl();
> }
>
> virtual void acquireImpl() {}
>
> virtual void releaseImpl() {
> if (!scheduled())
> delete this;
> }
>
> /** @} */
>
343c393,394
< bool isAutoDelete() const { return flags.isSet(AutoDelete); }
---
> bool isManaged() const { return flags.isSet(Managed); }
> bool isAutoDelete() const { return isManaged(); }