Allow cross-thread request invalidators to cope with multiple requests

being logged before they are handled, and to invalidate them all rather
than just the last one.  Fixes shutdown problems when the PortMatrix has
been opened during the session, during which PortRegisteredOrUnregistered
is emitted quite heavily.


git-svn-id: svn://localhost/ardour2/branches/3.0@6852 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2010-04-03 00:42:39 +00:00
parent f14a33e492
commit 8a8552c4cb
3 changed files with 17 additions and 23 deletions

View file

@ -29,21 +29,15 @@ EventLoop::invalidate_request (void* data)
InvalidationRecord* ir = (InvalidationRecord*) data; InvalidationRecord* ir = (InvalidationRecord*) data;
if (ir->event_loop) { if (ir->event_loop) {
Glib::Mutex::Lock lm (ir->event_loop->slot_invalidation_mutex()); Glib::Mutex::Lock lm (ir->event_loop->slot_invalidation_mutex());
if (ir->request) { for (list<BaseRequestObject*>::iterator i = ir->requests.begin(); i != ir->requests.end(); ++i) {
cerr << "Object deleted had outstanding event loop request, IR created @ " cerr << "Object deleted had outstanding event loop request, IR created @ "
<< ir->file << ':' << ir->line << ir->file << ':' << ir->line
<< endl; << endl;
ir->request->valid = false; (*i)->valid = false;
ir->request->invalidation = 0; (*i)->invalidation = 0;
} else { }
cerr << "No queued request associated with object deletion from " delete ir;
<< ir->file << ':' << ir->line
<< endl;
}
delete ir;
} }
return 0; return 0;

View file

@ -105,7 +105,7 @@ AbstractUI<RequestObject>::handle_ui_requests ()
do_request (vec.buf[0]); do_request (vec.buf[0]);
request_buffer_map_lock.lock (); request_buffer_map_lock.lock ();
if (vec.buf[0]->invalidation) { if (vec.buf[0]->invalidation) {
vec.buf[0]->invalidation->request = 0; vec.buf[0]->invalidation->requests.remove (vec.buf[0]);
} }
i->second->increment_read_ptr (1); i->second->increment_read_ptr (1);
} }
@ -141,7 +141,7 @@ AbstractUI<RequestObject>::handle_ui_requests ()
*/ */
if (req->invalidation) { if (req->invalidation) {
req->invalidation->request = 0; req->invalidation->requests.remove (req);
} }
request_buffer_map_lock.unlock (); request_buffer_map_lock.unlock ();
@ -200,7 +200,7 @@ AbstractUI<RequestObject>::call_slot (InvalidationRecord* invalidation, const bo
req->invalidation = invalidation; req->invalidation = invalidation;
if (invalidation) { if (invalidation) {
invalidation->request = req; invalidation->requests.push_back (req);
invalidation->event_loop = this; invalidation->event_loop = this;
} }

View file

@ -40,12 +40,12 @@ class EventLoop
struct BaseRequestObject; struct BaseRequestObject;
struct InvalidationRecord { struct InvalidationRecord {
BaseRequestObject* request; std::list<BaseRequestObject*> requests;
PBD::EventLoop* event_loop; PBD::EventLoop* event_loop;
const char* file; const char* file;
int line; int line;
InvalidationRecord() : request (0), event_loop (0) {} InvalidationRecord() : event_loop (0) {}
}; };
static void* invalidate_request (void* data); static void* invalidate_request (void* data);