1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-09-22 04:15:54 -04:00

fix case of global listeners count becoming out of sync. It is possible that

connecting listeners will disconnect before any processing is done on them.

svn path=/icecast/trunk/icecast/; revision=16254
This commit is contained in:
Karl Heyes 2009-07-10 15:08:30 +00:00
parent 44c05662c7
commit 74e11b7194
2 changed files with 25 additions and 7 deletions

View File

@ -193,6 +193,8 @@ int source_compare_sources(void *arg, void *a, void *b)
void source_clear_source (source_t *source)
{
int c;
DEBUG1 ("clearing source \"%s\"", source->mount);
avl_tree_wlock (source->pending_tree);
@ -212,15 +214,26 @@ void source_clear_source (source_t *source)
source->dumpfile = NULL;
}
if (source->listeners)
stats_event_sub (NULL, "listeners", source->listeners);
/* lets kick off any clients that are left on here */
avl_tree_wlock (source->client_tree);
while (avl_get_first (source->client_tree))
c=0;
while (1)
{
avl_delete (source->client_tree,
avl_get_first (source->client_tree)->key, _free_client);
avl_node *node = avl_get_first (source->client_tree);
if (node)
{
client_t *client = node->key;
if (client->respcode == 200)
c++; /* only count clients that have had some processing */
avl_delete (source->client_tree, client, _free_client);
continue;
}
break;
}
if (c)
{
stats_event_sub (NULL, "listeners", source->listeners);
INFO2 ("%d active listeners on %s released", c, source->mount);
}
avl_tree_unlock (source->client_tree);
@ -722,9 +735,10 @@ void source_main (source_t *source)
if (client->con->error) {
client_node = avl_get_next(client_node);
if (client->respcode == 200)
stats_event_dec (NULL, "listeners");
avl_delete(source->client_tree, (void *)client, _free_client);
source->listeners--;
stats_event_dec (NULL, "listeners");
DEBUG0("Client removed");
continue;
}

View File

@ -458,7 +458,11 @@ static void modify_node_event (stats_node_t *node, stats_event_t *event)
case STATS_EVENT_ADD:
value = atoi (node->value)+atoi (event->value);
break;
case STATS_EVENT_SUB:
value = atoll (node->value) - atoll (event->value);
break;
default:
WARN2 ("unhandled event (%d) for %s", event->action, event->source);
break;
}
str = malloc (16);