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. */