vici: Ensure we have no active users before mangling event client registrations
This commit is contained in:
@@ -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, ¤t))
|
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, ¤t))
|
||||||
|
{
|
||||||
|
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, ¤t))
|
while (ids->enumerate(ids, ¤t))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user