From 3637b60b19f61ac1bab1d096621c8c2f89b227f8 Mon Sep 17 00:00:00 2001 From: Luigi Rizzo <rizzo@icir.org> Date: Mon, 27 Nov 2006 19:19:48 +0000 Subject: [PATCH] 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: https://origsvn.digium.com/svn/asterisk/trunk@48067 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/http.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/main/http.c b/main/http.c index f7e5fb5baf..da8c3afdb7 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); -- GitLab