[asterisk-commits] russell: branch 1.4 r48931 -
/branches/1.4/main/http.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Sat Dec 23 13:22:52 MST 2006
Author: russell
Date: Sat Dec 23 14:22:52 2006
New Revision: 48931
URL: http://svn.digium.com/view/asterisk?view=rev&rev=48931
Log:
Implement locking for the list of URI handlers to make it thread-safe.
Modified:
branches/1.4/main/http.c
Modified: branches/1.4/main/http.c
URL: http://svn.digium.com/view/asterisk/branches/1.4/main/http.c?view=diff&rev=48931&r1=48930&r2=48931
==============================================================================
--- branches/1.4/main/http.c (original)
+++ branches/1.4/main/http.c Sat Dec 23 14:22:52 2006
@@ -64,7 +64,8 @@
ast_http_callback callback;
};
-static struct ast_http_uri *uris;
+AST_MUTEX_DEFINE_STATIC(uris_lock);
+static struct ast_http_uri *uris = NULL;
static int httpfd = -1;
static pthread_t master = AST_PTHREADT_NULL;
@@ -241,7 +242,10 @@
int ast_http_uri_link(struct ast_http_uri *urih)
{
- struct ast_http_uri *prev=uris;
+ struct ast_http_uri *prev;
+
+ ast_mutex_lock(&uris_lock);
+ prev = uris;
if (!uris || strlen(uris->uri) <= strlen(urih->uri)) {
urih->next = uris;
uris = urih;
@@ -252,14 +256,21 @@
urih->next = prev->next;
prev->next = urih;
}
+ ast_mutex_unlock(&uris_lock);
+
return 0;
}
void ast_http_uri_unlink(struct ast_http_uri *urih)
{
- struct ast_http_uri *prev = uris;
- if (!uris)
+ struct ast_http_uri *prev;
+
+ ast_mutex_lock(&uris_lock);
+ if (!uris) {
+ ast_mutex_unlock(&uris_lock);
return;
+ }
+ prev = uris;
if (uris == urih) {
uris = uris->next;
}
@@ -270,6 +281,7 @@
}
prev = prev->next;
}
+ ast_mutex_unlock(&uris_lock);
}
static char *handle_uri(struct sockaddr_in *sin, char *uri, int *status, char **title, int *contentlength, struct ast_variable **cookies)
@@ -317,6 +329,7 @@
if (!*uri || (*uri == '/')) {
if (*uri == '/')
uri++;
+ ast_mutex_lock(&uris_lock);
urih = uris;
while(urih) {
len = strlen(urih->uri);
@@ -333,10 +346,13 @@
}
urih = urih->next;
}
+ if (!urih)
+ ast_mutex_unlock(&uris_lock);
}
}
if (urih) {
c = urih->callback(sin, uri, vars, status, title, contentlength);
+ ast_mutex_unlock(&uris_lock);
} else if (ast_strlen_zero(uri) && ast_strlen_zero(prefix)) {
/* Special case: If no prefix, and no URI, send to /static/index.html */
c = ast_http_error(302, "Moved Temporarily", "Location: /static/index.html\r\n", "This is not the page you are looking for...");
@@ -672,6 +688,7 @@
else
ast_cli(fd, "Server Disabled\n\n");
ast_cli(fd, "Enabled URI's:\n");
+ ast_mutex_lock(&uris_lock);
urih = uris;
while(urih){
ast_cli(fd, "%s/%s%s => %s\n", prefix, urih->uri, (urih->has_subtree ? "/..." : "" ), urih->description);
@@ -679,6 +696,7 @@
}
if (!uris)
ast_cli(fd, "None.\n");
+ ast_mutex_unlock(&uris_lock);
return RESULT_SUCCESS;
}
More information about the asterisk-commits
mailing list