Thank you for your response. The os error is not set in this case. According to the documentation on MSDN only when the return value of WaitForSingleObject() is WAIT_FAILED will an error be set. I supposed this is why the patch I suggest is already the current implementation for thread mutexes. (sorry for emailing it previously to your email address and not to the forum)

William A. Rowe, Jr. wrote:

Ronen Mizrahi wrote:

OK, I realize I may be doing something wrong, or otherwise someone would have responded to the message below. Could anyone please enlighten me? Have I broken some rules? I assure you if I did it was non intentional. I have the highest appreciation for the ASF and for APR in particular. Can someone please respond?


Oh no - nothing wrong.  I've been pondering your proposal for a bit.

In general APR has attempted NOT to toggle system errors into 'posix'
errors, if you look at apr_errno.h you will see that we've expanded the
APR_STATUS_IS_EFOO() macro to test 'posix' EFOO, and all roughly
equivilant os-specific errors.

The reason's simple, if the end user ignores EFOO, then it's foolish of
us to waste cycles testing for OS_FOO and replacing with the value EFOO.

But in the case of your patch below, can we reliably state that the
APR_STATUS_IS_EBUSY() macro should (on win32/os2) include WAIT_TIMEOUT?
I'm hesitant, and was trying to figure all the scenarios, which is why
I had yet to respond.  What is apr_get_os_error()'s result, SUCCESS or
no-change?  Or have you determined a win32 'error' result in this case
from apr_get_os_error().  If it's unset (not-an-error) then yes, we need
to adopt the patch; if it's set we should look at that error code and
expand APR_STATUS_IS_EBUSY().

Bill


Hi,

The function apr_proc_mutex_trylock(apr_proc_mutex_t *mutex) is supposed to return APR_EBUSY if the mutex is already locked, however it never does that. The following is taken from the SVN head:

*APR_DECLARE*(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex)
{
   DWORD rv;

   rv = WaitForSingleObject(mutex->handle, 0);

   *if* (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) {
       *return* APR_SUCCESS;
   }
   *return* apr_get_os_error();
}


I suggest modifying it to (based on apr_thread_mutex_trylock()):

APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex)
{
   DWORD rv;

   rv = WaitForSingleObject(mutex->handle, 0);

   if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) {
       return APR_SUCCESS;
   }
  return (rv == WAIT_TIMEOUT) ? APR_EBUSY : apr_get_os_error();
}

Please let me know if this is ok,

Ronen







Reply via email to