Hi --
I happened to discover that calling apr_global_mutex_trylock() caused a core dump (I'm using Solaris 8, but that doesn't really matter here). It's because line 917 in the apr_proc_mutex_trylock() function in apr/locks/unix/proc_mutex.c calls:
mutex->meth->tryacquire(mutex)
but the tryacquire function pointer is, for all cases, set to NULL. A quick fix, without actually implementing any of the tryacquire functions, is below; APR_ENOTIMPL is returned by stub functions instead.
I'll follow this up with a patch that tries to implement the proc_pthreads tryacquire case ... but since I'm only just reading man pages now, I really can't be sure I've got it correct.
Chris.
===========================================================
--- proc_mutex.c.orig 2002-08-22 14:04:12.259144000 -0400
+++ proc_mutex.c 2002-08-22 14:57:15.826790000 -0400
@@ -138,6 +138,11 @@
return APR_SUCCESS;
}+static apr_status_t proc_mutex_posix_tryacquire(apr_proc_mutex_t *mutex)
+{
+ return APR_ENOTIMPL;
+}
+
static apr_status_t proc_mutex_posix_release(apr_proc_mutex_t *mutex)
{
int rc;
@@ -176,7 +181,7 @@
#endif
proc_mutex_posix_create,
proc_mutex_posix_acquire,
- NULL, /* no tryacquire */
+ proc_mutex_posix_tryacquire,
proc_mutex_posix_release,
proc_mutex_posix_destroy,
proc_mutex_posix_child_init,
@@ -253,6 +258,11 @@
return APR_SUCCESS;
}+static apr_status_t proc_mutex_sysv_tryacquire(apr_proc_mutex_t *mutex)
+{
+ return APR_ENOTIMPL;
+}
+
static apr_status_t proc_mutex_sysv_release(apr_proc_mutex_t *mutex)
{
int rc;
@@ -292,7 +302,7 @@
#endif
proc_mutex_sysv_create,
proc_mutex_sysv_acquire,
- NULL, /* no tryacquire */
+ proc_mutex_sysv_tryacquire,
proc_mutex_sysv_release,
proc_mutex_sysv_destroy,
proc_mutex_sysv_child_init,
@@ -427,7 +437,14 @@
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;
+
+ /**** DEBUG ****/
+
+ return APR_ENOTIMPL;
+}
static apr_status_t proc_mutex_proc_pthread_release(apr_proc_mutex_t *mutex)
{
@@ -467,7 +484,7 @@
APR_PROCESS_LOCK_MECH_IS_GLOBAL,
proc_mutex_proc_pthread_create,
proc_mutex_proc_pthread_acquire,
- NULL, /* no tryacquire */
+ proc_mutex_proc_pthread_tryacquire,
proc_mutex_proc_pthread_release,
proc_mutex_proc_pthread_destroy,
proc_mutex_proc_pthread_child_init,
@@ -563,6 +580,11 @@
return APR_SUCCESS;
}
+static apr_status_t proc_mutex_fcntl_tryacquire(apr_proc_mutex_t *mutex)
+{
+ return APR_ENOTIMPL;
+}
+
static apr_status_t proc_mutex_fcntl_release(apr_proc_mutex_t *mutex)
{
int rc;
@@ -603,7 +625,7 @@
#endif
proc_mutex_fcntl_create,
proc_mutex_fcntl_acquire,
- NULL, /* no tryacquire */
+ proc_mutex_fcntl_tryacquire,
proc_mutex_fcntl_release,
proc_mutex_fcntl_destroy,
proc_mutex_fcntl_child_init,
@@ -678,6 +700,11 @@
return APR_SUCCESS;
}+static apr_status_t proc_mutex_flock_tryacquire(apr_proc_mutex_t *mutex)
+{
+ return APR_ENOTIMPL;
+}
+
static apr_status_t proc_mutex_flock_release(apr_proc_mutex_t *mutex)
{
int rc;
@@ -733,7 +760,7 @@
#endif
proc_mutex_flock_create,
proc_mutex_flock_acquire,
- NULL, /* no tryacquire */
+ proc_mutex_flock_tryacquire,
proc_mutex_flock_release,
proc_mutex_flock_destroy,
proc_mutex_flock_child_init,