1
0
mirror of https://gitlab.xiph.org/xiph/icecast-server.git synced 2024-09-29 04:25:55 -04:00

fix small memory leak when slave hosts are used. fixes to the stats updates when

streams shut down. expand on the trigger for a relay change

svn path=/icecast/branches/kh/icecast/; revision=8129
This commit is contained in:
Karl Heyes 2004-10-28 19:21:52 +00:00
parent 5d18bcd4f2
commit 9afaadd371

View File

@ -61,6 +61,7 @@
static void *_slave_thread(void *arg);
static void _add_slave_host (const char *server, int port);
static slave_host *find_slave_host (const char *server, int port);
static thread_type *_slave_thread_id;
static int slave_running = 0;
@ -99,6 +100,8 @@ relay_server *relay_copy (relay_server *r)
copy->port = r->port;
copy->mp3metadata = r->mp3metadata;
copy->on_demand = r->on_demand;
copy->source = r->source;
r->source = NULL;
}
return copy;
}
@ -364,8 +367,8 @@ static void check_relay_stream (relay_server *relay)
DEBUG0 ("setting on_demand");
}
/* on-demand relays can be used as fallback mounts so allow
* for dependant mountpoints to show up on xsl pages*/
source_recheck_mounts ();
* for dependant mountpoints to show up on xsl pages */
update_settings = 1;
}
else
WARN1 ("new relay but source \"%s\" already exists", relay->localmount);
@ -399,7 +402,7 @@ static void check_relay_stream (relay_server *relay)
return;
} while (0);
/* the relay thread may of close down */
/* the relay thread may of shut down itself */
if (relay->cleanup && relay->thread)
{
ice_config_t *config;
@ -410,14 +413,37 @@ static void check_relay_stream (relay_server *relay)
relay->running = 0;
relay->source->on_demand = relay->on_demand;
config = config_get_config ();
source_update_settings (config, relay->source);
config_release_config ();
stats_event (relay->localmount, "listeners", "0");
source_recheck_mounts ();
if (relay->on_demand)
{
config = config_get_config ();
source_update_settings (config, relay->source);
config_release_config ();
stats_event (relay->localmount, "listeners", "0");
}
update_settings = 1;
}
}
/* return 1 if the relay needs to be restarted */
static int relay_has_changed (relay_server *new, relay_server *old)
{
do
{
if (strcmp (new->mount, old->mount) != 0)
break;
if (strcmp (new->server, old->server) != 0)
break;
if (new->mp3metadata != old->mp3metadata)
break;
if (new->port != old->port)
break;
if (new->on_demand != old->on_demand)
old->on_demand = new->on_demand;
return 0;
} while (0);
return 1;
}
/* go through updated looking for relays that are different configured. The
* returned list contains relays that should be kept running, current contains
@ -432,29 +458,30 @@ update_relay_set (relay_server **current, relay_server *updated)
while (relay)
{
existing_relay = *current;
existing_p = current;
existing_relay = *current;
existing_p = current;
while (existing_relay)
{
/* break out if keeping relay */
if (strcmp (relay->localmount, existing_relay->localmount) == 0)
break;
existing_p = &existing_relay->next;
existing_relay = existing_relay->next;
}
if (existing_relay == NULL)
{
/* new one, copy and insert */
existing_relay = relay_copy (relay);
}
else
{
*existing_p = existing_relay->next;
}
existing_relay->next = new_list;
new_list = existing_relay;
relay = relay->next;
while (existing_relay)
{
/* break out if keeping relay */
if (strcmp (relay->localmount, existing_relay->localmount) == 0)
if (relay_has_changed (relay, existing_relay) == 0)
break;
existing_p = &existing_relay->next;
existing_relay = existing_relay->next;
}
if (existing_relay == NULL)
{
/* new one, copy and insert */
existing_relay = relay_copy (relay);
}
else
{
*existing_p = existing_relay->next;
}
existing_relay->next = new_list;
new_list = existing_relay;
relay = relay->next;
}
return new_list;
}
@ -487,13 +514,14 @@ static void relay_check_streams (relay_server *to_start, relay_server *to_free)
{
if (to_free->running && to_free->source)
{
/* relay has been removed from xml, shut down active relay */
DEBUG1 ("source shutdown request on \"%s\"", to_free->localmount);
to_free->source->running = 0;
thread_join (to_free->thread);
update_settings = 1;
}
/* relay is going, drop its stats */
stats_event (to_free->localmount, NULL, NULL);
update_settings = 1;
else
stats_event (to_free->localmount, NULL, NULL);
to_free = relay_free (to_free);
}
@ -619,24 +647,15 @@ static int update_from_master(ice_config_t *config)
static void update_master_as_slave (ice_config_t *config)
{
char *str;
slave_host *slave;
if (config->master_server == NULL || config->master_redirect_port == 0)
return;
str = strdup (config->master_server);
slave = calloc (1, sizeof(slave_host));
if (slave && str)
{
slave->server = str;
slave->port = config->master_server_port;
thread_rwlock_wlock (&slaves_lock);
thread_rwlock_wlock (&slaves_lock);
DEBUG1 ("redirect port is %d", config->master_redirect_port);
if (find_slave_host (config->master_server,
config->master_server_port) == NULL)
_add_slave_host (config->master_server, config->master_server_port);
thread_rwlock_unlock (&slaves_lock);
return;
}
free (str);
free (slave);
thread_rwlock_unlock (&slaves_lock);
}
@ -771,21 +790,28 @@ void slave_host_add (client_t *client, const char *header)
*separator = '\0';
port = atoi (separator+1);
thread_rwlock_wlock (&slaves_lock);
slave = global.slaves;
slave = find_slave_host (server, port);
if (slave)
{
slave->count++;
DEBUG0 ("already exists, increasing count");
}
else
_add_slave_host (server, port);
thread_rwlock_unlock (&slaves_lock);
free (server);
}
static slave_host *find_slave_host (const char *server, int port)
{
slave_host *slave = global.slaves;
while (slave)
{
if (strcmp (slave->server, server) == 0 && slave->port == port)
{
slave->count++;
DEBUG0 ("already exists, increasing count");
break;
}
slave = slave->next;
}
if (slave == NULL)
_add_slave_host (server, port);
free (server);
thread_rwlock_unlock (&slaves_lock);
return slave;
}
static void _add_slave_host (const char *server, int port)