aboutsummaryrefslogtreecommitdiff
path: root/src/os/unix
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2004-06-28 16:05:02 +0000
committerIgor Sysoev <igor@sysoev.ru>2004-06-28 16:05:02 +0000
commitb14b91020284baf090b40bdb6ba87b99751f27fb (patch)
tree5c0a3b3cd099910a1d9698b6972db858839b3067 /src/os/unix
parentc02473048cee372cb8644e1f2d566431781074d2 (diff)
downloadnginx-b14b91020284baf090b40bdb6ba87b99751f27fb.tar.gz
nginx-b14b91020284baf090b40bdb6ba87b99751f27fb.zip
nginx-0.0.7-2004-06-28-20:05:02 import
Diffstat (limited to 'src/os/unix')
-rw-r--r--src/os/unix/ngx_freebsd_rfork_thread.c83
-rw-r--r--src/os/unix/ngx_process_cycle.c10
-rw-r--r--src/os/unix/ngx_thread.h13
3 files changed, 52 insertions, 54 deletions
diff --git a/src/os/unix/ngx_freebsd_rfork_thread.c b/src/os/unix/ngx_freebsd_rfork_thread.c
index c4cd30205..73c515221 100644
--- a/src/os/unix/ngx_freebsd_rfork_thread.c
+++ b/src/os/unix/ngx_freebsd_rfork_thread.c
@@ -459,6 +459,11 @@ ngx_int_t ngx_mutex_unlock(ngx_mutex_t *m)
/* 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_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;
- 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 @@ 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) {
- 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 @@ 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);
- 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[1].sem_num = 1;
- op[1].sem_op = 1;
- op[1].sem_flg = SEM_UNDO;
+ op.sem_num = 0;
+ op.sem_op = 1;
+ op.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 6d7fe06c2..dd50bba25 100644
--- a/src/os/unix/ngx_process_cycle.c
+++ b/src/os/unix/ngx_process_cycle.c
@@ -625,14 +625,12 @@ static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
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 @@ int ngx_worker_thread_cycle(void *data)
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 6412fe8b2..c91ff9986 100644
--- a/src/os/unix/ngx_thread.h
+++ b/src/os/unix/ngx_thread.h
@@ -37,8 +37,9 @@ typedef volatile struct {
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_dolock(ngx_mutex_t *m, ngx_int_t try);
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 */