diff options
author | dreid <dreid@13f79535-47bb-0310-9956-ffa450edef68> | 2000-03-14 13:11:31 +0000 |
---|---|---|
committer | dreid <dreid@13f79535-47bb-0310-9956-ffa450edef68> | 2000-03-14 13:11:31 +0000 |
commit | 164391e6a85f2b535a6155ae5494a61232dbdd31 (patch) | |
tree | 9c2056df9d6210328625d1508ad85f6f94af6909 /locks/beos | |
parent | ab9b2058355f4c8955dcc9a93c913164c2777429 (diff) | |
download | libapr-164391e6a85f2b535a6155ae5494a61232dbdd31.tar.gz |
Cleanup of the locking code for BeOS.
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@59698 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'locks/beos')
-rw-r--r-- | locks/beos/crossproc.c | 34 | ||||
-rw-r--r-- | locks/beos/intraproc.c | 29 |
2 files changed, 39 insertions, 24 deletions
diff --git a/locks/beos/crossproc.c b/locks/beos/crossproc.c index 16d4e6cac..8150b088f 100644 --- a/locks/beos/crossproc.c +++ b/locks/beos/crossproc.c @@ -60,7 +60,7 @@ ap_status_t lock_inter_cleanup(void * data) ap_lock_t *lock = (ap_lock_t*)data; if (lock->curr_locked == 1) { if (atomic_add(&lock->ben_interproc , -1) > 1){ - release_sem (lock->sem_interproc); + release_sem (lock->sem_interproc); } } return APR_SUCCESS; @@ -68,16 +68,18 @@ ap_status_t lock_inter_cleanup(void * data) ap_status_t create_inter_lock(ap_lock_t *new) { + int32 stat; + new->sem_interproc = (sem_id)ap_palloc(new->cntxt, sizeof(sem_id)); new->ben_interproc = (int32)ap_palloc(new->cntxt, sizeof(int32)); - new->ben_interproc = 0; - new->sem_interproc = create_sem(0, "ap_interproc"); - if (new->sem_interproc < B_NO_ERROR){ - lock_inter_cleanup(new); - return errno; + if ((stat = create_sem(0, "ap_interproc")) < B_NO_ERROR) { + lock_inter_cleanup(new); + return stat; } + new->ben_interproc = 0; new->curr_locked = 0; + new->sem_interproc = stat; ap_register_cleanup(new->cntxt, (void *)new, lock_inter_cleanup, ap_null_cleanup); return APR_SUCCESS; @@ -85,10 +87,13 @@ ap_status_t create_inter_lock(ap_lock_t *new) ap_status_t lock_inter(ap_lock_t *lock) { + int32 stat; + if (atomic_add(&lock->ben_interproc, 1) > 0){ - acquire_sem(lock->sem_interproc); - } else { - return errno; + if ((stat = acquire_sem(lock->sem_interproc)) != B_NO_ERROR){ + atomic_add(&lock->ben_interproc, -1); + return stat; + } } lock->curr_locked = 1; return APR_SUCCESS; @@ -96,12 +101,15 @@ ap_status_t lock_inter(ap_lock_t *lock) ap_status_t unlock_inter(ap_lock_t *lock) { + int32 stat; + if (atomic_add(&lock->ben_interproc, -1) > 1){ - release_sem(lock->sem_interproc); - lock->curr_locked = 0; - } else { - return errno; + if ((stat = release_sem(lock->sem_interproc)) != B_NO_ERROR) { + atomic_add(&lock->ben_interproc, 1); + return stat; + } } + lock->curr_locked = 0; return APR_SUCCESS; } diff --git a/locks/beos/intraproc.c b/locks/beos/intraproc.c index 7cdd5c2a2..a7eb0a503 100644 --- a/locks/beos/intraproc.c +++ b/locks/beos/intraproc.c @@ -60,9 +60,9 @@ ap_status_t lock_intra_cleanup(void *data) ap_lock_t *lock = (ap_lock_t *)data; if (lock->curr_locked == 1) { if (atomic_add(&lock->ben_intraproc , -1) > 1){ - release_sem (lock->sem_intraproc); + release_sem (lock->sem_intraproc); } else { - return errno; + return errno; } } return APR_SUCCESS; @@ -74,12 +74,12 @@ ap_status_t create_intra_lock(struct lock_t *new) new->sem_intraproc = (sem_id)ap_palloc(new->cntxt, sizeof(sem_id)); new->ben_intraproc = (int32)ap_palloc(new->cntxt, sizeof(int32)); - new->ben_intraproc = 0; - stat = create_sem(0, "ap_intraproc"); - if (stat < B_NO_ERROR){ + + if ((stat = create_sem(0, "ap_intraproc")) < B_NO_ERROR){ lock_intra_cleanup(new); return stat; } + new->ben_intraproc = 0; new->sem_intraproc = stat; new->curr_locked = 0; ap_register_cleanup(new->cntxt, (void *)new, lock_intra_cleanup, @@ -89,22 +89,29 @@ ap_status_t create_intra_lock(struct lock_t *new) ap_status_t lock_intra(ap_lock_t *lock) { - lock->curr_locked = 1; - if (atomic_add (&lock->ben_intraproc, 1) >0){ - if (acquire_sem(lock->sem_intraproc) != B_NO_ERROR){ + int32 stat; + + if (atomic_add (&lock->ben_intraproc, 1) > 0){ + if ((stat = acquire_sem(lock->sem_intraproc)) != B_NO_ERROR){ atomic_add(&lock->ben_intraproc,-1); - return errno; + return stat; } } + lock->curr_locked = 1; return APR_SUCCESS; } ap_status_t unlock_intra(ap_lock_t *lock) { + int32 stat; + if (atomic_add(&lock->ben_intraproc, -1) > 1){ - release_sem(lock->sem_intraproc); - lock->curr_locked = 0; + if ((stat = release_sem(lock->sem_intraproc)) != B_NO_ERROR) { + atomic_add(&lock->ben_intraproc, 1); + return stat; + } } + lock->curr_locked = 0; return APR_SUCCESS; } |