|  | @@ -610,7 +610,7 @@ static pthread_key_t sTlsKey;  /* Thread local storage index */
 | 
											
												
													
														|  |  static int sTlsInit = 0;
 |  |  static int sTlsInit = 0;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  struct mg_workerTLS {
 |  |  struct mg_workerTLS {
 | 
											
												
													
														|  | -    int threadIndex;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    int is_master;
 | 
											
												
													
														|  |  #if defined(_WIN32) && !defined(__SYMBIAN32__)
 |  |  #if defined(_WIN32) && !defined(__SYMBIAN32__)
 | 
											
												
													
														|  |      HANDLE pthread_cond_helper_mutex;
 |  |      HANDLE pthread_cond_helper_mutex;
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
										
											
												
													
														|  | @@ -5760,17 +5760,18 @@ static void *worker_thread_run(void *thread_func_param)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      struct mg_context *ctx = (struct mg_context *) thread_func_param;
 |  |      struct mg_context *ctx = (struct mg_context *) thread_func_param;
 | 
											
												
													
														|  |      struct mg_connection *conn;
 |  |      struct mg_connection *conn;
 | 
											
												
													
														|  | -    struct mg_workerTLS *tls;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    struct mg_workerTLS tls;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    tls.is_master = 0;
 | 
											
												
													
														|  | 
 |  | +#if defined(_WIN32) && !defined(__SYMBIAN32__)
 | 
											
												
													
														|  | 
 |  | +    tls.pthread_cond_helper_mutex = CreateEvent(NULL, FALSE, FALSE, NULL);
 | 
											
												
													
														|  | 
 |  | +#endif
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    tls = (struct mg_workerTLS *) calloc(1, sizeof(*tls));
 |  | 
 | 
											
												
													
														|  |      conn = (struct mg_connection *) calloc(1, sizeof(*conn) + MAX_REQUEST_SIZE);
 |  |      conn = (struct mg_connection *) calloc(1, sizeof(*conn) + MAX_REQUEST_SIZE);
 | 
											
												
													
														|  | -    if ((conn == NULL) || (tls == NULL)) {
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if (conn == NULL) {
 | 
											
												
													
														|  |          mg_cry(fc(ctx), "%s", "Cannot create new connection struct, OOM");
 |  |          mg_cry(fc(ctx), "%s", "Cannot create new connection struct, OOM");
 | 
											
												
													
														|  |      } else {
 |  |      } else {
 | 
											
												
													
														|  | -#if defined(_WIN32) && !defined(__SYMBIAN32__)
 |  | 
 | 
											
												
													
														|  | -        tls->pthread_cond_helper_mutex = CreateEvent(NULL, FALSE, FALSE, NULL);
 |  | 
 | 
											
												
													
														|  | -#endif
 |  | 
 | 
											
												
													
														|  | -        pthread_setspecific(sTlsKey, tls);
 |  | 
 | 
											
												
													
														|  | 
 |  | +        pthread_setspecific(sTlsKey, &tls);
 | 
											
												
													
														|  |          conn->buf_size = MAX_REQUEST_SIZE;
 |  |          conn->buf_size = MAX_REQUEST_SIZE;
 | 
											
												
													
														|  |          conn->buf = (char *) (conn + 1);
 |  |          conn->buf = (char *) (conn + 1);
 | 
											
												
													
														|  |          conn->ctx = ctx;
 |  |          conn->ctx = ctx;
 | 
											
										
											
												
													
														|  | @@ -5815,9 +5816,8 @@ static void *worker_thread_run(void *thread_func_param)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pthread_setspecific(sTlsKey, 0);
 |  |      pthread_setspecific(sTlsKey, 0);
 | 
											
												
													
														|  |  #if defined(_WIN32) && !defined(__SYMBIAN32__)
 |  |  #if defined(_WIN32) && !defined(__SYMBIAN32__)
 | 
											
												
													
														|  | -    CloseHandle(tls->pthread_cond_helper_mutex);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    CloseHandle(tls.pthread_cond_helper_mutex);
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
												
													
														|  | -    free(tls);
 |  | 
 | 
											
												
													
														|  |      free(conn);
 |  |      free(conn);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      DEBUG_TRACE(("exiting"));
 |  |      DEBUG_TRACE(("exiting"));
 | 
											
										
											
												
													
														|  | @@ -5918,6 +5918,7 @@ static void accept_new_connection(const struct socket *listener,
 | 
											
												
													
														|  |  static void master_thread_run(void *thread_func_param)
 |  |  static void master_thread_run(void *thread_func_param)
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      struct mg_context *ctx = (struct mg_context *) thread_func_param;
 |  |      struct mg_context *ctx = (struct mg_context *) thread_func_param;
 | 
											
												
													
														|  | 
 |  | +    struct mg_workerTLS tls;
 | 
											
												
													
														|  |      struct pollfd *pfd;
 |  |      struct pollfd *pfd;
 | 
											
												
													
														|  |      int i;
 |  |      int i;
 | 
											
												
													
														|  |      int workerthreadcount;
 |  |      int workerthreadcount;
 | 
											
										
											
												
													
														|  | @@ -5938,6 +5939,12 @@ static void master_thread_run(void *thread_func_param)
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +#if defined(_WIN32) && !defined(__SYMBIAN32__)
 | 
											
												
													
														|  | 
 |  | +    tls.pthread_cond_helper_mutex = CreateEvent(NULL, FALSE, FALSE, NULL);
 | 
											
												
													
														|  | 
 |  | +#endif
 | 
											
												
													
														|  | 
 |  | +    tls.is_master = 1;
 | 
											
												
													
														|  | 
 |  | +    pthread_setspecific(sTlsKey, &tls);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      pfd = (struct pollfd *) calloc(ctx->num_listening_sockets, sizeof(pfd[0]));
 |  |      pfd = (struct pollfd *) calloc(ctx->num_listening_sockets, sizeof(pfd[0]));
 | 
											
												
													
														|  |      while (pfd != NULL && ctx->stop_flag == 0) {
 |  |      while (pfd != NULL && ctx->stop_flag == 0) {
 | 
											
												
													
														|  |          for (i = 0; i < ctx->num_listening_sockets; i++) {
 |  |          for (i = 0; i < ctx->num_listening_sockets; i++) {
 | 
											
										
											
												
													
														|  | @@ -5990,6 +5997,11 @@ static void master_thread_run(void *thread_func_param)
 | 
											
												
													
														|  |  #endif
 |  |  #endif
 | 
											
												
													
														|  |      DEBUG_TRACE(("exiting"));
 |  |      DEBUG_TRACE(("exiting"));
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +#if defined(_WIN32) && !defined(__SYMBIAN32__)
 | 
											
												
													
														|  | 
 |  | +    CloseHandle(tls.pthread_cond_helper_mutex);
 | 
											
												
													
														|  | 
 |  | +#endif
 | 
											
												
													
														|  | 
 |  | +    pthread_setspecific(sTlsKey, 0);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      // Signal mg_stop() that we're done.
 |  |      // Signal mg_stop() that we're done.
 | 
											
												
													
														|  |      // WARNING: This must be the very last thing this
 |  |      // WARNING: This must be the very last thing this
 | 
											
												
													
														|  |      // thread does, as ctx becomes invalid after this line.
 |  |      // thread does, as ctx becomes invalid after this line.
 |