You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2011/07/12 20:37:34 UTC

svn commit: r1145711 - in /subversion/branches/svn_mutex/subversion: include/private/ra_svn_sasl.h libsvn_ra_svn/cyrus_auth.c svnserve/cyrus_auth.c

Author: stefan2
Date: Tue Jul 12 18:37:33 2011
New Revision: 1145711

URL: http://svn.apache.org/viewvc?rev=1145711&view=rev
Log:
On svn_mutex branch:
Switch mutexes used by Cyrus SASL support to the safer svn_mutex API.
Simplify locking-related code when possible.

* subversion/include/private/ra_svn_sasl.h
  (svn_ra_svn__sasl_common_init): change return type to svn_error_t*
* subversion/libsvn_ra_svn/cyrus_auth.c
  (array_mutex): switch to svn_mutex_t
  (sasl_mutex_alloc_cb_internal): to-be-sync'ed part of sasl_mutex_alloc_cb
  (sasl_mutex_alloc_cb): remainder
  (check_result): new utility
  (sasl_mutex_lock_cb, sasl_mutex_unlock_cb): adapt to svn_mutex API
  (sasl_mutex_free_cb_internal): to-be-sync'ed part of sasl_mutex_free_cb
  (sasl_mutex_free_cb): remainder
  (svn_ra_svn__sasl_common_init, sasl_init_cb): adapt to API change
  (sasl_init_cb): adapt to svn_mutex API
* subversion/svnserve/cyrus_auth.c
  (initialize): adapt to API change

Modified:
    subversion/branches/svn_mutex/subversion/include/private/ra_svn_sasl.h
    subversion/branches/svn_mutex/subversion/libsvn_ra_svn/cyrus_auth.c
    subversion/branches/svn_mutex/subversion/svnserve/cyrus_auth.c

