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
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;
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);
}
*/
if (req->invalidation) {
- req->invalidation->request = 0;
+ req->invalidation->requests.remove (req);
}
request_buffer_map_lock.unlock ();
req->invalidation = invalidation;
if (invalidation) {
- invalidation->request = req;
+ invalidation->requests.push_back (req);
invalidation->event_loop = this;
}
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);