diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2010-03-30 15:18:43 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2010-03-30 15:18:43 +0000 |
commit | 14b0ca31bcb62e5b7e9e77634ef9cd2e8cf65800 (patch) | |
tree | 494bcf5351ff29d9981c22450863982b93a91a71 /libs/pbd/pbd/event_loop.h | |
parent | 10c257039df399fc5a9c383434ee19abab6199ed (diff) |
handle deletion of UI objects between the time that a callback is queued with the UI event loop and the execution of the callback (intrusive, big)
git-svn-id: svn://localhost/ardour2/branches/3.0@6807 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/pbd/event_loop.h')
-rw-r--r-- | libs/pbd/pbd/event_loop.h | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/libs/pbd/pbd/event_loop.h b/libs/pbd/pbd/event_loop.h index be98fcd852..088b061826 100644 --- a/libs/pbd/pbd/event_loop.h +++ b/libs/pbd/pbd/event_loop.h @@ -33,7 +33,34 @@ class EventLoop EventLoop() {} virtual ~EventLoop() {} - virtual void call_slot (const boost::function<void()>&) = 0; + enum RequestType { + range_guarantee = ~0 + }; + + struct BaseRequestObject; + + struct InvalidationRecord { + BaseRequestObject* request; + PBD::EventLoop* event_loop; + const char* file; + int line; + + InvalidationRecord() : request (0), event_loop (0) {} + }; + + static void* invalidate_request (void* data); + + struct BaseRequestObject { + RequestType type; + bool valid; + InvalidationRecord* invalidation; + boost::function<void()> the_slot; + + BaseRequestObject() : valid (true), invalidation (0) {} + }; + + virtual void call_slot (InvalidationRecord*, const boost::function<void()>&) = 0; + virtual Glib::Mutex& slot_invalidation_mutex() = 0; static EventLoop* get_event_loop_for_thread(); static void set_event_loop_for_thread (EventLoop* ui); @@ -45,4 +72,6 @@ class EventLoop } +#define MISSING_INVALIDATOR 0 // used to mark places where we fail to provide an invalidator + #endif /* __pbd_event_loop_h__ */ |