aboutsummaryrefslogtreecommitdiff
path: root/src/daemon
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2009-03-17 07:34:32 +0000
committerChristian Grothoff <christian@grothoff.org>2009-03-17 07:34:32 +0000
commite9128f7887291e9239e380d250960580463d157b (patch)
treeabc2a8b962d9016b49fe3de9596e45b7859ed917 /src/daemon
parentd2630b7e6970c4a67c4e914e4f426f7da0f51c29 (diff)
downloadlibmicrohttpd-e9128f7887291e9239e380d250960580463d157b.tar.gz
libmicrohttpd-e9128f7887291e9239e380d250960580463d157b.zip
various bugfixes and docu updates
Diffstat (limited to 'src/daemon')
-rw-r--r--src/daemon/daemon.c83
-rw-r--r--src/daemon/internal.h2
2 files changed, 39 insertions, 46 deletions
diff --git a/src/daemon/daemon.c b/src/daemon/daemon.c
index 18775c46..ab829847 100644
--- a/src/daemon/daemon.c
+++ b/src/daemon/daemon.c
@@ -1138,6 +1138,7 @@ MHD_start_daemon_va (unsigned int options,
1138 FPRINTF (stderr, 1138 FPRINTF (stderr,
1139 "MHD thread pooling only works with MHD_USE_SELECT_INTERNALLY\n"); 1139 "MHD thread pooling only works with MHD_USE_SELECT_INTERNALLY\n");
1140#endif 1140#endif
1141 free (retVal);
1141 return NULL; 1142 return NULL;
1142 } 1143 }
1143 1144
@@ -1252,7 +1253,7 @@ MHD_start_daemon_va (unsigned int options,
1252 if (((0 != (options & MHD_USE_THREAD_PER_CONNECTION)) || 1253 if (((0 != (options & MHD_USE_THREAD_PER_CONNECTION)) ||
1253 ((0 != (options & MHD_USE_SELECT_INTERNALLY)) 1254 ((0 != (options & MHD_USE_SELECT_INTERNALLY))
1254 && (0 == retVal->worker_pool_size))) 1255 && (0 == retVal->worker_pool_size)))
1255 && (0 != 1256 && (0 !=
1256 pthread_create (&retVal->pid, NULL, &MHD_select_thread, retVal))) 1257 pthread_create (&retVal->pid, NULL, &MHD_select_thread, retVal)))
1257 { 1258 {
1258#if HAVE_MESSAGES 1259#if HAVE_MESSAGES
@@ -1274,28 +1275,23 @@ MHD_start_daemon_va (unsigned int options,
1274 unsigned int leftover_conns = retVal->max_connections 1275 unsigned int leftover_conns = retVal->max_connections
1275 % retVal->worker_pool_size; 1276 % retVal->worker_pool_size;
1276 1277
1278 i = 0; /* we need this in case malloc fails */
1277 /* Allocate memory for pooled objects */ 1279 /* Allocate memory for pooled objects */
1278 retVal->worker_pool = malloc (sizeof (*retVal->worker_pool) 1280 retVal->worker_pool = malloc (sizeof (struct MHD_Daemon)
1279 * retVal->worker_pool_size); 1281 * retVal->worker_pool_size);
1282 if (NULL == retVal->worker_pool)
1283 goto thread_failed;
1280 1284
1281 /* Start the workers in the pool */ 1285 /* Start the workers in the pool */
1282 for (i = 0; i < retVal->worker_pool_size; ++i) 1286 for (i = 0; i < retVal->worker_pool_size; ++i)
1283 { 1287 {
1284 /* Create copy of the Daemon object for each worker */ 1288 /* Create copy of the Daemon object for each worker */
1285 struct MHD_Daemon *d = (struct MHD_Daemon*) malloc (sizeof (*d)); 1289 struct MHD_Daemon *d = &retVal->worker_pool[i];
1286 if (!d) 1290 memcpy (d, retVal, sizeof (struct MHD_Daemon));
1287 {
1288#if HAVE_MESSAGES
1289 MHD_DLOG (retVal,
1290 "Failed to copy daemon object: %d\n", STRERROR (errno));
1291#endif
1292 goto thread_failed;
1293 }
1294 memcpy (d, retVal, sizeof (*d));
1295 1291
1296 /* Adjust pooling params for worker daemons; note that memcpy() 1292 /* Adjust pooling params for worker daemons; note that memcpy()
1297 * has already copied MHD_USE_SELECT_INTERNALLY thread model into 1293 has already copied MHD_USE_SELECT_INTERNALLY thread model into
1298 * the worker threads. */ 1294 the worker threads. */
1299 d->master = retVal; 1295 d->master = retVal;
1300 d->worker_pool_size = 0; 1296 d->worker_pool_size = 0;
1301 d->worker_pool = NULL; 1297 d->worker_pool = NULL;
@@ -1316,36 +1312,34 @@ MHD_start_daemon_va (unsigned int options,
1316#endif 1312#endif
1317 /* Free memory for this worker; cleanup below handles 1313 /* Free memory for this worker; cleanup below handles
1318 * all previously-created workers. */ 1314 * all previously-created workers. */
1319 free (d);
1320 goto thread_failed; 1315 goto thread_failed;
1321 } 1316 }
1322 1317 }
1323 retVal->worker_pool[i] = d; 1318 }
1324 continue; 1319 return retVal;
1325 1320
1326thread_failed: 1321thread_failed:
1327 /* If no worker threads created, then shut down normally. Calling 1322 /* If no worker threads created, then shut down normally. Calling
1328 * MHD_stop_daemon (as we do below) doesn't work here since it 1323 MHD_stop_daemon (as we do below) doesn't work here since it
1329 * assumes a 0-sized thread pool means we had been in the default 1324 assumes a 0-sized thread pool means we had been in the default
1330 * MHD_USE_SELECT_INTERNALLY mode. */ 1325 MHD_USE_SELECT_INTERNALLY mode. */
1331 if (i == 0) 1326 if (i == 0)
1332 { 1327 {
1333 CLOSE (socket_fd); 1328 CLOSE (socket_fd);
1334 pthread_mutex_destroy (&retVal->per_ip_connection_mutex); 1329 pthread_mutex_destroy (&retVal->per_ip_connection_mutex);
1335 free (retVal); 1330 if (NULL != retVal->worker_pool)
1336 return NULL; 1331 free (retVal->worker_pool);
1337 } 1332 free (retVal);
1338 1333 return NULL;
1339 /* Shutdown worker threads we've already created. Pretend
1340 * as though we had fully initialized our daemon, but
1341 * with a smaller number of threads than had been
1342 * requested. */
1343 retVal->worker_pool_size = i - 1;
1344 MHD_stop_daemon (retVal);
1345 return NULL;
1346 }
1347 } 1334 }
1348 return retVal; 1335
1336 /* Shutdown worker threads we've already created. Pretend
1337 as though we had fully initialized our daemon, but
1338 with a smaller number of threads than had been
1339 requested. */
1340 retVal->worker_pool_size = i - 1;
1341 MHD_stop_daemon (retVal);
1342 return NULL;
1349} 1343}
1350 1344
1351/** 1345/**
@@ -1389,8 +1383,8 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
1389 /* Prepare workers for shutdown */ 1383 /* Prepare workers for shutdown */
1390 for (i = 0; i < daemon->worker_pool_size; ++i) 1384 for (i = 0; i < daemon->worker_pool_size; ++i)
1391 { 1385 {
1392 daemon->worker_pool[i]->shutdown = MHD_YES; 1386 daemon->worker_pool[i].shutdown = MHD_YES;
1393 daemon->worker_pool[i]->socket_fd = -1; 1387 daemon->worker_pool[i].socket_fd = -1;
1394 } 1388 }
1395 1389
1396#if DEBUG_CLOSE 1390#if DEBUG_CLOSE
@@ -1402,12 +1396,11 @@ MHD_stop_daemon (struct MHD_Daemon *daemon)
1402 1396
1403 /* Signal workers to stop and clean them up */ 1397 /* Signal workers to stop and clean them up */
1404 for (i = 0; i < daemon->worker_pool_size; ++i) 1398 for (i = 0; i < daemon->worker_pool_size; ++i)
1405 pthread_kill (daemon->worker_pool[i]->pid, SIGALRM); 1399 pthread_kill (daemon->worker_pool[i].pid, SIGALRM);
1406 for (i = 0; i < daemon->worker_pool_size; ++i) 1400 for (i = 0; i < daemon->worker_pool_size; ++i)
1407 { 1401 {
1408 pthread_join (daemon->worker_pool[i]->pid, &unused); 1402 pthread_join (daemon->worker_pool[i].pid, &unused);
1409 MHD_close_connections (daemon->worker_pool[i]); 1403 MHD_close_connections (&daemon->worker_pool[i]);
1410 free (daemon->worker_pool[i]);
1411 } 1404 }
1412 free (daemon->worker_pool); 1405 free (daemon->worker_pool);
1413 1406
diff --git a/src/daemon/internal.h b/src/daemon/internal.h
index fcc1fd57..7b4a0e72 100644
--- a/src/daemon/internal.h
+++ b/src/daemon/internal.h
@@ -779,7 +779,7 @@ struct MHD_Daemon
779 /** 779 /**
780 * Worker daemons (one per thread) 780 * Worker daemons (one per thread)
781 */ 781 */
782 struct MHD_Daemon **worker_pool; 782 struct MHD_Daemon *worker_pool;
783 783
784 /** 784 /**
785 * Number of worker daemons 785 * Number of worker daemons