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:
parent
f14a33e492
commit
8a8552c4cb
@ -29,21 +29,15 @@ EventLoop::invalidate_request (void* data)
|
||||
InvalidationRecord* ir = (InvalidationRecord*) data;
|
||||
|
||||
if (ir->event_loop) {
|
||||
Glib::Mutex::Lock lm (ir->event_loop->slot_invalidation_mutex());
|
||||
if (ir->request) {
|
||||
cerr << "Object deleted had outstanding event loop request, IR created @ "
|
||||
<< ir->file << ':' << ir->line
|
||||
<< endl;
|
||||
ir->request->valid = false;
|
||||
ir->request->invalidation = 0;
|
||||
} else {
|
||||
cerr << "No queued request associated with object deletion from "
|
||||
<< ir->file << ':' << ir->line
|
||||
<< endl;
|
||||
|
||||
}
|
||||
|
||||
delete ir;
|
||||
Glib::Mutex::Lock lm (ir->event_loop->slot_invalidation_mutex());
|
||||
for (list<BaseRequestObject*>::iterator i = ir->requests.begin(); i != ir->requests.end(); ++i) {
|
||||
cerr << "Object deleted had outstanding event loop request, IR created @ "
|
||||
<< ir->file << ':' << ir->line
|
||||
<< endl;
|
||||
(*i)->valid = false;
|
||||
(*i)->invalidation = 0;
|
||||
}
|
||||
delete ir;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -105,7 +105,7 @@ AbstractUI<RequestObject>::handle_ui_requests ()
|
||||
do_request (vec.buf[0]);
|
||||
request_buffer_map_lock.lock ();
|
||||
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);
|
||||
}
|
||||
@ -141,7 +141,7 @@ AbstractUI<RequestObject>::handle_ui_requests ()
|
||||
*/
|
||||
|
||||
if (req->invalidation) {
|
||||
req->invalidation->request = 0;
|
||||
req->invalidation->requests.remove (req);
|
||||
}
|
||||
|
||||
request_buffer_map_lock.unlock ();
|
||||
@ -200,7 +200,7 @@ AbstractUI<RequestObject>::call_slot (InvalidationRecord* invalidation, const bo
|
||||
req->invalidation = invalidation;
|
||||
|
||||
if (invalidation) {
|
||||
invalidation->request = req;
|
||||
invalidation->requests.push_back (req);
|
||||
invalidation->event_loop = this;
|
||||
}
|
||||
|
||||
|
@ -40,12 +40,12 @@ class EventLoop
|
||||
struct BaseRequestObject;
|
||||
|
||||
struct InvalidationRecord {
|
||||
BaseRequestObject* request;
|
||||
PBD::EventLoop* event_loop;
|
||||
const char* file;
|
||||
int line;
|
||||
std::list<BaseRequestObject*> requests;
|
||||
PBD::EventLoop* event_loop;
|
||||
const char* file;
|
||||
int line;
|
||||
|
||||
InvalidationRecord() : request (0), event_loop (0) {}
|
||||
InvalidationRecord() : event_loop (0) {}
|
||||
};
|
||||
|
||||
static void* invalidate_request (void* data);
|
||||
|
Loading…
Reference in New Issue
Block a user