vici: Ensure we have no active users before mangling event client registrations

This commit is contained in:
Martin Willi
2014-05-07 14:13:38 +02:00
parent 65cc8f5581
commit 374511c52c
+37 -15
View File
@@ -129,10 +129,19 @@ static void register_event(private_vici_dispatcher_t *this, char *name,
event_t *event; event_t *event;
this->mutex->lock(this->mutex); this->mutex->lock(this->mutex);
event = this->events->get(this->events, name); while (TRUE)
if (event)
{ {
array_insert(event->clients, ARRAY_TAIL, &id); event = this->events->get(this->events, name);
if (!event)
{
break;
}
if (!event->uses)
{
array_insert(event->clients, ARRAY_TAIL, &id);
break;
}
this->cond->wait(this->cond, this->mutex);
} }
this->mutex->unlock(this->mutex); this->mutex->unlock(this->mutex);
@@ -160,20 +169,29 @@ static void unregister_event(private_vici_dispatcher_t *this, char *name,
bool found = FALSE; bool found = FALSE;
this->mutex->lock(this->mutex); this->mutex->lock(this->mutex);
event = this->events->get(this->events, name); while (TRUE)
if (event)
{ {
enumerator = array_create_enumerator(event->clients); event = this->events->get(this->events, name);
while (enumerator->enumerate(enumerator, &current)) if (!event)
{ {
if (*current == id) break;
{
array_remove_at(event->clients, enumerator);
found = TRUE;
break;
}
} }
enumerator->destroy(enumerator); if (!event->uses)
{
enumerator = array_create_enumerator(event->clients);
while (enumerator->enumerate(enumerator, &current))
{
if (*current == id)
{
array_remove_at(event->clients, enumerator);
found = TRUE;
break;
}
}
enumerator->destroy(enumerator);
break;
}
this->cond->wait(this->cond, this->mutex);
} }
this->mutex->unlock(this->mutex); this->mutex->unlock(this->mutex);
@@ -340,11 +358,15 @@ CALLBACK(disconnect, void,
event_t *event; event_t *event;
u_int *current; u_int *current;
/* deregister all clients */ /* deregister client from all events */
this->mutex->lock(this->mutex); this->mutex->lock(this->mutex);
events = this->events->create_enumerator(this->events); events = this->events->create_enumerator(this->events);
while (events->enumerate(events, NULL, &event)) while (events->enumerate(events, NULL, &event))
{ {
while (event->uses)
{
this->cond->wait(this->cond, this->mutex);
}
ids = array_create_enumerator(event->clients); ids = array_create_enumerator(event->clients);
while (ids->enumerate(ids, &current)) while (ids->enumerate(ids, &current))
{ {