diff options
author | Christian Grothoff <christian@grothoff.org> | 2009-03-17 07:34:32 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2009-03-17 07:34:32 +0000 |
commit | e9128f7887291e9239e380d250960580463d157b (patch) | |
tree | abc2a8b962d9016b49fe3de9596e45b7859ed917 /src/daemon | |
parent | d2630b7e6970c4a67c4e914e4f426f7da0f51c29 (diff) | |
download | libmicrohttpd-e9128f7887291e9239e380d250960580463d157b.tar.gz libmicrohttpd-e9128f7887291e9239e380d250960580463d157b.zip |
various bugfixes and docu updates
Diffstat (limited to 'src/daemon')
-rw-r--r-- | src/daemon/daemon.c | 83 | ||||
-rw-r--r-- | src/daemon/internal.h | 2 |
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 | ||
1326 | thread_failed: | 1321 | thread_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 |