nginx-0.0.1-2003-07-03-20:30:22 import
diff --git a/src/core/nginx.c b/src/core/nginx.c
index 30ebf3f..89dd6f0 100644
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -22,7 +22,9 @@
int ngx_connection_counter;
-#if 1
+int restart;
+int rotate;
+
int main(int argc, char *const *argv)
{
@@ -53,6 +55,8 @@
/* life cycle */
for ( ;; ) {
+ /* STUB */ cycle->log->file->fd = log->file->fd;
+ /* STUB */ cycle->log->log_level = NGX_LOG_DEBUG;
/* STUB */
ngx_io = ngx_os_io;
@@ -66,9 +70,26 @@
/* threads */
+ restart = 0;
+ rotate = 0;
+
for ( ;; ) {
- ngx_worker(cycle);
+ for ( ;; ) {
+ ngx_log_debug(cycle->log, "worker cycle");
+
+ ngx_process_events(cycle->log);
+
+ if (rotate) {
+ ngx_log_debug(cycle->log, "rotate");
+ }
+
+ if (restart) {
+ ngx_log_debug(cycle->log, "restart");
+ break;
+ }
+
+ }
new_cycle = ngx_init_cycle(cycle, cycle->log);
if (new_cycle == NULL) {
@@ -316,7 +337,7 @@
-#else
+#if 0
int main(int argc, char *const *argv)
diff --git a/src/core/ngx_os_init.h b/src/core/ngx_os_init.h
index 3555095..18e7574 100644
--- a/src/core/ngx_os_init.h
+++ b/src/core/ngx_os_init.h
@@ -40,4 +40,8 @@
extern int ngx_inherited_nonblocking;
+extern int restart;
+extern int rotate;
+
+
#endif /* _NGX_OS_INIT_H_INCLUDED_ */
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index fa3aa9b..17e991e 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -11,8 +11,11 @@
typedef struct {
- u_int changes;
- u_int events;
+ int kqueue;
+ struct kevent *change_list;
+ u_int changes;
+ struct kevent *event_list;
+ u_int events;
} ngx_kqueue_conf_t;
@@ -83,6 +86,138 @@
};
+#if 0
+
+static int ngx_kqueue_init(ngx_cycle_t *cycle, ngx_log_t *log)
+{
+ struct timespec ts;
+ ngx_kqueue_conf_t *kcf;
+
+ kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);
+
+ngx_log_debug(log, "CH: %d" _ kcf->changes);
+ngx_log_debug(log, "EV: %d" _ kcf->events);
+
+ if (ngx_kqueue == -1) {
+ kcf->kqueue = kqueue();
+
+ if (kcf->kqueue == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno, "kqueue() failed");
+ return NGX_ERROR;
+ }
+
+ } else {
+ kcf->kqueue = ngx_kqueue;
+ }
+
+ if (max_changes < kcf->changes) {
+ if (nchanges) {
+ ts.tv_sec = 0;
+ ts.tv_nsec = 0;
+
+ if (kevent(ngx_kqueue, change_list, nchanges, NULL, 0, &ts) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "kevent() failed");
+ return NGX_ERROR;
+ }
+
+ nchanges = 0;
+ }
+
+ ngx_test_null(kcf->change_list,
+ ngx_alloc(kcf->changes * sizeof(struct kevent), log),
+ NGX_ERROR);
+
+ } else {
+ kcf->change_list = change_list;
+ }
+
+ if (nevents < kcf->events) {
+ ngx_test_null(kcf->event_list,
+ ngx_alloc(kcf->events * sizeof(struct kevent), log),
+ NGX_ERROR);
+ } else {
+ kcf->event_list = event_list;
+ }
+
+ if (ngx_event_timer_init(cycle, log) == NGX_ERROR) {
+ return NGX_ERROR;
+ }
+
+ return NGX_OK;
+}
+
+
+static void ngx_kqueue_commit(ngx_cycle_t *cycle, ngx_log_t *log)
+{
+ ngx_kqueue_conf_t *kcf;
+
+ kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);
+
+ ngx_kqueue = kcf->kqueue;
+
+ if (change_list != kcf->change_list) {
+ ngx_free(change_list);
+ change_list = kcf->change_list;
+ }
+
+ max_changes = kcf->changes;
+
+ if (event_list != kcf->event_list) {
+ ngx_free(event_list);
+ event_list = kcf->event_list;
+ }
+
+ nevents = kcf->events;
+
+ ngx_event_timer_commit(cycle, log);
+
+ /* TODO: re-add active events with new udata
+ if ecf->connections was increased */
+
+ ngx_event_actions = ngx_kqueue_module_ctx.actions;
+ ngx_io = ngx_os_io;
+
+ ngx_event_flags = NGX_HAVE_LEVEL_EVENT
+ |NGX_HAVE_ONESHOT_EVENT
+#if (HAVE_CLEAR_EVENT)
+ |NGX_HAVE_CLEAR_EVENT
+#else
+ |NGX_USE_LEVEL_EVENT
+#endif
+#if (HAVE_LOWAT_EVENT)
+ |NGX_HAVE_LOWAT_EVENT
+#endif
+ |NGX_HAVE_KQUEUE_EVENT;
+}
+
+
+static void ngx_kqueue_rollback(ngx_cycle_t *cycle, ngx_log_t *log)
+{
+ ngx_kqueue_conf_t *kcf;
+
+ kcf = ngx_event_get_conf(cycle->conf_ctx, ngx_kqueue_module);
+
+ if (ngx_kqueue == -1) {
+ if (close(kcf->kqueue) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
+ "kqueue close() failed");
+ }
+ }
+
+ if (change_list != kcf->change_list) {
+ ngx_free(kcf->change_list);
+ }
+
+ if (event_list != kcf->event_list) {
+ ngx_free(kcf->event_list);
+ }
+
+ ngx_event_timer_rollback(cycle, log);
+}
+
+#endif
+
+
static int ngx_kqueue_init(ngx_log_t *log)
{
struct timespec ts;
diff --git a/src/os/unix/ngx_posix_init.c b/src/os/unix/ngx_posix_init.c
index aadb64c..364df11 100644
--- a/src/os/unix/ngx_posix_init.c
+++ b/src/os/unix/ngx_posix_init.c
@@ -7,6 +7,10 @@
int ngx_inherited_nonblocking;
+void ngx_restart_signal_handler(int signo);
+void ngx_rotate_signal_handler(int signo);
+
+
int ngx_posix_init(ngx_log_t *log)
{
struct sigaction sa;
@@ -15,13 +19,26 @@
ngx_memzero(&sa, sizeof(struct sigaction));
sa.sa_handler = SIG_IGN;
sigemptyset(&sa.sa_mask);
-
if (sigaction(SIGPIPE, &sa, NULL) == -1) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"sigaction(SIGPIPE, SIG_IGN) failed");
return NGX_ERROR;
}
+ sa.sa_handler = ngx_restart_signal_handler;
+ if (sigaction(SIGHUP, &sa, NULL) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ "sigaction(SIGHUP) failed");
+ return NGX_ERROR;
+ }
+
+ sa.sa_handler = ngx_rotate_signal_handler;
+ if (sigaction(SIGUSR1, &sa, NULL) == -1) {
+ ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
+ "sigaction(SIGUSR1) failed");
+ return NGX_ERROR;
+ }
+
if (getrlimit(RLIMIT_NOFILE, &rlmt) == -1) {
ngx_log_error(NGX_LOG_ALERT, log, errno,
@@ -45,6 +62,18 @@
}
+void ngx_restart_signal_handler(int signo)
+{
+ restart = 1;
+}
+
+
+void ngx_rotate_signal_handler(int signo)
+{
+ rotate = 1;
+}
+
+
int ngx_posix_post_conf_init(ngx_log_t *log)
{
ngx_fd_t pp[2];