[libvirt] [PATCH] events: Propose a separate lock for event queue
Eric Blake
eblake at redhat.com
Tue Oct 11 22:12:56 UTC 2011
On 10/10/2011 05:45 AM, Michal Privoznik wrote:
> Currently, push& pop from event queue (both server& client side)
> rely on lock from higher levels, e.g. on driver lock (qemu),
> private_data (remote), ...; This alone is not sufficient as not
> every function that interacts with this queue can/does lock,
> esp. in client where we have a different approach, "passing
> the buck".
>
> Therefore we need a separate lock just to protect event queue.
>
> For more info see:
> https://bugzilla.redhat.com/show_bug.cgi?id=743817
> ---
> src/conf/domain_event.c | 65 +++++++++++++++++++++++++++++++++++++++++------
> src/conf/domain_event.h | 1 +
> 2 files changed, 58 insertions(+), 8 deletions(-)
I'd feel more comfortable if Dan also reviews, but I'll give it a shot.
>
> diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
> index 3189346..6cc8168 100644
> --- a/src/conf/domain_event.c
> +++ b/src/conf/domain_event.c
> @@ -547,6 +547,24 @@ virDomainEventQueuePtr virDomainEventQueueNew(void)
> return ret;
> }
>
> +static void
> +virDomainEventStateLock(virDomainEventStatePtr state)
> +{
> + if (!state)
> + return;
> +
> + virMutexLock(&state->lock);
Why do these have early returns, implying NULL state is okay...
> @@ -1161,18 +1188,26 @@ void
> virDomainEventStateQueue(virDomainEventStatePtr state,
> virDomainEventPtr event)
> {
> + int count;
> +
> if (state->timer< 0) {
> virDomainEventFree(event);
> return;
> }
>
> + virDomainEventStateLock(state);
> +
> if (virDomainEventQueuePush(state->queue, event)< 0) {
> VIR_DEBUG("Error adding event to queue");
> virDomainEventFree(event);
> }
>
> - if (state->queue->count == 1)
> + count = state->queue->count;
> + virDomainEventStateUnlock(state);
...even though uses like this blindly assume that state is non-NULL?
One of the two places is wrong (I'd argue that the lock/unlock functions
should be ATTRIBUTE_NONNULL(1), since it looks like all callers avoid
passing NULL).
Beyond that, looks okay to me.
--
Eric Blake eblake at redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
More information about the libvir-list
mailing list