|
@@ -1073,9 +1073,10 @@ struct mg_context {
|
|
|
in_port_t *listening_ports;
|
|
|
unsigned int num_listening_sockets;
|
|
|
|
|
|
- volatile int num_threads; /* Number of threads */
|
|
|
+ volatile int
|
|
|
+ running_worker_threads; /* Number of currently running worker threads */
|
|
|
pthread_mutex_t thread_mutex; /* Protects (max|num)_threads */
|
|
|
- pthread_cond_t thread_cond; /* Condvar for tracking workers terminations */
|
|
|
+ pthread_cond_t thread_cond; /* Condvar for tracking workers terminations */
|
|
|
|
|
|
struct socket queue[MGSQLEN]; /* Accepted sockets */
|
|
|
volatile int sq_head; /* Head of the socket queue */
|
|
@@ -1084,12 +1085,12 @@ struct mg_context {
|
|
|
pthread_cond_t sq_empty; /* Signaled when socket is consumed */
|
|
|
pthread_t masterthreadid; /* The master thread ID */
|
|
|
unsigned int
|
|
|
- cfg_worker_threads; /* The number of configured worker threads. */
|
|
|
- pthread_t *workerthreadids; /* The worker thread IDs */
|
|
|
+ cfg_worker_threads; /* The number of configured worker threads. */
|
|
|
+ pthread_t *workerthreadids; /* The worker thread IDs */
|
|
|
|
|
|
- unsigned long start_time; /* Server start time, used for authentication */
|
|
|
- pthread_mutex_t nonce_mutex; /* Protects nonce_count */
|
|
|
- unsigned long nonce_count; /* Used nonces, used for authentication */
|
|
|
+ unsigned long start_time; /* Server start time, used for authentication */
|
|
|
+ pthread_mutex_t nonce_mutex; /* Protects nonce_count */
|
|
|
+ unsigned long nonce_count; /* Used nonces, used for authentication */
|
|
|
|
|
|
char *systemName; /* What operating system is running */
|
|
|
|
|
@@ -10847,9 +10848,9 @@ static void *worker_thread_run(void *thread_func_param)
|
|
|
|
|
|
/* Signal master that we're done with connection and exiting */
|
|
|
(void)pthread_mutex_lock(&ctx->thread_mutex);
|
|
|
- ctx->num_threads--;
|
|
|
+ ctx->running_worker_threads--;
|
|
|
(void)pthread_cond_signal(&ctx->thread_cond);
|
|
|
- /* assert(ctx->num_threads >= 0); */
|
|
|
+ /* assert(ctx->running_worker_threads >= 0); */
|
|
|
(void)pthread_mutex_unlock(&ctx->thread_mutex);
|
|
|
|
|
|
pthread_setspecific(sTlsKey, NULL);
|
|
@@ -11049,7 +11050,7 @@ static void master_thread_run(void *thread_func_param)
|
|
|
|
|
|
/* Wait until all threads finish */
|
|
|
(void)pthread_mutex_lock(&ctx->thread_mutex);
|
|
|
- while (ctx->num_threads > 0) {
|
|
|
+ while (ctx->running_worker_threads > 0) {
|
|
|
(void)pthread_cond_wait(&ctx->thread_cond, &ctx->thread_mutex);
|
|
|
}
|
|
|
(void)pthread_mutex_unlock(&ctx->thread_mutex);
|
|
@@ -11407,12 +11408,12 @@ struct mg_context *mg_start(const struct mg_callbacks *callbacks,
|
|
|
/* Start worker threads */
|
|
|
for (i = 0; i < ctx->cfg_worker_threads; i++) {
|
|
|
(void)pthread_mutex_lock(&ctx->thread_mutex);
|
|
|
- ctx->num_threads++;
|
|
|
+ ctx->running_worker_threads++;
|
|
|
(void)pthread_mutex_unlock(&ctx->thread_mutex);
|
|
|
if (mg_start_thread_with_id(
|
|
|
worker_thread, ctx, &ctx->workerthreadids[i]) != 0) {
|
|
|
(void)pthread_mutex_lock(&ctx->thread_mutex);
|
|
|
- ctx->num_threads--;
|
|
|
+ ctx->running_worker_threads--;
|
|
|
(void)pthread_mutex_unlock(&ctx->thread_mutex);
|
|
|
if (i > 0) {
|
|
|
mg_cry(fc(ctx),
|