Modified: subversion/branches/svn_mutex/subversion/include/private/ra_svn_sasl.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn_mutex/subversion/include/private/ra_svn_sasl.h?rev=1145711&r1=1145710&r2=1145711&view=diff
==============================================================================
--- subversion/branches/svn_mutex/subversion/include/private/ra_svn_sasl.h (original)
+++ subversion/branches/svn_mutex/subversion/include/private/ra_svn_sasl.h Tue Jul 12 18:37:33 2011
@@ -60,7 +60,7 @@ svn_ra_svn__default_secprops(sasl_securi
 
 /* This function is called by the client and the server before
    calling sasl_{client, server}_init, pool is used for allocations. */
-apr_status_t
+svn_error_t *
 svn_ra_svn__sasl_common_init(apr_pool_t *pool);
 
 /* Sets local_addrport and remote_addrport to a string containing the

Modified: subversion/branches/svn_mutex/subversion/libsvn_ra_svn/cyrus_auth.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn_mutex/subversion/libsvn_ra_svn/cyrus_auth.c?rev=1145711&r1=1145710&r2=1145711&view=diff
==============================================================================
--- subversion/branches/svn_mutex/subversion/libsvn_ra_svn/cyrus_auth.c (original)
+++ subversion/branches/svn_mutex/subversion/libsvn_ra_svn/cyrus_auth.c Tue Jul 12 18:37:33 2011
@@ -29,7 +29,6 @@
 #include <apr_general.h>
 #include <apr_strings.h>
 #include <apr_atomic.h>
-#include <apr_thread_mutex.h>
 #include <apr_version.h>
 
 #include "svn_types.h"
@@ -42,6 +41,7 @@
 
 #include "private/svn_atomic.h"
 #include "private/ra_svn_sasl.h"
+#include "private/svn_mutex.h"
 
 #include "ra_svn.h"
 
@@ -86,72 +86,80 @@ static apr_status_t sasl_done_cb(void *d
 static apr_array_header_t *free_mutexes = NULL;
 
 /* A mutex to serialize access to the array. */
-static apr_thread_mutex_t *array_mutex = NULL;
+static svn_mutext__t *array_mutex = NULL;
 
 /* Callbacks we pass to sasl_set_mutex(). */
 
+static svn_error_t *
+sasl_mutex_alloc_cb_internal(svn_mutex__t **mutex)
+{
+  if (apr_is_empty_array(free_mutexes))
+    return svn_mutex__init(mutex, TRUE, sasl_pool);
+  else
+    *mutex = *((svn_mutex__t**)apr_array_pop(free_mutexes));
+
+  return SVN_NO_ERROR;
+}
+
 static void *sasl_mutex_alloc_cb(void)
 {
-  apr_thread_mutex_t *mutex;
-  apr_status_t apr_err;
+  svn_mutex__t *mutex = NULL;
+  svn_error_t *err;
 
   if (!svn_ra_svn__sasl_status)
     return NULL;
 
-  apr_err = apr_thread_mutex_lock(array_mutex);
-  if (apr_err != APR_SUCCESS)
-    return NULL;
+  err = SVN_MUTEX__WITH_LOCK(array_mutex,
+                             sasl_mutex_alloc_cb_internal(&mutex));
+  if (err)
+    svn_error_clear(err);
 
-  if (apr_is_empty_array(free_mutexes))
+  return mutex;
+}
+
+static int check_result(svn_error_t *err)
+{
+  if (err)
     {
-      apr_err = apr_thread_mutex_create(&mutex,
-                                        APR_THREAD_MUTEX_DEFAULT,
-                                        sasl_pool);
-      if (apr_err != APR_SUCCESS)
-        mutex = NULL;
+      svn_error_clear(err);
+      return 0;
     }
-  else
-    mutex = *((apr_thread_mutex_t**)apr_array_pop(free_mutexes));
-
-  apr_err = apr_thread_mutex_unlock(array_mutex);
-  if (apr_err != APR_SUCCESS)
-    return NULL;
-
-  return mutex;
+    
+  return -1;
 }
 
 static int sasl_mutex_lock_cb(void *mutex)
 {
   if (!svn_ra_svn__sasl_status)
     return 0;
-  return (apr_thread_mutex_lock(mutex) == APR_SUCCESS) ? 0 : -1;
+  return check_result(svn_mutex__lock(mutex);
 }
 
 static int sasl_mutex_unlock_cb(void *mutex)
 {
   if (!svn_ra_svn__sasl_status)
     return 0;
-  return (apr_thread_mutex_unlock(mutex) == APR_SUCCESS) ? 0 : -1;
+  return check_result(svn_mutex__unlock(mutex));
+}
+
+static svn_error_t *
+sasl_mutex_free_cb_internal(void *mutex)
+{
+  APR_ARRAY_PUSH(free_mutexes, svn_mutex__t*) = mutex;
+  return SVN_NO_ERROR;
 }
 
 static void sasl_mutex_free_cb(void *mutex)
 {
   if (svn_ra_svn__sasl_status)
-    {
-      apr_status_t apr_err = apr_thread_mutex_lock(array_mutex);
-      if (apr_err == APR_SUCCESS)
-        {
-          APR_ARRAY_PUSH(free_mutexes, apr_thread_mutex_t*) = mutex;
-          apr_thread_mutex_unlock(array_mutex);
-        }
-    }
+    svn_error_clear(SVN_MUTEX__WITH_LOCK(array_mutex,
+                                         sasl_mutex_free_cb_internal(mutex)));
 }
 #endif /* APR_HAS_THREADS */
 
-apr_status_t svn_ra_svn__sasl_common_init(apr_pool_t *pool)
+svn_error_t *
+svn_ra_svn__sasl_common_init(apr_pool_t *pool)
 {
-  apr_status_t apr_err = APR_SUCCESS;
-
   sasl_pool = svn_pool_create(pool);
   sasl_ctx_count = 1;
   apr_pool_cleanup_register(sasl_pool, NULL, sasl_done_cb,
@@ -161,18 +169,18 @@ apr_status_t svn_ra_svn__sasl_common_ini
                  sasl_mutex_lock_cb,
                  sasl_mutex_unlock_cb,
                  sasl_mutex_free_cb);
-  free_mutexes = apr_array_make(sasl_pool, 0, sizeof(apr_thread_mutex_t *));
-  apr_err = apr_thread_mutex_create(&array_mutex,
-                                    APR_THREAD_MUTEX_DEFAULT,
-                                    sasl_pool);
+  free_mutexes = apr_array_make(sasl_pool, 0, sizeof(svn_mutex__t *));
+  return svn_mutex__init(&array_mutex, TRUE, sasl_pool);
+    
 #endif /* APR_HAS_THREADS */
-  return apr_err;
+  
+  return SVN_NO_ERROR;
 }
 
 static svn_error_t *sasl_init_cb(void *baton, apr_pool_t *pool)
 {
-  if (svn_ra_svn__sasl_common_init(pool) != APR_SUCCESS
-      || sasl_client_init(NULL) != SASL_OK)
+  SVN_ERR(svn_ra_svn__sasl_common_init(pool));
+  if (sasl_client_init(NULL) != SASL_OK)
     return svn_error_create(SVN_ERR_RA_NOT_AUTHORIZED, NULL,
                             _("Could not initialize the SASL library"));
   return SVN_NO_ERROR;

Modified: subversion/branches/svn_mutex/subversion/svnserve/cyrus_auth.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn_mutex/subversion/svnserve/cyrus_auth.c?rev=1145711&r1=1145710&r2=1145711&view=diff
==============================================================================
--- subversion/branches/svn_mutex/subversion/svnserve/cyrus_auth.c (original)
+++ subversion/branches/svn_mutex/subversion/svnserve/cyrus_auth.c Tue Jul 12 18:37:33 2011
@@ -105,12 +105,7 @@ static sasl_callback_t callbacks[] =
 static svn_error_t *initialize(void *baton, apr_pool_t *pool)
 {
   int result;
-  apr_status_t status;
-
-  status = svn_ra_svn__sasl_common_init(pool);
-  if (status)
-    return svn_error_wrap_apr(status,
-                              _("Could not initialize the SASL library"));
+  SVN_ERR(svn_ra_svn__sasl_common_init(pool));
 
   /* The second parameter tells SASL to look for a configuration file
      named subversion.conf. */