diff options
author | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-11-27 19:19:48 +0000 |
---|---|---|
committer | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-11-27 19:19:48 +0000 |
commit | 3a0d25f9f850cbb08a9945b52d50b7526c21fc26 (patch) | |
tree | 60d0cf4b5a960ac8334e8ac4cab0aba54f83969f /main/http.c | |
parent | b728b58d5ad3c930f52f8858abbf1c1a368536bd (diff) |
in the helper thread, separate the FILE * creation from the actual
function doing work on the socket. This is another generalization
to provide a generic mechanism to open TCP/TLS socket with a thread
managing the accpet and children threads managing the individual
sessions.
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@48067 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/http.c')
-rw-r--r-- | main/http.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/main/http.c b/main/http.c index f7e5fb5ba..da8c3afdb 100644 --- a/main/http.c +++ b/main/http.c @@ -92,6 +92,7 @@ struct server_instance { SSL *ssl; /* ssl state */ #endif struct sockaddr_in requestor; + struct server_args *parent; }; /*! @@ -483,14 +484,14 @@ static int ssl_close(void *cookie) } #endif /* DO_SSL */ -static void *httpd_helper_thread(void *data) +/*! + * creates a FILE * from the fd passed by the accept thread. + * This operation is potentially expensive (certificate verification), + * so we do it in the child thread context. + */ +static void *make_file_from_fd(void *data) { - char buf[4096]; - char cookie[4096]; struct server_instance *ser = data; - struct ast_variable *var, *prev=NULL, *vars=NULL; - char *uri, *c, *title=NULL; - int status = 200, contentlength = 0; /* * open a FILE * as appropriate. @@ -523,8 +524,20 @@ static void *httpd_helper_thread(void *data) if (!ser->f) { close(ser->fd); ast_log(LOG_WARNING, "FILE * open failed!\n"); - goto done; + free(ser); + return NULL; } + return ser->parent->worker_fn(ser); +} + +static void *httpd_helper_thread(void *data) +{ + char buf[4096]; + char cookie[4096]; + struct server_instance *ser = data; + struct ast_variable *var, *prev=NULL, *vars=NULL; + char *uri, *c, *title=NULL; + int status = 200, contentlength = 0; if (!fgets(buf, sizeof(buf), ser->f)) goto done; @@ -674,12 +687,13 @@ static void *http_root(void *data) fcntl(fd, F_SETFL, flags & ~O_NONBLOCK); ser->fd = fd; ser->is_ssl = desc->is_ssl; + ser->parent = desc; memcpy(&ser->requestor, &sin, sizeof(ser->requestor)); pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - if (ast_pthread_create_background(&launched, &attr, desc->worker_fn, ser)) { + if (ast_pthread_create_background(&launched, &attr, make_file_from_fd, ser)) { ast_log(LOG_WARNING, "Unable to launch helper thread: %s\n", strerror(errno)); close(ser->fd); free(ser); |