mirror of
https://github.com/nginx/nginx.git
synced 2025-06-07 17:52:38 +08:00
nginx-0.0.7-2004-06-28-20:05:02 import
This commit is contained in:
parent
c02473048c
commit
b14b910202
@ -72,13 +72,19 @@ static ngx_inline uint32_t ngx_atomic_cmp_set(ngx_atomic_t *lock,
|
|||||||
|
|
||||||
#define ngx_atomic_inc(p) InterlockedIncrement((long *) p)
|
#define ngx_atomic_inc(p) InterlockedIncrement((long *) p)
|
||||||
#define ngx_atomic_dec(p) InterlockedDecrement((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
|
#else
|
||||||
|
|
||||||
@ -93,18 +99,8 @@ typedef volatile uint32_t ngx_atomic_t;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static ngx_inline ngx_int_t ngx_trylock(ngx_atomic_t *lock)
|
#define ngx_trylock(lock) (*(lock) == 0 && ngx_atomic_cmp_set(lock, 0, 1))
|
||||||
{
|
#define ngx_unlock(lock) *(lock) = 0
|
||||||
if (*lock) {
|
|
||||||
return NGX_BUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ngx_atomic_cmp_set(lock, 0, 1)) {
|
|
||||||
return NGX_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NGX_BUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* _NGX_ATOMIC_H_INCLUDED_ */
|
#endif /* _NGX_ATOMIC_H_INCLUDED_ */
|
||||||
|
@ -28,9 +28,9 @@ extern volatile time_t ngx_cached_time;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern volatile ngx_str_t ngx_cached_err_log_time;
|
extern ngx_thread_volatile ngx_str_t ngx_cached_err_log_time;
|
||||||
extern volatile ngx_str_t ngx_cached_http_time;
|
extern ngx_thread_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_http_log_time;
|
||||||
|
|
||||||
extern ngx_epoch_msec_t ngx_start_msec;
|
extern ngx_epoch_msec_t ngx_start_msec;
|
||||||
|
|
||||||
|
@ -361,11 +361,10 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle)
|
|||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
if (timer == NGX_TIMER_INFINITE || timer > 500) {
|
||||||
* TODO: if timer is NGX_TIMER_INFINITE and any worker thread
|
timer = 500;
|
||||||
* is still busy then set the configurable 500ms timeout
|
break;
|
||||||
* to wake up another worker thread
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -461,12 +460,17 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
|
if (events > 0) {
|
||||||
ngx_accept_mutex_unlock();
|
if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
|
||||||
return NGX_ERROR;
|
ngx_accept_mutex_unlock();
|
||||||
}
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
lock = 1;
|
lock = 1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
lock =0;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < events; i++) {
|
for (i = 0; i < events; i++) {
|
||||||
|
|
||||||
@ -588,7 +592,7 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle)
|
|||||||
|
|
||||||
if (ngx_posted_events) {
|
if (ngx_posted_events) {
|
||||||
if (ngx_threaded) {
|
if (ngx_threaded) {
|
||||||
ngx_cv_signal(ngx_posted_events_cv);
|
ngx_cond_signal(ngx_posted_events_cv);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ngx_event_process_posted(cycle);
|
ngx_event_process_posted(cycle);
|
||||||
|
@ -8,7 +8,7 @@ ngx_thread_volatile ngx_event_t *ngx_posted_events;
|
|||||||
|
|
||||||
#if (NGX_THREADS)
|
#if (NGX_THREADS)
|
||||||
ngx_mutex_t *ngx_posted_events_mutex;
|
ngx_mutex_t *ngx_posted_events_mutex;
|
||||||
ngx_cv_t *ngx_posted_events_cv;
|
ngx_cond_t *ngx_posted_events_cv;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle)
|
|||||||
return NGX_OK;
|
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,
|
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
|
||||||
"posted event " PTR_FMT " is busy", ev);
|
"posted event " PTR_FMT " is busy", ev);
|
||||||
@ -112,7 +112,7 @@ ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle)
|
|||||||
|
|
||||||
ev->event_handler(ev);
|
ev->event_handler(ev);
|
||||||
|
|
||||||
*(ev->lock) = 0;
|
ngx_unlock(ev->lock);
|
||||||
|
|
||||||
if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
|
if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
|
@ -22,7 +22,7 @@ extern ngx_thread_volatile ngx_event_t *ngx_posted_events;
|
|||||||
ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle);
|
ngx_int_t ngx_event_thread_process_posted(ngx_cycle_t *cycle);
|
||||||
|
|
||||||
extern ngx_mutex_t *ngx_posted_events_mutex;
|
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
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ void ngx_event_expire_timers(ngx_msec_t timer)
|
|||||||
for ( ;; ) {
|
for ( ;; ) {
|
||||||
|
|
||||||
if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
|
if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
|
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
|
||||||
@ -81,17 +81,35 @@ void ngx_event_expire_timers(ngx_msec_t timer)
|
|||||||
node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree,
|
node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree,
|
||||||
&ngx_event_timer_sentinel);
|
&ngx_event_timer_sentinel);
|
||||||
|
|
||||||
ngx_mutex_unlock(ngx_event_timer_mutex);
|
|
||||||
|
|
||||||
if (node->key <= (ngx_msec_t)
|
if (node->key <= (ngx_msec_t)
|
||||||
(ngx_old_elapsed_msec + timer) / NGX_TIMER_RESOLUTION)
|
(ngx_old_elapsed_msec + timer) / NGX_TIMER_RESOLUTION)
|
||||||
{
|
{
|
||||||
ev = (ngx_event_t *)
|
ev = (ngx_event_t *)
|
||||||
((char *) node - offsetof(ngx_event_t, rbtree_key));
|
((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;
|
ev->timedout = 1;
|
||||||
|
ngx_unlock(ev->lock);
|
||||||
|
|
||||||
if (ngx_threaded) {
|
if (ngx_threaded) {
|
||||||
if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
|
if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
|
||||||
@ -107,7 +125,8 @@ void ngx_event_expire_timers(ngx_msec_t timer)
|
|||||||
ev->event_handler(ev);
|
ev->event_handler(ev);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ngx_mutex_unlock(ngx_event_timer_mutex);
|
||||||
}
|
}
|
||||||
|
@ -42,19 +42,15 @@ ngx_inline static void ngx_event_del_timer(ngx_event_t *ev)
|
|||||||
"event timer del: %d: %d",
|
"event timer del: %d: %d",
|
||||||
ngx_event_ident(ev->data), ev->rbtree_key);
|
ngx_event_ident(ev->data), ev->rbtree_key);
|
||||||
|
|
||||||
#if (NGX_THREADS)
|
|
||||||
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
|
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree,
|
ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree,
|
||||||
&ngx_event_timer_sentinel,
|
&ngx_event_timer_sentinel,
|
||||||
(ngx_rbtree_t *) &ev->rbtree_key);
|
(ngx_rbtree_t *) &ev->rbtree_key);
|
||||||
|
|
||||||
#if (NGX_THREADS)
|
|
||||||
ngx_mutex_unlock(ngx_event_timer_mutex);
|
ngx_mutex_unlock(ngx_event_timer_mutex);
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (NGX_DEBUG)
|
#if (NGX_DEBUG)
|
||||||
ev->rbtree_left = NULL;
|
ev->rbtree_left = NULL;
|
||||||
@ -101,19 +97,15 @@ ngx_inline static void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer)
|
|||||||
"event timer add: %d: %d",
|
"event timer add: %d: %d",
|
||||||
ngx_event_ident(ev->data), ev->rbtree_key);
|
ngx_event_ident(ev->data), ev->rbtree_key);
|
||||||
|
|
||||||
#if (NGX_THREADS)
|
|
||||||
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
|
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
ngx_rbtree_insert((ngx_rbtree_t **) &ngx_event_timer_rbtree,
|
ngx_rbtree_insert((ngx_rbtree_t **) &ngx_event_timer_rbtree,
|
||||||
&ngx_event_timer_sentinel,
|
&ngx_event_timer_sentinel,
|
||||||
(ngx_rbtree_t *) &ev->rbtree_key);
|
(ngx_rbtree_t *) &ev->rbtree_key);
|
||||||
|
|
||||||
#if (NGX_THREADS)
|
|
||||||
ngx_mutex_unlock(ngx_event_timer_mutex);
|
ngx_mutex_unlock(ngx_event_timer_mutex);
|
||||||
#endif
|
|
||||||
|
|
||||||
ev->timer_set = 1;
|
ev->timer_set = 1;
|
||||||
}
|
}
|
||||||
|
@ -459,6 +459,11 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m)
|
|||||||
|
|
||||||
/* free the mutex */
|
/* 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 ( ;; ) {
|
for ( ;; ) {
|
||||||
lock = old & ~NGX_MUTEX_LOCK_BUSY;
|
lock = old & ~NGX_MUTEX_LOCK_BUSY;
|
||||||
|
|
||||||
@ -524,33 +529,29 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ngx_cv_t *ngx_cv_init(ngx_log_t *log)
|
ngx_cond_t *ngx_cond_init(ngx_log_t *log)
|
||||||
{
|
{
|
||||||
ngx_cv_t *cv;
|
ngx_cond_t *cv;
|
||||||
u_short val[2];
|
|
||||||
union semun op;
|
union semun op;
|
||||||
|
|
||||||
if (!(cv = ngx_alloc(sizeof(ngx_cv_t), log))) {
|
if (!(cv = ngx_alloc(sizeof(ngx_cond_t), log))) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
cv->mutex.lock = 0;
|
cv->log = log;
|
||||||
cv->mutex.log = log;
|
|
||||||
|
|
||||||
cv->mutex.semid = semget(IPC_PRIVATE, 2, SEM_R|SEM_A);
|
cv->semid = semget(IPC_PRIVATE, 2, SEM_R|SEM_A);
|
||||||
if (cv->mutex.semid == -1) {
|
if (cv->semid == -1) {
|
||||||
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semget() failed");
|
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semget() failed");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
val[0] = 0;
|
op.val = 0;
|
||||||
val[1] = 0;
|
|
||||||
op.array = val;
|
|
||||||
|
|
||||||
if (semctl(cv->mutex.semid, 0, SETALL, op) == -1) {
|
if (semctl(cv->semid, 0, SETVAL, op) == -1) {
|
||||||
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "semctl(SETALL) failed");
|
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,
|
ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,
|
||||||
"semctl(IPC_RMID) failed");
|
"semctl(IPC_RMID) failed");
|
||||||
}
|
}
|
||||||
@ -562,10 +563,10 @@ ngx_cv_t *ngx_cv_init(ngx_log_t *log)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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) {
|
if (semctl(cv->semid, 0, IPC_RMID) == -1) {
|
||||||
ngx_log_error(NGX_LOG_ALERT, cv->mutex.log, ngx_errno,
|
ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno,
|
||||||
"semctl(IPC_RMID) failed");
|
"semctl(IPC_RMID) failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -573,56 +574,52 @@ void ngx_cv_done(ngx_cv_t *cv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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);
|
"cv " PTR_FMT " wait", cv);
|
||||||
|
|
||||||
op[0].sem_num = 0;
|
op.sem_num = 0;
|
||||||
op[0].sem_op = -1;
|
op.sem_op = -1;
|
||||||
op[0].sem_flg = SEM_UNDO;
|
op.sem_flg = SEM_UNDO;
|
||||||
|
|
||||||
op[1].sem_num = 1;
|
if (semop(cv->semid, &op, 1) == -1) {
|
||||||
op[1].sem_op = -1;
|
ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno,
|
||||||
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,
|
|
||||||
"semop() failed while waiting on cv " PTR_FMT, cv);
|
"semop() failed while waiting on cv " PTR_FMT, cv);
|
||||||
return NGX_ERROR;
|
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);
|
"cv " PTR_FMT " is waked up", cv);
|
||||||
|
|
||||||
|
if (ngx_mutex_lock(m) == NGX_ERROR) {
|
||||||
|
return NGX_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
return NGX_OK;
|
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);
|
"cv " PTR_FMT " to signal", cv);
|
||||||
|
|
||||||
op[0].sem_num = 0;
|
op.sem_num = 0;
|
||||||
op[0].sem_op = 1;
|
op.sem_op = 1;
|
||||||
op[0].sem_flg = SEM_UNDO;
|
op.sem_flg = SEM_UNDO;
|
||||||
|
|
||||||
op[1].sem_num = 1;
|
if (semop(cv->semid, &op, 1) == -1) {
|
||||||
op[1].sem_op = 1;
|
ngx_log_error(NGX_LOG_ALERT, cv->log, ngx_errno,
|
||||||
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,
|
|
||||||
"semop() failed while signaling cv " PTR_FMT, cv);
|
"semop() failed while signaling cv " PTR_FMT, cv);
|
||||||
return NGX_ERROR;
|
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);
|
"cv " PTR_FMT " is signaled", cv);
|
||||||
|
|
||||||
return NGX_OK;
|
return NGX_OK;
|
||||||
|
@ -625,14 +625,12 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
|
|||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(ngx_posted_events_cv = ngx_cv_init(cycle->log))) {
|
if (!(ngx_posted_events_cv = ngx_cond_init(cycle->log))) {
|
||||||
/* fatal */
|
/* fatal */
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
ngx_posted_events_mutex = &ngx_posted_events_cv->mutex;
|
for (i = 0; i < 2; i++) {
|
||||||
|
|
||||||
for (i = 0; i < 1; i++) {
|
|
||||||
if (ngx_create_thread(&tid, ngx_worker_thread_cycle,
|
if (ngx_create_thread(&tid, ngx_worker_thread_cycle,
|
||||||
cycle, cycle->log) != 0)
|
cycle, cycle->log) != 0)
|
||||||
{
|
{
|
||||||
@ -780,7 +778,9 @@ int ngx_worker_thread_cycle(void *data)
|
|||||||
ngx_setproctitle("worker thread");
|
ngx_setproctitle("worker thread");
|
||||||
|
|
||||||
for ( ;; ) {
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,8 +37,9 @@ typedef volatile struct {
|
|||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ngx_mutex_t mutex;
|
int semid;
|
||||||
} ngx_cv_t;
|
ngx_log_t *log;
|
||||||
|
} ngx_cond_t;
|
||||||
|
|
||||||
|
|
||||||
#define ngx_thread_sigmask(how, set, oset) \
|
#define ngx_thread_sigmask(how, set, oset) \
|
||||||
@ -107,10 +108,10 @@ ngx_int_t ngx_mutex_dolock(ngx_mutex_t *m, ngx_int_t try);
|
|||||||
ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m);
|
ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m);
|
||||||
|
|
||||||
|
|
||||||
ngx_cv_t *ngx_cv_init(ngx_log_t *log);
|
ngx_cond_t *ngx_cond_init(ngx_log_t *log);
|
||||||
void ngx_cv_done(ngx_cv_t *cv);
|
void ngx_cond_done(ngx_cond_t *cv);
|
||||||
ngx_int_t ngx_cv_wait(ngx_cv_t *cv);
|
ngx_int_t ngx_cond_wait(ngx_cond_t *cv, ngx_mutex_t *m);
|
||||||
ngx_int_t ngx_cv_signal(ngx_cv_t *cv);
|
ngx_int_t ngx_cond_signal(ngx_cond_t *cv);
|
||||||
|
|
||||||
|
|
||||||
#else /* !NGX_THREADS */
|
#else /* !NGX_THREADS */
|
||||||
|
@ -104,6 +104,8 @@ typedef int sig_atomic_t;
|
|||||||
typedef uint32_t ngx_atomic_t;
|
typedef uint32_t ngx_atomic_t;
|
||||||
|
|
||||||
|
|
||||||
|
#define TIME_T_LEN sizeof("-2147483648") - 1
|
||||||
|
|
||||||
#define OFF_T_FMT "%I64d"
|
#define OFF_T_FMT "%I64d"
|
||||||
#define SIZE_T_FMT "%d"
|
#define SIZE_T_FMT "%d"
|
||||||
#define SIZE_T_X_FMT "%x"
|
#define SIZE_T_X_FMT "%x"
|
||||||
|
Loading…
Reference in New Issue
Block a user