unsigned long long length;
int watch;
- unsigned int cbRemoved;
- unsigned int dispatching;
+ bool cbRemoved;
+ bool dispatching;
+ bool closed;
virStreamEventCallback cb;
void *opaque;
virFreeCallback ff;
virEventRemoveHandle(fdst->watch);
if (fdst->dispatching)
- fdst->cbRemoved = 1;
+ fdst->cbRemoved = true;
else if (fdst->ff)
(fdst->ff)(fdst->opaque);
virStreamEventCallback cb;
void *cbopaque;
virFreeCallback ff;
+ bool closed;
if (!fdst)
return;
cb = fdst->cb;
cbopaque = fdst->opaque;
ff = fdst->ff;
- fdst->dispatching = 1;
+ fdst->dispatching = true;
virMutexUnlock(&fdst->lock);
cb(stream, events, cbopaque);
virMutexLock(&fdst->lock);
- fdst->dispatching = 0;
+ fdst->dispatching = false;
if (fdst->cbRemoved && ff)
(ff)(cbopaque);
+ closed = fdst->closed;
virMutexUnlock(&fdst->lock);
+
+ if (closed) {
+ virMutexDestroy(&fdst->lock);
+ VIR_FREE(fdst);
+ }
}
static int
goto cleanup;
}
- fdst->cbRemoved = 0;
+ fdst->cbRemoved = false;
fdst->cb = cb;
fdst->opaque = opaque;
fdst->ff = ff;
ret = -1;
}
virCommandFree(fdst->cmd);
+ fdst->cmd = NULL;
}
-
st->privateData = NULL;
- virMutexUnlock(&fdst->lock);
- virMutexDestroy(&fdst->lock);
- VIR_FREE(fdst);
+ if (fdst->dispatching) {
+ fdst->closed = true;
+ virMutexUnlock(&fdst->lock);
+ } else {
+ virMutexUnlock(&fdst->lock);
+ virMutexDestroy(&fdst->lock);
+ VIR_FREE(fdst);
+ }
return ret;
}