summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/ngx_file.c4
-rw-r--r--src/core/ngx_file.h2
-rw-r--r--src/http/ngx_http_cache.h1
-rw-r--r--src/http/ngx_http_file_cache.c105
-rw-r--r--src/http/ngx_http_upstream.c5
-rw-r--r--src/os/unix/ngx_process.c18
-rw-r--r--src/os/unix/ngx_process.h9
-rw-r--r--src/os/unix/ngx_process_cycle.c163
-rw-r--r--src/os/unix/ngx_process_cycle.h7
-rw-r--r--src/os/win32/ngx_process.c4
-rw-r--r--src/os/win32/ngx_process.h2
-rw-r--r--src/os/win32/ngx_process_cycle.c43
12 files changed, 241 insertions, 122 deletions
diff --git a/src/core/ngx_file.c b/src/core/ngx_file.c
index 3f47fc98b..19ed86df0 100644
--- a/src/core/ngx_file.c
+++ b/src/core/ngx_file.c
@@ -264,7 +264,8 @@ ngx_conf_set_path_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
path->len = 0;
- path->manager = (ngx_path_manager_pt) cmd->post;
+ path->manager = NULL;
+ path->loader = NULL;
path->conf_file = cf->conf_file->file.name.data;
path->line = cf->conf_file->line;
@@ -325,6 +326,7 @@ ngx_conf_merge_path_value(ngx_conf_t *cf, ngx_path_t **path, ngx_path_t *prev,
+ init->level[2] + (init->level[2] ? 1 : 0);
(*path)->manager = NULL;
+ (*path)->loader = NULL;
(*path)->conf_file = NULL;
if (ngx_add_path(cf, path) != NGX_OK) {
diff --git a/src/core/ngx_file.h b/src/core/ngx_file.h
index 264ba391b..7768e48e1 100644
--- a/src/core/ngx_file.h
+++ b/src/core/ngx_file.h
@@ -30,6 +30,7 @@ struct ngx_file_s {
typedef time_t (*ngx_path_manager_pt) (void *data);
+typedef void (*ngx_path_loader_pt) (void *data);
typedef struct {
@@ -38,6 +39,7 @@ typedef struct {
size_t level[3];
ngx_path_manager_pt manager;
+ ngx_path_loader_pt loader;
void *data;
u_char *conf_file;
diff --git a/src/http/ngx_http_cache.h b/src/http/ngx_http_cache.h
index 1ee80751d..6ac6fd876 100644
--- a/src/http/ngx_http_cache.h
+++ b/src/http/ngx_http_cache.h
@@ -97,6 +97,7 @@ typedef struct {
ngx_rbtree_node_t sentinel;
ngx_queue_t queue;
ngx_atomic_t cold;
+ ngx_atomic_t loading;
off_t size;
} ngx_http_file_cache_sh_t;
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c
index 8e908a1dc..249055da1 100644
--- a/src/http/ngx_http_file_cache.c
+++ b/src/http/ngx_http_file_cache.c
@@ -53,6 +53,7 @@ ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)
ngx_http_file_cache_t *ocache = data;
size_t len;
+ ngx_uint_t n;
ngx_http_file_cache_t *cache;
cache = shm_zone->data;
@@ -68,6 +69,15 @@ ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)
return NGX_ERROR;
}
+ for (n = 0; n < 3; n++) {
+ if (cache->path->level[n] != ocache->path->level[n]) {
+ ngx_log_error(NGX_LOG_EMERG, shm_zone->shm.log, 0,
+ "cache \"%V\" had previously different levels",
+ &shm_zone->shm.name);
+ return NGX_ERROR;
+ }
+ }
+
cache->sh = ocache->sh;
cache->shpool = ocache->shpool;
@@ -75,6 +85,10 @@ ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)
cache->max_size /= cache->bsize;
+ if (!cache->sh->cold || cache->sh->loading) {
+ cache->path->loader = NULL;
+ }
+
return NGX_OK;
}
@@ -100,6 +114,7 @@ ngx_http_file_cache_init(ngx_shm_zone_t *shm_zone, void *data)
ngx_queue_init(&cache->sh->queue);
cache->sh->cold = 1;
+ cache->sh->loading = 0;
cache->sh->size = 0;
cache->bsize = ngx_fs_bsize(cache->path->name.data);
@@ -603,7 +618,7 @@ ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf)
void
ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
{
- off_t size;
+ off_t size, length;
ngx_int_t rc;
ngx_file_uniq_t uniq;
ngx_file_info_t fi;
@@ -625,6 +640,7 @@ ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
cache = c->file_cache;
uniq = 0;
+ length = 0;
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"http file cache rename: \"%s\" to \"%s\"",
@@ -650,10 +666,11 @@ ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
} else {
uniq = ngx_file_uniq(&fi);
+ length = ngx_file_size(&fi);
}
}
- size = (c->length + cache->bsize - 1) / cache->bsize;
+ size = (length + cache->bsize - 1) / cache->bsize;
ngx_shmtx_lock(&cache->shpool->mutex);
@@ -663,7 +680,7 @@ ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf)
size = size - (c->node->length + cache->bsize - 1) / cache->bsize;
- c->node->length = c->length;
+ c->node->length = length;
cache->sh->size += size;
@@ -1026,39 +1043,8 @@ ngx_http_file_cache_manager(void *data)
{
ngx_http_file_cache_t *cache = data;
- off_t size;
- time_t next;
- ngx_tree_ctx_t tree;
-
- if (cache->sh->cold) {
-
- ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
- "http file cache manager update");
-
- tree.init_handler = NULL;
- tree.file_handler = ngx_http_file_cache_manage_file;
- tree.pre_tree_handler = ngx_http_file_cache_noop;
- tree.post_tree_handler = ngx_http_file_cache_noop;
- tree.spec_handler = ngx_http_file_cache_delete_file;
- tree.data = cache;
- tree.alloc = 0;
- tree.log = ngx_cycle->log;
-
- cache->last = ngx_current_msec;
- cache->files = 0;
-
- if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) {
- return 10;
- }
-
- cache->sh->cold = 0;
-
- ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,
- "http file cache: %V %.3fM, bsize: %uz",
- &cache->path->name,
- ((double) cache->sh->size * cache->bsize) / (1024 * 1024),
- cache->bsize);
- }
+ off_t size;
+ time_t next;
next = ngx_http_file_cache_expire(cache);
@@ -1088,6 +1074,52 @@ ngx_http_file_cache_manager(void *data)
}
+static void
+ngx_http_file_cache_loader(void *data)
+{
+ ngx_http_file_cache_t *cache = data;
+
+ ngx_tree_ctx_t tree;
+
+ if (!cache->sh->cold || cache->sh->loading) {
+ return;
+ }
+
+ if (!ngx_atomic_cmp_set(&cache->sh->loading, 0, ngx_pid)) {
+ return;
+ }
+
+ ngx_log_debug0(NGX_LOG_DEBUG_HTTP, ngx_cycle->log, 0,
+ "http file cache loader");
+
+ tree.init_handler = NULL;
+ tree.file_handler = ngx_http_file_cache_manage_file;
+ tree.pre_tree_handler = ngx_http_file_cache_noop;
+ tree.post_tree_handler = ngx_http_file_cache_noop;
+ tree.spec_handler = ngx_http_file_cache_delete_file;
+ tree.data = cache;
+ tree.alloc = 0;
+ tree.log = ngx_cycle->log;
+
+ cache->last = ngx_current_msec;
+ cache->files = 0;
+
+ if (ngx_walk_tree(&tree, &cache->path->name) == NGX_ABORT) {
+ cache->sh->loading = 0;
+ return;
+ }
+
+ cache->sh->cold = 0;
+ cache->sh->loading = 0;
+
+ ngx_log_error(NGX_LOG_NOTICE, ngx_cycle->log, 0,
+ "http file cache: %V %.3fM, bsize: %uz",
+ &cache->path->name,
+ ((double) cache->sh->size * cache->bsize) / (1024 * 1024),
+ cache->bsize);
+}
+
+
static ngx_int_t
ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache)
{
@@ -1468,6 +1500,7 @@ ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
}
cache->path->manager = ngx_http_file_cache_manager;
+ cache->path->loader = ngx_http_file_cache_loader;
cache->path->data = cache;
if (ngx_add_path(cf, &cache->path) != NGX_OK) {
diff --git a/src/http/ngx_http_upstream.c b/src/http/ngx_http_upstream.c
index 63786f6a3..df27a46ef 100644
--- a/src/http/ngx_http_upstream.c
+++ b/src/http/ngx_http_upstream.c
@@ -2063,11 +2063,6 @@ ngx_http_upstream_send_response(ngx_http_request_t *r, ngx_http_upstream_t *u)
r->cache->date = now;
r->cache->body_start = (u_short) (u->buffer.pos - u->buffer.start);
- if (r->headers_out.content_length_n != -1) {
- r->cache->length = r->cache->body_start
- + r->headers_out.content_length_n;
- }
-
ngx_http_file_cache_set_header(r, u->buffer.start);
} else {
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c
index c480d6899..21a92f178 100644
--- a/src/os/unix/ngx_process.c
+++ b/src/os/unix/ngx_process.c
@@ -214,21 +214,33 @@ ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,
switch (respawn) {
+ case NGX_PROCESS_NORESPAWN:
+ ngx_processes[s].respawn = 0;
+ ngx_processes[s].just_spawn = 0;
+ ngx_processes[s].detached = 0;
+ break;
+
+ case NGX_PROCESS_JUST_SPAWN:
+ ngx_processes[s].respawn = 0;
+ ngx_processes[s].just_spawn = 1;
+ ngx_processes[s].detached = 0;
+ break;
+
case NGX_PROCESS_RESPAWN:
ngx_processes[s].respawn = 1;
- ngx_processes[s].just_respawn = 0;
+ ngx_processes[s].just_spawn = 0;
ngx_processes[s].detached = 0;
break;
case NGX_PROCESS_JUST_RESPAWN:
ngx_processes[s].respawn = 1;
- ngx_processes[s].just_respawn = 1;
+ ngx_processes[s].just_spawn = 1;
ngx_processes[s].detached = 0;
break;
case NGX_PROCESS_DETACHED:
ngx_processes[s].respawn = 0;
- ngx_processes[s].just_respawn = 0;
+ ngx_processes[s].just_spawn = 0;
ngx_processes[s].detached = 1;
break;
}
diff --git a/src/os/unix/ngx_process.h b/src/os/unix/ngx_process.h
index a34ca6142..aba0b5169 100644
--- a/src/os/unix/ngx_process.h
+++ b/src/os/unix/ngx_process.h
@@ -27,7 +27,7 @@ typedef struct {
char *name;
unsigned respawn:1;
- unsigned just_respawn:1;
+ unsigned just_spawn:1;
unsigned detached:1;
unsigned exiting:1;
unsigned exited:1;
@@ -45,9 +45,10 @@ typedef struct {
#define NGX_MAX_PROCESSES 1024
#define NGX_PROCESS_NORESPAWN -1
-#define NGX_PROCESS_RESPAWN -2
-#define NGX_PROCESS_JUST_RESPAWN -3
-#define NGX_PROCESS_DETACHED -4
+#define NGX_PROCESS_JUST_SPAWN -2
+#define NGX_PROCESS_RESPAWN -3
+#define NGX_PROCESS_JUST_RESPAWN -4
+#define NGX_PROCESS_DETACHED -5
#define ngx_getpid getpid
diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c
index 1ee278fe8..684640138 100644
--- a/src/os/unix/ngx_process_cycle.c
+++ b/src/os/unix/ngx_process_cycle.c
@@ -12,7 +12,9 @@
static void ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n,
ngx_int_t type);
-static void ngx_start_cache_manager_process(ngx_cycle_t *cycle, ngx_int_t type);
+static void ngx_start_cache_manager_processes(ngx_cycle_t *cycle,
+ ngx_uint_t respawn);
+static void ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch);
static void ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo);
static ngx_uint_t ngx_reap_children(ngx_cycle_t *cycle);
static void ngx_master_process_exit(ngx_cycle_t *cycle);
@@ -26,6 +28,7 @@ static ngx_thread_value_t ngx_worker_thread_cycle(void *data);
#endif
static void ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data);
static void ngx_cache_manager_process_handler(ngx_event_t *ev);
+static void ngx_cache_loader_process_handler(ngx_event_t *ev);
ngx_uint_t ngx_process;
@@ -62,6 +65,15 @@ u_long cpu_affinity;
static u_char master_process[] = "master process";
+static ngx_cache_manager_ctx_t ngx_cache_manager_ctx = {
+ ngx_cache_manager_process_handler, "cache manager process", 0
+};
+
+static ngx_cache_manager_ctx_t ngx_cache_loader_ctx = {
+ ngx_cache_loader_process_handler, "cache loader process", 60000
+};
+
+
static ngx_cycle_t ngx_exit_cycle;
static ngx_log_t ngx_exit_log;
static ngx_open_file_t ngx_exit_log_file;
@@ -123,7 +135,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
- ngx_start_cache_manager_process(cycle, NGX_PROCESS_RESPAWN);
+ ngx_start_cache_manager_processes(cycle, 0);
ngx_new_binary = 0;
delay = 0;
@@ -207,7 +219,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
if (ngx_new_binary) {
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
- ngx_start_cache_manager_process(cycle, NGX_PROCESS_RESPAWN);
+ ngx_start_cache_manager_processes(cycle, 0);
ngx_noaccepting = 0;
continue;
@@ -226,7 +238,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
ngx_core_module);
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_JUST_RESPAWN);
- ngx_start_cache_manager_process(cycle, NGX_PROCESS_JUST_RESPAWN);
+ ngx_start_cache_manager_processes(cycle, 1);
live = 1;
ngx_signal_worker_processes(cycle,
ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
@@ -236,7 +248,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
ngx_restart = 0;
ngx_start_worker_processes(cycle, ccf->worker_processes,
NGX_PROCESS_RESPAWN);
- ngx_start_cache_manager_process(cycle, NGX_PROCESS_RESPAWN);
+ ngx_start_cache_manager_processes(cycle, 0);
live = 1;
}
@@ -321,7 +333,7 @@ ngx_single_process_cycle(ngx_cycle_t *cycle)
static void
ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
{
- ngx_int_t i, s;
+ ngx_int_t i;
ngx_channel_t ch;
ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");
@@ -339,58 +351,70 @@ ngx_start_worker_processes(ngx_cycle_t *cycle, ngx_int_t n, ngx_int_t type)
ch.slot = ngx_process_slot;
ch.fd = ngx_processes[ngx_process_slot].channel[0];
- for (s = 0; s < ngx_last_process; s++) {
-
- if (s == ngx_process_slot
- || ngx_processes[s].pid == -1
- || ngx_processes[s].channel[0] == -1)
- {
- continue;
- }
-
- ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0,
- "pass channel s:%d pid:%P fd:%d to s:%i pid:%P fd:%d",
- ch.slot, ch.pid, ch.fd,
- s, ngx_processes[s].pid,
- ngx_processes[s].channel[0]);
-
- /* TODO: NGX_AGAIN */
-
- ngx_write_channel(ngx_processes[s].channel[0],
- &ch, sizeof(ngx_channel_t), cycle->log);
- }
+ ngx_pass_open_channel(cycle, &ch);
}
}
static void
-ngx_start_cache_manager_process(ngx_cycle_t *cycle, ngx_int_t type)
+ngx_start_cache_manager_processes(ngx_cycle_t *cycle, ngx_uint_t respawn)
{
- ngx_int_t i;
- ngx_uint_t n;
+ ngx_uint_t i, manager, loader;
ngx_path_t **path;
ngx_channel_t ch;
+ manager = 0;
+ loader = 0;
+
path = ngx_cycle->pathes.elts;
- for (n = 0; n < ngx_cycle->pathes.nelts; n++) {
- if (path[n]->manager) {
- goto start;
+ for (i = 0; i < ngx_cycle->pathes.nelts; i++) {
+
+ if (path[i]->manager) {
+ manager = 1;
+ }
+
+ if (path[i]->loader) {
+ loader = 1;
}
}
- return;
+ if (manager == 0) {
+ return;
+ }
-start:
+ ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,
+ &ngx_cache_manager_ctx, "cache manager process",
+ respawn ? NGX_PROCESS_JUST_RESPAWN : NGX_PROCESS_RESPAWN);
ch.command = NGX_CMD_OPEN_CHANNEL;
+ ch.pid = ngx_processes[ngx_process_slot].pid;
+ ch.slot = ngx_process_slot;
+ ch.fd = ngx_processes[ngx_process_slot].channel[0];
+
+ ngx_pass_open_channel(cycle, &ch);
- ngx_spawn_process(cycle, ngx_cache_manager_process_cycle, NULL,
- "cache manager process", type);
+ if (loader == 0) {
+ return;
+ }
+ ngx_spawn_process(cycle, ngx_cache_manager_process_cycle,
+ &ngx_cache_loader_ctx, "cache loader process",
+ respawn ? NGX_PROCESS_JUST_SPAWN : NGX_PROCESS_NORESPAWN);
+
+ ch.command = NGX_CMD_OPEN_CHANNEL;
ch.pid = ngx_processes[ngx_process_slot].pid;
ch.slot = ngx_process_slot;
ch.fd = ngx_processes[ngx_process_slot].channel[0];
+ ngx_pass_open_channel(cycle, &ch);
+}
+
+
+static void
+ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch)
+{
+ ngx_int_t i;
+
for (i = 0; i < ngx_last_process; i++) {
if (i == ngx_process_slot
@@ -402,14 +426,14 @@ start:
ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0,
"pass channel s:%d pid:%P fd:%d to s:%i pid:%P fd:%d",
- ch.slot, ch.pid, ch.fd,
+ ch->slot, ch->pid, ch->fd,
i, ngx_processes[i].pid,
ngx_processes[i].channel[0]);
/* TODO: NGX_AGAIN */
ngx_write_channel(ngx_processes[i].channel[0],
- &ch, sizeof(ngx_channel_t), cycle->log);
+ ch, sizeof(ngx_channel_t), cycle->log);
}
}
@@ -460,14 +484,14 @@ ngx_signal_worker_processes(ngx_cycle_t *cycle, int signo)
ngx_processes[i].exited,
ngx_processes[i].detached,
ngx_processes[i].respawn,
- ngx_processes[i].just_respawn);
+ ngx_processes[i].just_spawn);
if (ngx_processes[i].detached || ngx_processes[i].pid == -1) {
continue;
}
- if (ngx_processes[i].just_respawn) {
- ngx_processes[i].just_respawn = 0;
+ if (ngx_processes[i].just_spawn) {
+ ngx_processes[i].just_spawn = 0;
continue;
}
@@ -536,7 +560,7 @@ ngx_reap_children(ngx_cycle_t *cycle)
ngx_processes[i].exited,
ngx_processes[i].detached,
ngx_processes[i].respawn,
- ngx_processes[i].just_respawn);
+ ngx_processes[i].just_spawn);
if (ngx_processes[i].pid == -1) {
continue;
@@ -593,26 +617,7 @@ ngx_reap_children(ngx_cycle_t *cycle)
ch.slot = ngx_process_slot;
ch.fd = ngx_processes[ngx_process_slot].channel[0];
- for (n = 0; n < ngx_last_process; n++) {
-
- if (n == ngx_process_slot
- || ngx_processes[n].pid == -1
- || ngx_processes[n].channel[0] == -1)
- {
- continue;
- }
-
- ngx_log_debug6(NGX_LOG_DEBUG_CORE, cycle->log, 0,
- "pass channel s:%d pid:%P fd:%d to s:%i pid:%P fd:%d",
- ch.slot, ch.pid, ch.fd,
- n, ngx_processes[n].pid,
- ngx_processes[n].channel[0]);
-
- /* TODO: NGX_AGAIN */
-
- ngx_write_channel(ngx_processes[n].channel[0],
- &ch, sizeof(ngx_channel_t), cycle->log);
- }
+ ngx_pass_open_channel(cycle, &ch);
live = 1;
@@ -1268,6 +1273,8 @@ ngx_worker_thread_cycle(void *data)
static void
ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data)
{
+ ngx_cache_manager_ctx_t *ctx = data;
+
void *ident[4];
ngx_event_t ev;
@@ -1278,16 +1285,16 @@ ngx_cache_manager_process_cycle(ngx_cycle_t *cycle, void *data)
ngx_close_listening_sockets(cycle);
ngx_memzero(&ev, sizeof(ngx_event_t));
- ev.handler = ngx_cache_manager_process_handler;
+ ev.handler = ctx->handler;
ev.data = ident;
ev.log = cycle->log;
ident[3] = (void *) -1;
ngx_use_accept_mutex = 0;
- ngx_setproctitle("cache manager process");
+ ngx_setproctitle(ctx->name);
- ngx_add_timer(&ev, 0);
+ ngx_add_timer(&ev, ctx->delay);
for ( ;; ) {
@@ -1334,3 +1341,29 @@ ngx_cache_manager_process_handler(ngx_event_t *ev)
ngx_add_timer(ev, next * 1000);
}
+
+
+static void
+ngx_cache_loader_process_handler(ngx_event_t *ev)
+{
+ ngx_uint_t i;
+ ngx_path_t **path;
+ ngx_cycle_t *cycle;
+
+ cycle = (ngx_cycle_t *) ngx_cycle;
+
+ path = cycle->pathes.elts;
+ for (i = 0; i < cycle->pathes.nelts; i++) {
+
+ if (ngx_terminate || ngx_quit) {
+ break;
+ }
+
+ if (path[i]->loader) {
+ path[i]->loader(path[i]->data);
+ ngx_time_update(0, 0);
+ }
+ }
+
+ exit(0);
+}
diff --git a/src/os/unix/ngx_process_cycle.h b/src/os/unix/ngx_process_cycle.h
index 9bf04749f..f46ad463f 100644
--- a/src/os/unix/ngx_process_cycle.h
+++ b/src/os/unix/ngx_process_cycle.h
@@ -25,6 +25,13 @@
#define NGX_PROCESS_SIGNALLER 3
+typedef struct {
+ ngx_event_handler_pt handler;
+ char *name;
+ ngx_msec_t delay;
+} ngx_cache_manager_ctx_t;
+
+
void ngx_master_process_cycle(ngx_cycle_t *cycle);
void ngx_single_process_cycle(ngx_cycle_t *cycle);
diff --git a/src/os/win32/ngx_process.c b/src/os/win32/ngx_process.c
index e7c283612..e57adb484 100644
--- a/src/os/win32/ngx_process.c
+++ b/src/os/win32/ngx_process.c
@@ -163,11 +163,11 @@ ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)
switch (respawn) {
case NGX_PROCESS_RESPAWN:
- ngx_processes[s].just_respawn = 0;
+ ngx_processes[s].just_spawn = 0;
break;
case NGX_PROCESS_JUST_RESPAWN:
- ngx_processes[s].just_respawn = 1;
+ ngx_processes[s].just_spawn = 1;
break;
}
diff --git a/src/os/win32/ngx_process.h b/src/os/win32/ngx_process.h
index 520a55bb2..edcde3918 100644
--- a/src/os/win32/ngx_process.h
+++ b/src/os/win32/ngx_process.h
@@ -33,7 +33,7 @@ typedef struct {
u_char quit_event[NGX_PROCESS_SYNC_NAME];
u_char reopen_event[NGX_PROCESS_SYNC_NAME];
- unsigned just_respawn:1;
+ unsigned just_spawn:1;
unsigned exiting:1;
} ngx_process_t;
diff --git a/src/os/win32/ngx_process_cycle.c b/src/os/win32/ngx_process_cycle.c
index 12b13d17e..7a4b9556f 100644
--- a/src/os/win32/ngx_process_cycle.c
+++ b/src/os/win32/ngx_process_cycle.c
@@ -25,6 +25,7 @@ static void ngx_worker_process_exit(ngx_cycle_t *cycle);
static ngx_thread_value_t __stdcall ngx_worker_thread(void *data);
static ngx_thread_value_t __stdcall ngx_cache_manager_thread(void *data);
static void ngx_cache_manager_process_handler(void);
+static ngx_thread_value_t __stdcall ngx_cache_loader_thread(void *data);
ngx_uint_t ngx_process;
@@ -440,10 +441,10 @@ ngx_quit_worker_processes(ngx_cycle_t *cycle, ngx_uint_t old)
ngx_processes[n].pid,
ngx_processes[n].handle,
ngx_processes[n].exiting,
- ngx_processes[n].just_respawn);
+ ngx_processes[n].just_spawn);
- if (old && ngx_processes[n].just_respawn) {
- ngx_processes[n].just_respawn = 0;
+ if (old && ngx_processes[n].just_spawn) {
+ ngx_processes[n].just_spawn = 0;
continue;
}
@@ -550,7 +551,7 @@ found:
ngx_processes[n].pid,
ngx_processes[n].handle,
ngx_processes[n].exiting,
- ngx_processes[n].just_respawn);
+ ngx_processes[n].just_spawn);
if (ngx_processes[n].handle) {
return 1;
@@ -670,6 +671,10 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn)
goto failed;
}
+ if (ngx_create_thread(&cmtid, ngx_cache_loader_thread, NULL, log) != 0) {
+ goto failed;
+ }
+
for ( ;; ) {
ev = WaitForMultipleObjects(3, events, 0, INFINITE);
@@ -925,7 +930,7 @@ ngx_cache_manager_thread(void *data)
return 0;
}
- break;
+ break;
}
for ( ;; ) {
@@ -985,6 +990,34 @@ ngx_cache_manager_process_handler(void)
}
+static ngx_thread_value_t __stdcall
+ngx_cache_loader_thread(void *data)
+{
+ ngx_uint_t i;
+ ngx_path_t **path;
+ ngx_cycle_t *cycle;
+
+ ngx_msleep(60000);
+
+ cycle = (ngx_cycle_t *) ngx_cycle;
+
+ path = cycle->pathes.elts;
+ for (i = 0; i < cycle->pathes.nelts; i++) {
+
+ if (ngx_terminate || ngx_quit) {
+ break;
+ }
+
+ if (path[i]->loader) {
+ path[i]->loader(path[i]->data);
+ ngx_time_update(0, 0);
+ }
+ }
+
+ return 0;
+}
+
+
void
ngx_single_process_cycle(ngx_cycle_t *cycle)
{