Browse Source

Update thread count on OOM error in worker_thread()

Sergey Lyubka 13 năm trước cách đây
mục cha
commit
ab6f145e3e
1 tập tin đã thay đổi với 28 bổ sung27 xóa
  1. 28 27
      mongoose.c

+ 28 - 27
mongoose.c

@@ -4136,35 +4136,36 @@ static void worker_thread(struct mg_context *ctx) {
   conn = (struct mg_connection *) calloc(1, sizeof(*conn) + buf_size);
   if (conn == NULL) {
     cry(fc(ctx), "%s", "Cannot create new connection struct, OOM");
-    return;
-  }
-  conn->buf_size = buf_size;
-  conn->buf = (char *) (conn + 1);
-
-  // Call consume_socket() even when ctx->stop_flag > 0, to let it signal
-  // sq_empty condvar to wake up the master waiting in produce_socket()
-  while (consume_socket(ctx, &conn->client)) {
-    conn->birth_time = time(NULL);
-    conn->ctx = ctx;
-
-    // Fill in IP, port info early so even if SSL setup below fails,
-    // error handler would have the corresponding info.
-    // Thanks to Johannes Winkelmann for the patch.
-    // TODO(lsm): Fix IPv6 case
-    conn->request_info.remote_port = ntohs(conn->client.rsa.sin.sin_port);
-    memcpy(&conn->request_info.remote_ip,
-           &conn->client.rsa.sin.sin_addr.s_addr, 4);
-    conn->request_info.remote_ip = ntohl(conn->request_info.remote_ip);
-    conn->request_info.is_ssl = conn->client.is_ssl;
-
-    if (!conn->client.is_ssl ||
-        (conn->client.is_ssl && sslize(conn, conn->ctx->ssl_ctx, SSL_accept))) {
-      process_new_connection(conn);
-    }
+  } else {
+    conn->buf_size = buf_size;
+    conn->buf = (char *) (conn + 1);
 
-    close_connection(conn);
+    // Call consume_socket() even when ctx->stop_flag > 0, to let it signal
+    // sq_empty condvar to wake up the master waiting in produce_socket()
+    while (consume_socket(ctx, &conn->client)) {
+      conn->birth_time = time(NULL);
+      conn->ctx = ctx;
+
+      // Fill in IP, port info early so even if SSL setup below fails,
+      // error handler would have the corresponding info.
+      // Thanks to Johannes Winkelmann for the patch.
+      // TODO(lsm): Fix IPv6 case
+      conn->request_info.remote_port = ntohs(conn->client.rsa.sin.sin_port);
+      memcpy(&conn->request_info.remote_ip,
+             &conn->client.rsa.sin.sin_addr.s_addr, 4);
+      conn->request_info.remote_ip = ntohl(conn->request_info.remote_ip);
+      conn->request_info.is_ssl = conn->client.is_ssl;
+
+      if (!conn->client.is_ssl ||
+          (conn->client.is_ssl &&
+           sslize(conn, conn->ctx->ssl_ctx, SSL_accept))) {
+        process_new_connection(conn);
+      }
+
+      close_connection(conn);
+    }
+    free(conn);
   }
-  free(conn);
 
   // Signal master that we're done with connection and exiting
   (void) pthread_mutex_lock(&ctx->mutex);