Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2003-12-09 18:08:11 +0300
committerIgor Sysoev <igor@sysoev.ru>2003-12-09 18:08:11 +0300
commit2b58fbf045acee349c323de8f50501f94c41c04d (patch)
tree32c1e5848f1b0945dba64fa29e93bd328d71e146 /src
parent5f80078c675bc344d12a6a64d97ecafb64de224b (diff)
nginx-0.0.1-2003-12-09-18:08:11 import
Diffstat (limited to 'src')
-rw-r--r--src/core/nginx.c45
-rw-r--r--src/core/ngx_conf_file.c2
-rw-r--r--src/core/ngx_conf_file.h5
-rw-r--r--src/core/ngx_log.c6
-rw-r--r--src/core/ngx_rbtree.h8
-rw-r--r--src/event/modules/ngx_kqueue_module.c22
-rw-r--r--src/event/ngx_event.c172
-rw-r--r--src/event/ngx_event.h7
-rw-r--r--src/event/ngx_event_timer.c4
-rw-r--r--src/event/ngx_event_timer.h8
-rw-r--r--src/http/ngx_http_request.c3
11 files changed, 190 insertions, 92 deletions
diff --git a/src/core/nginx.c b/src/core/nginx.c
index d52933aa9..e02866e53 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -24,14 +24,14 @@ static ngx_str_t core_name = ngx_string("core");
static ngx_command_t ngx_core_commands[] = {
- {ngx_string("daemon"),
- NGX_MAIN_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_core_flag_slot,
- 0,
- offsetof(ngx_core_conf_t, daemon),
- NULL},
-
- ngx_null_command
+ { ngx_string("daemon"),
+ NGX_MAIN_CONF|NGX_CONF_TAKE1,
+ ngx_conf_set_core_flag_slot,
+ 0,
+ offsetof(ngx_core_conf_t, daemon),
+ NULL },
+
+ ngx_null_command
};
@@ -238,6 +238,7 @@ ngx_log_debug(log, "REOPEN: %d:%d:%s" _ fd _ file[i].fd _ file[i].name.data);
static ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle, ngx_log_t *log)
{
int i, n, failed;
+ ngx_fd_t fd;
ngx_str_t conf_file;
ngx_conf_t conf;
ngx_pool_t *pool;
@@ -390,6 +391,26 @@ ngx_log_debug(log, "OPEN: %d:%s" _ file[i].fd _ file[i].name.data);
if (ngx_memcmp(nls[n].sockaddr,
ls[i].sockaddr, ls[i].socklen) == 0)
{
+ fd = ls[i].fd;
+#if (WIN32)
+ /*
+ * Winsock assignes a socket number divisible by 4 so
+ * to find a connection we divide a socket number by 4.
+ */
+
+ fd /= 4;
+#endif
+ if (fd >= cycle->connection_n) {
+ ngx_log_error(NGX_LOG_EMERG, log, 0,
+ "%d connections is not enough to hold "
+ "an open listening socket on %s, "
+ "required at least %d connections",
+ cycle->connection_n,
+ ls[i].addr_text.data, fd);
+ failed = 1;
+ break;
+ }
+
nls[n].fd = ls[i].fd;
nls[i].remain = 1;
ls[i].remain = 1;
@@ -409,8 +430,10 @@ ngx_log_debug(log, "OPEN: %d:%s" _ file[i].fd _ file[i].name.data);
}
}
- if (ngx_open_listening_sockets(cycle, log) == NGX_ERROR) {
- failed = 1;
+ if (!failed) {
+ if (ngx_open_listening_sockets(cycle, log) == NGX_ERROR) {
+ failed = 1;
+ }
}
}
@@ -583,7 +606,7 @@ static int ngx_open_listening_sockets(ngx_cycle_t *cycle, ngx_log_t *log)
if (s == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,
- ngx_socket_n " %s falied", ls[i].addr_text.data);
+ ngx_socket_n " %s failed", ls[i].addr_text.data);
return NGX_ERROR;
}
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c
index 868945747..249239072 100644
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -230,7 +230,7 @@ ngx_log_debug(cf->log, "rv: %d" _ rv);
} else {
ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
- "\"%s\" directive %s in %s:%d",
+ "the \"%s\" directive %s in %s:%d",
name->data, rv,
cf->conf_file->file.name.data,
cf->conf_file->line);
diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h
index eb5478e61..eb9e63b51 100644
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -179,6 +179,11 @@ char *ngx_conf_check_num_bounds(ngx_conf_t *cf, void *post, void *data);
conf = default; \
}
+#define ngx_conf_init_ptr_value(conf, default) \
+ if (conf == (void *) NGX_CONF_UNSET) { \
+ conf = default; \
+ }
+
#define ngx_conf_init_unsigned_value(conf, default) \
if (conf == (unsigned) NGX_CONF_UNSET) { \
conf = default; \
diff --git a/src/core/ngx_log.c b/src/core/ngx_log.c
index b615c7ea2..fede0a079 100644
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -323,7 +323,7 @@ static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
d = NGX_LOG_DEBUG_FIRST;
- for (n = 0; n < /* STUB */ 3; n++) {
+ for (n = 0; n < /* STUB */ 4; n++) {
if (ngx_strcmp(value[i].data, debug_levels[n]) == 0) {
if (cf->cycle->log->log_level & ~NGX_LOG_DEBUG_ALL) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
@@ -333,9 +333,9 @@ static char *ngx_set_error_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
cf->cycle->log->log_level |= d;
- d <<= 1;
- continue;
}
+
+ d <<= 1;
}
diff --git a/src/core/ngx_rbtree.h b/src/core/ngx_rbtree.h
index db435ff1c..04d762292 100644
--- a/src/core/ngx_rbtree.h
+++ b/src/core/ngx_rbtree.h
@@ -23,14 +23,14 @@ void ngx_rbtree_delete(ngx_rbtree_t **root, ngx_rbtree_t *sentinel,
ngx_rbtree_t *node);
-ngx_inline static ngx_rbtree_t *ngx_rbtree_min(ngx_rbtree_t *root,
+ngx_inline static ngx_rbtree_t *ngx_rbtree_min(ngx_rbtree_t *node,
ngx_rbtree_t *sentinel)
{
- while (root->left != sentinel) {
- root = root->left;
+ while (node->left != sentinel) {
+ node = node->left;
}
- return root;
+ return node;
}
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index e438ad33c..d36160ab1 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -122,10 +122,11 @@ ngx_log_debug(cycle->log, "EV: %d" _ kcf->events);
ngx_free(change_list);
}
- ngx_test_null(change_list,
- ngx_alloc(kcf->changes * sizeof(struct kevent),
- cycle->log),
- NGX_ERROR);
+ change_list = ngx_alloc(kcf->changes * sizeof(struct kevent),
+ cycle->log);
+ if (change_list == NULL) {
+ return NGX_ERROR;
+ }
}
max_changes = kcf->changes;
@@ -135,10 +136,11 @@ ngx_log_debug(cycle->log, "EV: %d" _ kcf->events);
ngx_free(event_list);
}
- ngx_test_null(event_list,
- ngx_alloc(kcf->events * sizeof(struct kevent),
- cycle->log),
- NGX_ERROR);
+ event_list = ngx_alloc(kcf->events * sizeof(struct kevent),
+ cycle->log);
+ if (event_list == NULL) {
+ return NGX_ERROR;
+ }
}
nevents = kcf->events;
@@ -371,9 +373,7 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
tp = NULL;
}
-#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "kevent timer: %d" _ timer);
-#endif
+ ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "kevent timer: %d", timer);
events = kevent(ngx_kqueue, change_list, nchanges, event_list, nevents, tp);
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index 8a0856d86..48cb33434 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -23,7 +23,11 @@ extern ngx_module_t ngx_devpoll_module;
static int ngx_event_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,
+ void *conf);
static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
+
static void *ngx_event_create_conf(ngx_cycle_t *cycle);
static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf);
@@ -40,14 +44,14 @@ static ngx_str_t events_name = ngx_string("events");
static ngx_command_t ngx_events_commands[] = {
- {ngx_string("events"),
- NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
- ngx_events_block,
- 0,
- 0,
- NULL},
+ { ngx_string("events"),
+ NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
+ ngx_events_block,
+ 0,
+ 0,
+ NULL },
- ngx_null_command
+ ngx_null_command
};
@@ -65,28 +69,21 @@ static ngx_str_t event_core_name = ngx_string("event_core");
static ngx_command_t ngx_event_core_commands[] = {
- {ngx_string("connections"),
- NGX_EVENT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_num_slot,
- 0,
- offsetof(ngx_event_conf_t, connections),
- NULL},
-
- {ngx_string("use"),
- NGX_EVENT_CONF|NGX_CONF_TAKE1,
- ngx_event_use,
- 0,
- 0,
- NULL},
-
- {ngx_string("timer_queues"),
- NGX_EVENT_CONF|NGX_CONF_TAKE1,
- ngx_conf_set_num_slot,
- 0,
- offsetof(ngx_event_conf_t, timer_queues),
- NULL},
-
- ngx_null_command
+ { ngx_string("connections"),
+ NGX_EVENT_CONF|NGX_CONF_TAKE1,
+ ngx_event_connections,
+ 0,
+ 0,
+ NULL },
+
+ { ngx_string("use"),
+ NGX_EVENT_CONF|NGX_CONF_TAKE1,
+ ngx_event_use,
+ 0,
+ 0,
+ NULL },
+
+ ngx_null_command
};
@@ -121,10 +118,13 @@ static int ngx_event_init(ngx_cycle_t *cycle)
ngx_iocp_conf_t *iocpcf;
#endif
- ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);
-ngx_log_debug(cycle->log, "CONN: %d" _ ecf->connections);
-ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
+ if (cycle->old_cycle == NULL) {
+ ngx_event_timer_init(cycle);
+ }
+
+
+ ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module);
cycle->connection_n = ecf->connections;
@@ -142,29 +142,28 @@ ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
}
}
- if (cycle->old_cycle && cycle->old_cycle->connection_n < ecf->connections) {
- /* TODO: push into delayed array and temporary pool */
- ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: connections");
- exit(1);
+ cycle->connections = ngx_alloc(sizeof(ngx_connection_t) * ecf->connections,
+ cycle->log);
+ if (cycle->connections == NULL) {
+ return NGX_ERROR;
}
- ngx_test_null(cycle->connections,
- ngx_alloc(sizeof(ngx_connection_t) * ecf->connections,
- cycle->log),
- NGX_ERROR);
-
c = cycle->connections;
for (i = 0; i < cycle->connection_n; i++) {
c[i].fd = -1;
}
- ngx_test_null(cycle->read_events,
- ngx_alloc(sizeof(ngx_event_t) * ecf->connections, cycle->log),
- NGX_ERROR);
+ cycle->read_events = ngx_alloc(sizeof(ngx_event_t) * ecf->connections,
+ cycle->log);
+ if (cycle->read_events == NULL) {
+ return NGX_ERROR;
+ }
- ngx_test_null(cycle->write_events,
- ngx_alloc(sizeof(ngx_event_t) * ecf->connections, cycle->log),
- NGX_ERROR);
+ cycle->write_events = ngx_alloc(sizeof(ngx_event_t) * ecf->connections,
+ cycle->log);
+ if (cycle->write_events == NULL) {
+ return NGX_ERROR;
+ }
/* for each listening socket */
@@ -200,6 +199,9 @@ ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
/* required by iocp in "c->write->active = 1" */
c->write = wev;
+ /* required by poll */
+ wev->index = NGX_INVALID_INDEX;
+
rev->log = c->log;
rev->data = c;
rev->index = NGX_INVALID_INDEX;
@@ -210,12 +212,14 @@ ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use);
rev->deferred_accept = s[i].deferred_accept;
#endif
- /* required by poll */
- wev->index = NGX_INVALID_INDEX;
-
- if ((ngx_event_flags & NGX_USE_IOCP_EVENT) == 0) {
+ if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {
if (s[i].remain) {
+ /*
+ * delete the old accept events that were bound to
+ * the old cycle read events array
+ */
+
if (ngx_del_event(&cycle->old_cycle->read_events[fd],
NGX_READ_EVENT, 0) == NGX_ERROR) {
return NGX_ERROR;
@@ -327,19 +331,53 @@ 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,
+ void *conf)
+{
+ ngx_event_conf_t *ecf = conf;
+
+ ngx_str_t *value;
+
+ if (ecf->connections != NGX_CONF_UNSET) {
+ return "is duplicate" ;
+ }
+
+ value = cf->args->elts;
+ ecf->connections = ngx_atoi(value[1].data, value[1].len);
+ if (ecf->connections == NGX_ERROR) {
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+ "invalid number \"%s\"", value[1].data);
+
+ return NGX_CONF_ERROR;
+ }
+
+ cf->cycle->connection_n = ecf->connections;
+
+ return NGX_CONF_OK;
+}
+
+
static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_event_conf_t *ecf = conf;
int m;
- ngx_str_t *args;
+ ngx_str_t *value;
+ ngx_event_conf_t *old_ecf;
ngx_event_module_t *module;
if (ecf->use != NGX_CONF_UNSET) {
return "is duplicate" ;
}
- args = cf->args->elts;
+ value = cf->args->elts;
+
+ if (cf->cycle->old_cycle) {
+ old_ecf = ngx_event_get_conf(cf->cycle->old_cycle->conf_ctx,
+ ngx_event_core_module);
+ } else {
+ old_ecf = NULL;
+ }
for (m = 0; ngx_modules[m]; m++) {
if (ngx_modules[m]->type != NGX_EVENT_MODULE) {
@@ -347,15 +385,31 @@ static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
module = ngx_modules[m]->ctx;
- if (module->name->len == args[1].len) {
- if (ngx_strcmp(module->name->data, args[1].data) == 0) {
+ if (module->name->len == value[1].len) {
+ if (ngx_strcmp(module->name->data, value[1].data) == 0) {
ecf->use = ngx_modules[m]->ctx_index;
+ ecf->name = module->name->data;
+
+ if (old_ecf && old_ecf->use != ecf->use) {
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+ "the \"%s\" event type must be the same as "
+ "in previous configuration - \"%s\" "
+ "and it can not be changed on the fly, "
+ "to change it you need to stop server "
+ "and start it again",
+ value[1].data, old_ecf->name);
+ return NGX_CONF_ERROR;
+ }
+
return NGX_CONF_OK;
}
}
}
- return "invalid event type";
+ ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
+ "invalid event type \"%s\"", value[1].data);
+
+ return NGX_CONF_ERROR;
}
@@ -369,6 +423,7 @@ static void *ngx_event_create_conf(ngx_cycle_t *cycle)
ecf->connections = NGX_CONF_UNSET;
ecf->timer_queues = NGX_CONF_UNSET;
ecf->use = NGX_CONF_UNSET;
+ ecf->name = (void *) NGX_CONF_UNSET;
return ecf;
}
@@ -382,11 +437,13 @@ static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
ngx_conf_init_value(ecf->connections, DEFAULT_CONNECTIONS);
ngx_conf_init_value(ecf->use, ngx_kqueue_module.ctx_index);
+ ngx_conf_init_ptr_value(ecf->name, ngx_kqueue_module_ctx.name->data);
#elif (HAVE_DEVPOLL)
ngx_conf_init_value(ecf->connections, DEFAULT_CONNECTIONS);
ngx_conf_init_value(ecf->use, ngx_devpoll_module.ctx_index);
+ ngx_conf_init_ptr_value(ecf->name, ngx_devpoll_module_ctx.name->data);
#else /* HAVE_SELECT */
@@ -394,9 +451,12 @@ static char *ngx_event_init_conf(ngx_cycle_t *cycle, void *conf)
FD_SETSIZE < DEFAULT_CONNECTIONS ? FD_SETSIZE : DEFAULT_CONNECTIONS);
ngx_conf_init_value(ecf->use, ngx_select_module.ctx_index);
+ ngx_conf_init_ptr_value(ecf->name, ngx_select_module_ctx.name->data);
#endif
+ cycle->connection_n = ecf->connections;
+
ngx_conf_init_value(ecf->timer_queues, 10);
return NGX_CONF_OK;
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index ee7ab0f43..5a545504e 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -335,9 +335,10 @@ extern ngx_event_actions_t ngx_event_actions;
typedef struct {
- int connections;
- int timer_queues;
- int use;
+ int connections;
+ int timer_queues;
+ int use;
+ char *name;
} ngx_event_conf_t;
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c
index 90a4f2099..c0852e866 100644
--- a/src/event/ngx_event_timer.c
+++ b/src/event/ngx_event_timer.c
@@ -10,6 +10,10 @@ ngx_rbtree_t ngx_event_timer_sentinel;
int ngx_event_timer_init(ngx_cycle_t *cycle)
{
+ if (cycle->old_cycle) {
+ return NGX_OK;
+ }
+
ngx_event_timer_rbtree = &ngx_event_timer_sentinel;
ngx_event_timer_sentinel.left = &ngx_event_timer_sentinel;
ngx_event_timer_sentinel.right = &ngx_event_timer_sentinel;
diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h
index aee06593c..21867ce20 100644
--- a/src/event/ngx_event_timer.h
+++ b/src/event/ngx_event_timer.h
@@ -19,8 +19,12 @@
#define NGX_TIMER_RESOLUTION 50
-int ngx_event_timer_init(ngx_cycle_t *cycle);
-void ngx_event_timer_done(ngx_cycle_t *cycle);
+#if 0
+int ngx_event_timer_init(void);
+#endif
+/* STUB */ int ngx_event_timer_init(ngx_cycle_t *cycle);
+/* STUB */ void ngx_event_timer_done(ngx_cycle_t *cycle);
+
ngx_msec_t ngx_event_find_timer(void);
void ngx_event_expire_timers(ngx_msec_t timer);
diff --git a/src/http/ngx_http_request.c b/src/http/ngx_http_request.c
index a8c2d6c75..51478c6b1 100644
--- a/src/http/ngx_http_request.c
+++ b/src/http/ngx_http_request.c
@@ -284,7 +284,8 @@ static void ngx_http_process_request_line(ngx_event_t *rev)
c = rev->data;
r = c->data;
- ngx_log_debug(rev->log, "http process request line");
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, rev->log, 0,
+ "http process request line");
if (rev->timedout) {
ngx_http_client_error(r, 0, NGX_HTTP_REQUEST_TIME_OUT);