
On Wed, Oct 15, 2008 at 04:26:40PM -0400, Ben Guthro wrote:
I've been off implementing all of these changes, and I came across a point I would like to discuss, and get your opinion on.
...
In fat I think this scheme ought to let you do away with the mutex locking completely. The contract for virConnectPtr dictates that you are forbidden to use a single virConnectPtr object from more than one thread at once, so if we're queueing & dispatching events from and timeout handler, we shouldn't ever get a reentrancy/locking problem.
We potentially have a race condition for pulling data off the wire by the following functions:
call() remoteDomainEventFired()
These 2 functions lock on not the connection lock, but the private_data->lock.
Since the remoteDomainEventFired() is called from a client app via HandleImpl - it has no knowledge of that the opaque pointer being passed is a conn.
There is nothing constraining the EventImpl from making a callback while using a conn ptr in another thread.
So - if that callback happens concurrent with an explicit use of the conn ptr bad things will happen.
Our threading rule is that a single virConnectPtr must only ever be used one from thread. So if the application which registers for async events knows that it will be using the connection from a different thread than the main loop, it is supposed to open a 2nd virConnectPtr object to deal with this. This is a slightly tedious restriction to have, but I don't see a way around it other than explicitly doing the work to make it safe for a single virConnectPtr to be used from many threads. This woud thread that we add explicit locking into all the internal drivers. The work I'm doing to make QEMU / libvirtd properly threaded is a step towards this possibility, though not sufficient on its own. So if I'm understanding your scenario I think we can just document that its the app's responsibility to ensure the event loop isn't running in a separate thread from the code doing synchronous method calls. Even without events, apps like virt-manager have to handle this todo allow things like save/restore to be done in background safely. Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|