diff src/event/ngx_event.c @ 303:00c5660d2707

nginx-0.0.3-2004-04-01-20:20:53 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 01 Apr 2004 16:20:53 +0000
parents 744965ec6275
children bcbe876f4262
line wrap: on
line diff
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -28,7 +28,8 @@ extern ngx_event_module_t ngx_epoll_modu
 #include <ngx_aio_module.h>
 #endif
 
-static int ngx_event_init(ngx_cycle_t *cycle);
+static ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle);
+static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle);
 static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 
 static char *ngx_event_connections(ngx_conf_t *cf, ngx_command_t *cmd,
@@ -39,11 +40,16 @@ static void *ngx_event_create_conf(ngx_c
 static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf);
 
 
-int                    ngx_event_flags;
-ngx_event_actions_t    ngx_event_actions;
+static ngx_uint_t                 ngx_event_max_module;
+
+ngx_uint_t                        ngx_event_flags;
+ngx_event_actions_t               ngx_event_actions;
 
 
-static int             ngx_event_max_module;
+ngx_atomic_t                     *ngx_accept_mutex_ptr;
+ngx_atomic_t                     *ngx_accept_mutex;
+ngx_uint_t                        ngx_accept_mutex_held;
+
 
 ngx_thread_volatile ngx_event_t  *ngx_posted_events;
 #if (NGX_THREADS)
@@ -101,6 +107,13 @@ static ngx_command_t  ngx_event_core_com
       offsetof(ngx_event_conf_t, multi_accept),
       NULL },
 
+    { ngx_string("accept_mutex"),
+      NGX_EVENT_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_flag_slot,
+      0,
+      offsetof(ngx_event_conf_t, accept_mutex),
+      NULL },
+
       ngx_null_command
 };
 
@@ -119,18 +132,50 @@ ngx_module_t  ngx_event_core_module = {
     &ngx_event_core_module_ctx,            /* module context */
     ngx_event_core_commands,               /* module directives */
     NGX_EVENT_MODULE,                      /* module type */
-    NULL,                                  /* init module */
-    ngx_event_init                         /* init child */
+    ngx_event_module_init,                 /* init module */
+    ngx_event_process_init                 /* init process */
 };
 
 
-static int ngx_event_init(ngx_cycle_t *cycle)
+static ngx_int_t ngx_event_module_init(ngx_cycle_t *cycle)
+{
+    ngx_core_conf_t   *ccf;
+    ngx_event_conf_t  *ecf;
+
+    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+
+    if (ccf->master == 0) {
+        return NGX_OK;
+    }
+
+    ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);
+
+    if (ecf->accept_mutex == 0) {
+        return NGX_OK;
+    }
+
+    ngx_accept_mutex_ptr = mmap(NULL, sizeof(ngx_atomic_t),
+                                PROT_READ|PROT_WRITE,
+                                MAP_ANON|MAP_SHARED, -1, 0);
+
+    if (ngx_accept_mutex_ptr == NULL) {
+        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+                      "mmap(MAP_ANON|MAP_SHARED) failed");
+        return NGX_ERROR;
+    }
+
+    return NGX_OK;
+}
+
+
+static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle)
 {
     ngx_uint_t           m, i;
     ngx_socket_t         fd;
     ngx_event_t         *rev, *wev;
     ngx_listening_t     *s;
     ngx_connection_t    *c;
+    ngx_core_conf_t     *ccf;
     ngx_event_conf_t    *ecf;
     ngx_event_module_t  *module;
 #if (WIN32)
@@ -138,6 +183,13 @@ static int ngx_event_init(ngx_cycle_t *c
 #endif
 
 
+    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+
+    if (ccf->worker_processes > 1 && ngx_accept_mutex_ptr) {
+        ngx_accept_mutex = ngx_accept_mutex_ptr;
+        ngx_accept_mutex_held = 1;
+    }
+
 #if (NGX_THREADS)
     if (!(ngx_posted_events_mutex = ngx_mutex_init(cycle->log, 0))) {
         return NGX_ERROR;
@@ -470,6 +522,7 @@ static void *ngx_event_create_conf(ngx_c
     ecf->connections = NGX_CONF_UNSET;
     ecf->use = NGX_CONF_UNSET;
     ecf->multi_accept = NGX_CONF_UNSET;
+    ecf->accept_mutex = NGX_CONF_UNSET;
     ecf->name = (void *) NGX_CONF_UNSET;
 
     return ecf;
@@ -542,6 +595,7 @@ static char *ngx_event_init_conf(ngx_cyc
     cycle->connection_n = ecf->connections;
 
     ngx_conf_init_value(ecf->multi_accept, 0);
+    ngx_conf_init_value(ecf->accept_mutex, 1);
 
     return NGX_CONF_OK;
 }