ASF Bugzilla – Attachment 17878 Details for
Bug 38758
process mutex trylock functions for unix
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
adds trylock functions for unix process mutexes
proc_mutex.c.patch (text/plain), 4.88 KB, created by
Chris Darroch
on 2006-03-12 19:58:46 UTC
(
hide
)
Description:
adds trylock functions for unix process mutexes
Filename:
MIME Type:
Creator:
Chris Darroch
Created:
2006-03-12 19:58:46 UTC
Size:
4.88 KB
patch
obsolete
>--- locks/unix/proc_mutex.c.orig 2005-02-04 15:44:01.000000000 -0500 >+++ locks/unix/proc_mutex.c 2006-03-12 14:53:42.478058336 -0500 >@@ -125,6 +125,18 @@ > return APR_SUCCESS; > } > >+static apr_status_t proc_mutex_posix_tryacquire(apr_proc_mutex_t *mutex) >+{ >+ if (sem_trywait(mutex->psem_interproc) < 0) { >+ if (errno == EAGAIN) { >+ return APR_EBUSY; >+ } >+ return errno; >+ } >+ mutex->curr_locked = 1; >+ return APR_SUCCESS; >+} >+ > static apr_status_t proc_mutex_posix_release(apr_proc_mutex_t *mutex) > { > mutex->curr_locked = 0; >@@ -145,7 +157,7 @@ > #endif > proc_mutex_posix_create, > proc_mutex_posix_acquire, >- proc_mutex_no_tryacquire, >+ proc_mutex_posix_tryacquire, > proc_mutex_posix_release, > proc_mutex_posix_cleanup, > proc_mutex_no_child_init, >@@ -157,6 +169,7 @@ > #if APR_HAS_SYSVSEM_SERIALIZE > > static struct sembuf proc_mutex_op_on; >+static struct sembuf proc_mutex_op_try; > static struct sembuf proc_mutex_op_off; > > static void proc_mutex_sysv_setup(void) >@@ -164,6 +177,9 @@ > proc_mutex_op_on.sem_num = 0; > proc_mutex_op_on.sem_op = -1; > proc_mutex_op_on.sem_flg = SEM_UNDO; >+ proc_mutex_op_try.sem_num = 0; >+ proc_mutex_op_try.sem_op = -1; >+ proc_mutex_op_try.sem_flg = SEM_UNDO | IPC_NOWAIT; > proc_mutex_op_off.sem_num = 0; > proc_mutex_op_off.sem_op = 1; > proc_mutex_op_off.sem_flg = SEM_UNDO; >@@ -222,6 +238,23 @@ > return APR_SUCCESS; > } > >+static apr_status_t proc_mutex_sysv_tryacquire(apr_proc_mutex_t *mutex) >+{ >+ int rc; >+ >+ do { >+ rc = semop(mutex->interproc->filedes, &proc_mutex_op_try, 1); >+ } while (rc < 0 && errno == EINTR); >+ if (rc < 0) { >+ if (errno == EAGAIN) { >+ return APR_EBUSY; >+ } >+ return errno; >+ } >+ mutex->curr_locked = 1; >+ return APR_SUCCESS; >+} >+ > static apr_status_t proc_mutex_sysv_release(apr_proc_mutex_t *mutex) > { > int rc; >@@ -245,7 +278,7 @@ > #endif > proc_mutex_sysv_create, > proc_mutex_sysv_acquire, >- proc_mutex_no_tryacquire, >+ proc_mutex_sysv_tryacquire, > proc_mutex_sysv_release, > proc_mutex_sysv_cleanup, > proc_mutex_no_child_init, >@@ -394,7 +427,32 @@ > return APR_SUCCESS; > } > >-/* TODO: Add proc_mutex_proc_pthread_tryacquire(apr_proc_mutex_t *mutex) */ >+static apr_status_t proc_mutex_proc_pthread_tryacquire(apr_proc_mutex_t *mutex) >+{ >+ apr_status_t rv; >+ >+ if ((rv = pthread_mutex_trylock(mutex->pthread_interproc))) { >+#ifdef PTHREAD_SETS_ERRNO >+ rv = errno; >+#endif >+ if (rv == EBUSY) { >+ return APR_EBUSY; >+ } >+#ifdef HAVE_PTHREAD_MUTEXATTR_SETROBUST_NP >+ /* Okay, our owner died. Let's try to make it consistent again. */ >+ if (rv == EOWNERDEAD) { >+ pthread_mutex_consistent_np(mutex->pthread_interproc); >+ rv = APR_SUCCESS; >+ } >+ else >+ return rv; >+#else >+ return rv; >+#endif >+ } >+ mutex->curr_locked = 1; >+ return rv; >+} > > static apr_status_t proc_mutex_proc_pthread_release(apr_proc_mutex_t *mutex) > { >@@ -415,7 +473,7 @@ > APR_PROCESS_LOCK_MECH_IS_GLOBAL, > proc_mutex_proc_pthread_create, > proc_mutex_proc_pthread_acquire, >- proc_mutex_no_tryacquire, >+ proc_mutex_proc_pthread_tryacquire, > proc_mutex_proc_pthread_release, > proc_mutex_proc_pthread_cleanup, > proc_mutex_no_child_init, >@@ -501,7 +559,24 @@ > if (rc < 0) { > return errno; > } >- mutex->curr_locked=1; >+ mutex->curr_locked = 1; >+ return APR_SUCCESS; >+} >+ >+static apr_status_t proc_mutex_fcntl_tryacquire(apr_proc_mutex_t *mutex) >+{ >+ int rc; >+ >+ do { >+ rc = fcntl(mutex->interproc->filedes, F_SETLK, &proc_mutex_lock_it); >+ } while (rc < 0 && errno == EINTR); >+ if (rc < 0) { >+ if (errno == EAGAIN) { >+ return APR_EBUSY; >+ } >+ return errno; >+ } >+ mutex->curr_locked = 1; > return APR_SUCCESS; > } > >@@ -528,7 +603,7 @@ > #endif > proc_mutex_fcntl_create, > proc_mutex_fcntl_acquire, >- proc_mutex_no_tryacquire, >+ proc_mutex_fcntl_tryacquire, > proc_mutex_fcntl_release, > proc_mutex_fcntl_cleanup, > proc_mutex_no_child_init, >@@ -602,6 +677,23 @@ > return APR_SUCCESS; > } > >+static apr_status_t proc_mutex_flock_tryacquire(apr_proc_mutex_t *mutex) >+{ >+ int rc; >+ >+ do { >+ rc = flock(mutex->interproc->filedes, LOCK_EX | LOCK_NB); >+ } while (rc < 0 && errno == EINTR); >+ if (rc < 0) { >+ if (errno == EWOULDBLOCK) { >+ return APR_EBUSY; >+ } >+ return errno; >+ } >+ mutex->curr_locked = 1; >+ return APR_SUCCESS; >+} >+ > static apr_status_t proc_mutex_flock_release(apr_proc_mutex_t *mutex) > { > int rc; >@@ -649,7 +741,7 @@ > #endif > proc_mutex_flock_create, > proc_mutex_flock_acquire, >- proc_mutex_no_tryacquire, >+ proc_mutex_flock_tryacquire, > proc_mutex_flock_release, > proc_mutex_flock_cleanup, > proc_mutex_flock_child_init,
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 38758
:
17769
|
17770
|
17771
|
17772
| 17878