Commit 83b41e2b authored by Michael Smith's avatar Michael Smith

Fix previous changes to source creation - misunderstood requirements for

unlocking rwlocks. Move more checks and some other logic into source.c

svn path=/trunk/icecast/; revision=4354
parent 469ac14e
......@@ -296,7 +296,6 @@ static connection_t *_get_connection(void)
int connection_create_source(client_t *client, connection_t *con, http_parser_t *parser, char *mount) {
source_t *source;
char *contenttype;
int bytes;
/* check to make sure this source wouldn't
** be over the limit
......@@ -328,25 +327,7 @@ int connection_create_source(client_t *client, connection_t *con, http_parser_t
source = source_create(client, con, parser, mount, format);
}
/* We did a preliminary check earlier, to catch the common case before
* we do any unneccesary processing. Now, we do a check that must be
* correct - so we have to take a write lock out, since we need to
* add this source if it doesn't already exist.
*/
avl_tree_wlock(global.source_tree);
if (source_find_mount(mount) != NULL) {
INFO1("Source tried to log in as %s, but mountpoint is already used",
mount);
avl_tree_unlock(global.source_tree);
goto fail;
}
/* Keep the tree locked - it gets unlocked in source_main */
client->respcode = 200;
bytes = sock_write(client->con->sock,
"HTTP/1.0 200 OK\r\n\r\n");
if(bytes > 0) client->con->sent_bytes = bytes;
source->send_return = 1;
source->shutdown_rwlock = &_source_shutdown_rwlock;
sock_set_blocking(con->sock, SOCK_NONBLOCK);
thread_create("Source Thread", source_main, (void *)source, THREAD_DETACHED);
......
......@@ -56,6 +56,7 @@ source_t *source_create(client_t *client, connection_t *con, http_parser_t *pars
src->running = 1;
src->num_yp_directories = 0;
src->listeners = 0;
src->send_return = 0;
for (i=0;i<config_get_config()->num_yp_directories;i++) {
if (config_get_config()->yp_url[i]) {
src->ypdata[src->num_yp_directories] = yp_create_ypdata();
......@@ -157,13 +158,32 @@ void *source_main(void *arg)
/* grab a read lock, to make sure we get a chance to cleanup */
thread_rwlock_rlock(source->shutdown_rwlock);
/* The caller has ensured we have a write lock on the tree... */
avl_tree_wlock(global.source_tree);
/* Now, we must do a final check with write lock taken out that the
* mountpoint is available..
*/
if (source_find_mount(source->mount) != NULL) {
avl_tree_unlock(global.source_tree);
if(source->send_return) {
client_send_404(source->client, "Mountpoint in use");
}
thread_exit(0);
return NULL;
}
/* insert source onto source tree */
avl_insert(global.source_tree, (void *)source);
/* release write lock on global source tree */
avl_tree_unlock(global.source_tree);
/* If we connected successfully, we can send the message (if requested)
* back
*/
if(source->send_return) {
source->client->respcode = 200;
bytes = sock_write(source->client->con->sock,
"HTTP/1.0 200 OK\r\n\r\n");
if(bytes > 0) source->client->con->sent_bytes = bytes;
}
/* start off the statistics */
stats_event(source->mount, "listeners", "0");
......
......@@ -30,6 +30,7 @@ typedef struct source_tag
int num_yp_directories;
long listeners;
long max_listeners;
int send_return;
} source_t;
source_t *source_create(client_t *client, connection_t *con, http_parser_t *parser, const char *mount, format_type_t type);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment