[asterisk-commits] rizzo: trunk r48067 - /trunk/main/http.c
asterisk-commits at lists.digium.com
asterisk-commits at lists.digium.com
Mon Nov 27 12:19:49 MST 2006
Author: rizzo
Date: Mon Nov 27 13:19:48 2006
New Revision: 48067
URL: http://svn.digium.com/view/asterisk?view=rev&rev=48067
Log:
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.
Modified:
trunk/main/http.c
Modified: trunk/main/http.c
URL: http://svn.digium.com/view/asterisk/trunk/main/http.c?view=diff&rev=48067&r1=48066&r2=48067
==============================================================================
--- trunk/main/http.c (original)
+++ trunk/main/http.c Mon Nov 27 13:19:48 2006
@@ -92,6 +92,7 @@
SSL *ssl; /* ssl state */
#endif
struct sockaddr_in requestor;
+ struct server_args *parent;
};
/*!
@@ -483,14 +484,14 @@
}
#endif /* DO_SSL */
-static void *httpd_helper_thread(void *data)
-{
- char buf[4096];
- char cookie[4096];
+/*!
+ * 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)
+{
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 @@
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 @@
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);
More information about the asterisk-commits
mailing list