summaryrefslogtreecommitdiff
path: root/locks/beos/intraproc.c
diff options
context:
space:
mode:
Diffstat (limited to 'locks/beos/intraproc.c')
-rw-r--r--locks/beos/intraproc.c18
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;
}