[libvirt] [PATCH 2/2] avoid closing monitor twice

Wen Congyang wency at cn.fujitsu.com
Wed Jan 26 01:29:17 UTC 2011


At 01/26/2011 12:46 AM, Eric Blake Write:
> On 01/24/2011 11:57 PM, Wen Congyang wrote:
>> +    if (mon->closed) {
>> +        /* We have closed monitor in other thread. */
>> +        qemuMonitorUnlock(mon);
>> +        return;
>> +    }
>> +
>> +    mon->closed = true;
>> +
>>      if (mon->fd >= 0) {
> 
> Why can't mon->fd >= 0 be the flag of whether close has previously been
> attempted?  After all, once the handle gets removed, VIR_FORCE_CLOSE
> sets mon->fd to -1.

We may call qemuMonitorClose() in the function qemuMonitorOpen() to do
the cleanup when it failed. So we still need to close the monitor if
mon->fd is -1.

> 
>>          if (mon->watch)
>>              virEventRemoveHandle(mon->watch);
> 
> Making qemuMonitorClose() do a short-circuit no-op if we already detect
> that another thread has requested close worries me that we might leak
> the resource (because we are bypassing the reference counter).  Is there
> instead somewhere that we should be temporarily increasing the reference
> counter?

If we open the monitor successfully, we hold 2 refs: one for open, and another
one for watch. So I think that that we only close monitor once may not leak the
resource.

> 
> This patch may be correct as-is, but I'm not sure of it yet.
> 




More information about the libvir-list mailing list