nginx-0.0.7-2004-06-28-20:05:02 import
diff --git a/src/core/ngx_atomic.h b/src/core/ngx_atomic.h
index bbf4a76..a149ad2 100644
--- a/src/core/ngx_atomic.h
+++ b/src/core/ngx_atomic.h
@@ -72,13 +72,19 @@
#define ngx_atomic_inc(p) InterlockedIncrement((long *) p)
#define ngx_atomic_dec(p) InterlockedDecrement((long *) p)
-/* STUB */
-#define ngx_atomic_cmp_set(lock, old, set) 1
-#if 0
-#define ngx_atomic_cmp_set(lock, old, set) \
- InterlockedCompareExchange(lock, set, old)
-#endif
+#if defined(__WATCOMC__) || defined(__BORLANDC__)
+
+#define ngx_atomic_cmp_set(lock, old, set) \
+ (InterlockedCompareExchange((long *) lock, set, old) == old)
+
+#else
+
+#define ngx_atomic_cmp_set(lock, old, set) \
+ (InterlockedCompareExchange((void **) lock, (void *) set, (void *) old) \
+ == (void *) old)
+
+#endif
#else
@@ -93,18 +99,8 @@
#endif
-static ngx_inline ngx_int_t ngx_trylock(ngx_atomic_t *lock)
-{
- if (*lock) {
- return NGX_BUSY;
- }
-
- if (ngx_atomic_cmp_set(lock, 0, 1)) {
- return NGX_OK;
- }
-
- return NGX_BUSY;
-}
+#define ngx_trylock(lock) (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))
+#define ngx_unlock(lock) *(lock) = 0
#endif /* _NGX_ATOMIC_H_INCLUDED_ */
diff --git a/src/core/ngx_times.h b/src/core/ngx_times.h
index 1fb712d..b5b6eb6 100644
--- a/src/core/ngx_times.h
+++ b/src/core/ngx_times.h
@@ -28,9 +28,9 @@
#endif
-extern volatile ngx_str_t ngx_cached_err_log_time;
-extern volatile ngx_str_t ngx_cached_http_time;
-extern volatile ngx_str_t ngx_cached_http_log_time;
+extern ngx_thread_volatile ngx_str_t ngx_cached_err_log_time;
+extern ngx_thread_volatile ngx_str_t ngx_cached_http_time;
+extern ngx_thread_volatile ngx_str_t ngx_cached_http_log_time;
extern ngx_epoch_msec_t ngx_start_msec;
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 001d6a8..99370ac 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -361,11 +361,10 @@
return NGX_ERROR;
}
- /*
- * TODO: if timer is NGX_TIMER_INFINITE and any worker thread
- * is still busy then set the configurable 500ms timeout
- * to wake up another worker thread
- */
+ if (timer == NGX_TIMER_INFINITE || timer > 500) {
+ timer = 500;
+ break;
+ }
#endif
@@ -461,12 +460,17 @@
}
}
- if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
- ngx_accept_mutex_unlock();
- return NGX_ERROR;
- }
+ if (events > 0) {
+ if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
+ ngx_accept_mutex_unlock();
+ return NGX_ERROR;
+ }
- lock = 1;
+ lock = 1;
+
+ } else {
+ lock =0;
+ }
for (i = 0; i < events; i++) {
@@ -588,7 +592,7 @@
if (ngx_posted_events) {
if (ngx_threaded) {
- ngx_cv_signal(ngx_posted_events_cv);
+ ngx_cond_signal(ngx_posted_events_cv);
} else {
ngx_event_process_posted(cycle);
diff --git a/src/event/ngx_event_posted.c b/src/event/ngx_event_posted.c
index 4787443..b103159 100644
--- a/src/event/ngx_event_posted.c
+++ b/src/event/ngx_event_posted.c
@@ -8,7 +8,7 @@
#if (NGX_THREADS)
ngx_mutex_t *ngx_posted_events_mutex;
-ngx_cv_t *ngx_posted_events_cv;
+ngx_cond_t *ngx_posted_events_cv;
#endif
@@ -76,7 +76,7 @@
return NGX_OK;
}
- if (ngx_trylock(ev->lock) == NGX_BUSY) {
+ if (ngx_trylock(ev->lock) == 0) {
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"posted event " PTR_FMT " is busy", ev);
@@ -112,7 +112,7 @@
ev->event_handler(ev);
- *(ev->lock) = 0;
+ ngx_unlock(ev->lock);
if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
return NGX_ERROR;
diff --git a/src/event/ngx_event_posted.h b/src/event/ngx_event_posted.h
index b060cc6..ba484fa 100644
--- a/src/event/ngx_event_posted.h
+++ b/src/event/ngx_event_posted.h
@@ -22,7 +22,7 @@
ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle);
extern ngx_mutex_t *ngx_posted_events_mutex;
-extern ngx_cv_t *ngx_posted_events_cv;
+extern ngx_cond_t *ngx_posted_events_cv;
#endif
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c
index fb401cf..0f6de67 100644
--- a/src/event/ngx_event_timer.c
+++ b/src/event/ngx_event_timer.c
@@ -71,7 +71,7 @@
for ( ;; ) {
if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
- break;
+ return;
}
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
@@ -81,17 +81,35 @@
node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree,
&ngx_event_timer_sentinel);
- ngx_mutex_unlock(ngx_event_timer_mutex);
-
if (node->key <= (ngx_msec_t)
(ngx_old_elapsed_msec + timer) / NGX_TIMER_RESOLUTION)
{
ev = (ngx_event_t *)
((char *) node - offsetof(ngx_event_t, rbtree_key));
- ngx_del_timer(ev);
+ if (ngx_trylock(ev->lock) == 0) {
+ break;
+ }
+ ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
+ "event timer del: %d: %d",
+ ngx_event_ident(ev->data), ev->rbtree_key);
+
+ ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree,
+ &ngx_event_timer_sentinel,
+ (ngx_rbtree_t *) &ev->rbtree_key);
+
+ ngx_mutex_unlock(ngx_event_timer_mutex);
+
+#if (NGX_DEBUG)
+ ev->rbtree_left = NULL;
+ ev->rbtree_right = NULL;
+ ev->rbtree_parent = NULL;
+#endif
+
+ ev->timer_set = 0;
ev->timedout = 1;
+ ngx_unlock(ev->lock);
if (ngx_threaded) {
if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
@@ -107,7 +125,8 @@
ev->event_handler(ev);
continue;
}
-
break;
}
+
+ ngx_mutex_unlock(ngx_event_timer_mutex);
}
diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h
index e7e49d2..0ff6405 100644
--- a/src/event/ngx_event_timer.h
+++ b/src/event/ngx_event_timer.h
@@ -42,19 +42,15 @@
"event timer del: %d: %d",
ngx_event_ident(ev->data), ev->rbtree_key);
-#if (NGX_THREADS)
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
return;
}
-#endif
ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree,
&ngx_event_timer_sentinel,
(ngx_rbtree_t *) &ev->rbtree_key);
-#if (NGX_THREADS)
ngx_mutex_unlock(ngx_event_timer_mutex);
-#endif
#if (NGX_DEBUG)
ev->rbtree_left = NULL;
@@ -101,19 +97,15 @@
"event timer add: %d: %d",
ngx_event_ident(ev->data), ev->rbtree_key);
-#if (NGX_THREADS)
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
return;
}
-#endif
ngx_rbtree_insert((ngx_rbtree_t **) &ngx_event_timer_rbtree,
&ngx_event_timer_sentinel,
(ngx_rbtree_t *) &ev->rbtree_key);
-#if (NGX_THREADS)
ngx_mutex_unlock(ngx_event_timer_mutex);
-#endif
ev->timer_set = 1;
}
diff --git a/src/os/unix/ngx_freebsd_rfork_thread.c b/src/os/unix/ngx_freebsd_rfork_thread.c
index c4cd302..73c5152 100644
--- a/src/os/unix/ngx_freebsd_rfork_thread.c
+++ b/src/os/unix/ngx_freebsd_rfork_thread.c
@@ -459,6 +459,11 @@
/* free the mutex */
+#if 0
+ ngx_log_debug2(NGX_LOG_DEBUG_CORE, m->log, 0,
+ "unlock mutex " PTR_FMT " lock:%X", m, old);
+#endif
+
for ( ;; ) {
lock = old & ~NGX_MUTEX_LOCK_BUSY;
@@ -524,33 +529,29 @@
}
-ngx_cv_t *ngx_cv_init(ngx_log_t *log)
+ngx_cond_t *ngx_cond_init(ngx_log_t *log)
{
- ngx_cv_t *cv;
- u_short val[2];
+ ngx_cond_t *cv;
union semun op;
- if (!(cv = ngx_alloc(sizeof(ngx_cv_t), log))) {
+ if (!(cv = ngx_alloc(sizeof(ngx_cond_t), log))) {
return NULL;
}
- cv->mutex.lock = 0;
- cv->mutex.log = log;
+ cv->log = log;
- cv->mutex.semid = semget(IPC_PRIVATE, 2, SEM_R|SEM_A);
- if (cv->mutex.semid == -1) {
+ cv->semid = semget(IPC_PRIVATE, 2, SEM_R|SEM_A);
+ if (cv->semid == -1) {
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semget() failed");
return NULL;
}
- val[0] = 0;
- val[1] = 0;
- op.array = val;
+ op.val = 0;
- if (semctl(cv->mutex.semid, 0, SETALL, op) == -1) {
- ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semctl(SETALL) failed");
+ if (semctl(cv->semid, 0, SETVAL, op) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semctl(SETVAL) failed");
- if (semctl(cv->mutex.semid, 0, IPC_RMID) == -1) {
+ if (semctl(cv->semid, 0, IPC_RMID) == -1) {
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
"semctl(IPC_RMID) failed");
}
@@ -562,10 +563,10 @@
}
-void ngx_cv_done(ngx_cv_t *cv)
+void ngx_cond_done(ngx_cond_t *cv)
{
- if (semctl(cv->mutex.semid, 0, IPC_RMID) == -1) {
- ngx_log_error(NGX_LOG_ALERT, cv->mutex.log, ngx_errno,
+ if (semctl(cv->semid, 0, IPC_RMID) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno,
"semctl(IPC_RMID) failed");
}
@@ -573,56 +574,52 @@
}
-ngx_int_t ngx_cv_wait(ngx_cv_t *cv)
+ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m)
{
- struct sembuf op[2];
+ struct sembuf op;
- ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->mutex.log, 0,
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0,
"cv " PTR_FMT " wait", cv);
- op[0].sem_num = 0;
- op[0].sem_op = -1;
- op[0].sem_flg = SEM_UNDO;
+ op.sem_num = 0;
+ op.sem_op = -1;
+ op.sem_flg = SEM_UNDO;
- op[1].sem_num = 1;
- op[1].sem_op = -1;
- op[1].sem_flg = SEM_UNDO;
-
- if (semop(cv->mutex.semid, op, 2) == -1) {
- ngx_log_error(NGX_LOG_ALERT, cv->mutex.log, ngx_errno,
+ if (semop(cv->semid, &op, 1) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno,
"semop() failed while waiting on cv " PTR_FMT, cv);
return NGX_ERROR;
}
- ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->mutex.log, 0,
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0,
"cv " PTR_FMT " is waked up", cv);
+ if (ngx_mutex_lock(m) == NGX_ERROR) {
+ return NGX_ERROR;
+ }
+
return NGX_OK;
}
-ngx_int_t ngx_cv_signal(ngx_cv_t *cv)
+ngx_int_t ngx_cond_signal(ngx_cond_t *cv)
{
- struct sembuf op[2];
+ struct sembuf op;
- ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->mutex.log, 0,
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0,
"cv " PTR_FMT " to signal", cv);
- op[0].sem_num = 0;
- op[0].sem_op = 1;
- op[0].sem_flg = SEM_UNDO;
+ op.sem_num = 0;
+ op.sem_op = 1;
+ op.sem_flg = SEM_UNDO;
- op[1].sem_num = 1;
- op[1].sem_op = 1;
- op[1].sem_flg = SEM_UNDO;
-
- if (semop(cv->mutex.semid, op, 2) == -1) {
- ngx_log_error(NGX_LOG_ALERT, cv->mutex.log, ngx_errno,
+ if (semop(cv->semid, &op, 1) == -1) {
+ ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno,
"semop() failed while signaling cv " PTR_FMT, cv);
return NGX_ERROR;
}
- ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->mutex.log, 0,
+ ngx_log_debug1(NGX_LOG_DEBUG_CORE, cv->log, 0,
"cv " PTR_FMT " is signaled", cv);
return NGX_OK;
diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c
index 6d7fe06..dd50bba 100644
--- a/src/os/unix/ngx_process_cycle.c
+++ b/src/os/unix/ngx_process_cycle.c
@@ -625,14 +625,12 @@
exit(2);
}
- if (!(ngx_posted_events_cv = ngx_cv_init(cycle->log))) {
+ if (!(ngx_posted_events_cv = ngx_cond_init(cycle->log))) {
/* fatal */
exit(2);
}
- ngx_posted_events_mutex = &ngx_posted_events_cv->mutex;
-
- for (i = 0; i < 1; i++) {
+ for (i = 0; i < 2; i++) {
if (ngx_create_thread(&tid, ngx_worker_thread_cycle,
cycle, cycle->log) != 0)
{
@@ -780,7 +778,9 @@
ngx_setproctitle("worker thread");
for ( ;; ) {
- if (ngx_cv_wait(ngx_posted_events_cv) == NGX_ERROR) {
+ if (ngx_cond_wait(ngx_posted_events_cv, ngx_posted_events_mutex)
+ == NGX_ERROR)
+ {
return 1;
}
diff --git a/src/os/unix/ngx_thread.h b/src/os/unix/ngx_thread.h
index 6412fe8..c91ff99 100644
--- a/src/os/unix/ngx_thread.h
+++ b/src/os/unix/ngx_thread.h
@@ -37,8 +37,9 @@
typedef struct {
- ngx_mutex_t mutex;
-} ngx_cv_t;
+ int semid;
+ ngx_log_t *log;
+} ngx_cond_t;
#define ngx_thread_sigmask(how, set, oset) \
@@ -107,10 +108,10 @@
ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m);
-ngx_cv_t *ngx_cv_init(ngx_log_t *log);
-void ngx_cv_done(ngx_cv_t *cv);
-ngx_int_t ngx_cv_wait(ngx_cv_t *cv);
-ngx_int_t ngx_cv_signal(ngx_cv_t *cv);
+ngx_cond_t *ngx_cond_init(ngx_log_t *log);
+void ngx_cond_done(ngx_cond_t *cv);
+ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m);
+ngx_int_t ngx_cond_signal(ngx_cond_t *cv);
#else /* !NGX_THREADS */
diff --git a/src/os/win32/ngx_win32_config.h b/src/os/win32/ngx_win32_config.h
index 72e5c5e..c48fb38 100644
--- a/src/os/win32/ngx_win32_config.h
+++ b/src/os/win32/ngx_win32_config.h
@@ -104,6 +104,8 @@
typedef uint32_t ngx_atomic_t;
+#define TIME_T_LEN sizeof("-2147483648") - 1
+
#define OFF_T_FMT "%I64d"
#define SIZE_T_FMT "%d"
#define SIZE_T_X_FMT "%x"