From 77845f601912c0237fb40a19d401ca64bac542b1 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Wed, 14 Dec 2016 22:19:33 +0100 Subject: Atomically to invalidate request Yet another slightly overkill approach, but it /may/ explain crashes. --- libs/pbd/pbd/abstract_ui.cc | 6 +++--- libs/pbd/pbd/event_loop.h | 14 +++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) (limited to 'libs/pbd/pbd') diff --git a/libs/pbd/pbd/abstract_ui.cc b/libs/pbd/pbd/abstract_ui.cc index 330e6ddc59..db63c3f96d 100644 --- a/libs/pbd/pbd/abstract_ui.cc +++ b/libs/pbd/pbd/abstract_ui.cc @@ -168,7 +168,7 @@ AbstractUI::get_request (RequestType rt) DEBUG_TRACE (PBD::DEBUG::AbstractUI, string_compose ("%1: allocated per-thread request of type %2, caller %3\n", event_loop_name(), rt, pthread_name())); vec.buf[0]->type = rt; - vec.buf[0]->valid = true; + vec.buf[0]->validate (); return vec.buf[0]; } @@ -218,7 +218,7 @@ AbstractUI::handle_ui_requests () if (vec.len[0] == 0) { break; } else { - if (vec.buf[0]->valid) { + if (vec.buf[0]->valid ()) { /* We first need to remove the event from the list. * If the event results in object destruction, PBD::EventLoop::invalidate_request * will delete the invalidation record (aka buf[0]), so we cannot use it after calling do_request @@ -327,7 +327,7 @@ AbstractUI::handle_ui_requests () } } - if (!req->valid) { + if (!req->valid ()) { DEBUG_TRACE (PBD::DEBUG::AbstractUI, string_compose ("%1/%2 handling invalid heap request, type %3, deleting\n", event_loop_name(), pthread_name(), req->type)); delete req; continue; diff --git a/libs/pbd/pbd/event_loop.h b/libs/pbd/pbd/event_loop.h index f7765cb792..ce2040084c 100644 --- a/libs/pbd/pbd/event_loop.h +++ b/libs/pbd/pbd/event_loop.h @@ -67,12 +67,16 @@ class LIBPBD_API EventLoop static void* invalidate_request (void* data); struct BaseRequestObject { - RequestType type; - bool valid; - InvalidationRecord* invalidation; - boost::function the_slot; + RequestType type; + gint _valid; + InvalidationRecord* invalidation; + boost::function the_slot; - BaseRequestObject() : valid (true), invalidation (0) {} + BaseRequestObject() : _valid (0), invalidation (0) {} + + void validate () { g_atomic_int_set (&_valid, 1); } + void invalidate () { g_atomic_int_set (&_valid, 0); } + bool valid () { return g_atomic_int_get (&_valid) == 1; } }; virtual void call_slot (InvalidationRecord*, const boost::function&) = 0; -- cgit v1.2.3