diff options
Diffstat (limited to 'locks/beos/intraproc.c')
-rw-r--r-- | locks/beos/intraproc.c | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/locks/beos/intraproc.c b/locks/beos/intraproc.c index 10537de08..65cb5a3e5 100644 --- a/locks/beos/intraproc.c +++ b/locks/beos/intraproc.c @@ -57,11 +57,9 @@ apr_status_t lock_intra_cleanup(void *data) { apr_lock_t *lock = (apr_lock_t *)data; - if (lock->curr_locked == 1) { - if (atomic_add(&lock->ben_intraproc , -1) > 1){ + if (lock->ben_intraproc != 0) { + while (atomic_add(&lock->ben_intraproc , -1) > 1){ release_sem (lock->sem_intraproc); - } else { - return errno; } } delete_sem(lock->sem_intraproc); @@ -70,10 +68,7 @@ apr_status_t lock_intra_cleanup(void *data) apr_status_t create_intra_lock(apr_lock_t *new) { - int32 stat; - new->sem_intraproc = (sem_id)apr_palloc(new->cntxt, sizeof(sem_id)); - new->ben_intraproc = (int32)apr_palloc(new->cntxt, sizeof(int32)); - + int32 stat; if ((stat = create_sem(0, "apr_intraproc")) < B_NO_ERROR){ lock_intra_cleanup(new); @@ -81,7 +76,6 @@ apr_status_t create_intra_lock(apr_lock_t *new) } new->ben_intraproc = 0; new->sem_intraproc = stat; - new->curr_locked = 0; apr_register_cleanup(new->cntxt, (void *)new, lock_intra_cleanup, apr_null_cleanup); return APR_SUCCESS; @@ -92,12 +86,11 @@ apr_status_t lock_intra(apr_lock_t *lock) int32 stat; if (atomic_add (&lock->ben_intraproc, 1) > 0){ - if ((stat = acquire_sem(lock->sem_intraproc)) != B_NO_ERROR){ + if ((stat = acquire_sem(lock->sem_intraproc)) < B_NO_ERROR){ atomic_add(&lock->ben_intraproc,-1); return stat; } } - lock->curr_locked = 1; return APR_SUCCESS; } @@ -106,12 +99,11 @@ apr_status_t unlock_intra(apr_lock_t *lock) int32 stat; if (atomic_add(&lock->ben_intraproc, -1) > 1){ - if ((stat = release_sem(lock->sem_intraproc)) != B_NO_ERROR) { + 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; } |