summaryrefslogtreecommitdiff
path: root/locks/beos
diff options
context:
space:
mode:
authordreid <dreid@13f79535-47bb-0310-9956-ffa450edef68>2000-03-14 13:11:31 +0000
committerdreid <dreid@13f79535-47bb-0310-9956-ffa450edef68>2000-03-14 13:11:31 +0000
commit164391e6a85f2b535a6155ae5494a61232dbdd31 (patch)
tree9c2056df9d6210328625d1508ad85f6f94af6909 /locks/beos
parentab9b2058355f4c8955dcc9a93c913164c2777429 (diff)
downloadlibapr-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.c34
-rw-r--r--locks/beos/intraproc.c29
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;
}