
On 02/06/2012 07:59 AM, Michal Privoznik wrote:
Running git bisect showed it was caused by c700613b8d463212d142c97108b7a2352e23e559. However, I think it only exposed the design problem we are facing here.
IMHO problem is when an application tries to call virConnectOpen() (or virConnectOpenAuth()) from two concurrent threads. This is what will happen:
1st thread: call virConnectOpen(); global variable @initialized == zero; thus virInitialize() is called, error object is set up (via virErrorInitialize()) which is thread local variable. However, @initialized is set to 1 in the first place.
2nd thread: call virConnectOpen() as well; @initialized is already set, therefore no thread local variable is set and any error report will fail.
Ouch - I agree with your analysis of a thread-safety issue. I think we can fix it by making virInitialize() delegate most of its work to a virOnce() initialization function. -- Eric Blake eblake@redhat.com +1-919-301-3266 Libvirt virtualization library http://libvirt.org