[libvirt] 'make check' hangs
Jiri Denemark
jdenemar at redhat.com
Wed Nov 30 13:41:53 UTC 2011
On Wed, Nov 30, 2011 at 11:54:55 +0000, Daniel P. Berrange wrote:
> On Wed, Nov 30, 2011 at 11:48:16AM +0100, Jiri Denemark wrote:
> static bool
> vshDeinit(vshControl *ctl)
> {
> ctl->quit = true;
> vshReadlineDeinit(ctl);
> vshCloseLogFile(ctl);
> VIR_FREE(ctl->name);
> if (ctl->conn) {
> int ret;
> if ((ret = virConnectClose(ctl->conn)) != 0) {
> vshError(ctl, _("Failed to disconnect from the hypervisor, %d leaked reference(s)"), ret);
> }
> }
> virResetLastError();
>
> if (ctl->eventLoopStarted) {
> /* HACK: Add a dummy timeout to break event loop */
> int timer = virEventAddTimeout(-1, NULL, NULL, NULL);
>
>
> Now look at the event loop thread:
>
> static void
> vshEventLoop(void *opaque)
> {
> vshControl *ctl = opaque;
>
> while (!ctl->quit) {
> if (virEventRunDefaultImpl() < 0) {
> virshReportError(ctl);
> }
> }
> }
>
> Neither the read of ctl->quit, nor the write of ctl->quit are protected
> by any locking. While you have assigned to ctl->quit before adding the
> dummy function, I'm not convinced that is sufficient, because in the
> absence of any thread synchronization point, the compiler is free to
> reorder your assignment to occur later. In addition, the data is not
> neccessarily coherant across threads. IMHO, the read/write of ctl->quit
> needs to be protected by a mutex.
Yeah, you're right. I seem to keep forgetting about this memory barrier "side
effect" of mutexes, which in fact is the only thing we need here :-)
Jirka
More information about the libvir-list
mailing list