Rev 1511: Acquire and release GIL in a couple more places. in file:///data/jelmer/bzr-svn/gil/

Jelmer Vernooij jelmer at samba.org
Fri Aug 1 21:55:50 BST 2008


At file:///data/jelmer/bzr-svn/gil/

------------------------------------------------------------
revno: 1511
revision-id: jelmer at samba.org-20080801205549-tfdd1gq00pq6nn1e
parent: jelmer at samba.org-20080801204559-mns64h2depsxw7jp
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: gil
timestamp: Fri 2008-08-01 22:55:49 +0200
message:
  Acquire and release GIL in a couple more places.
modified:
  client.c                       client.pyx-20080313235339-wbyjbw2namuiql8f-1
  ra.c                           ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  repos.c                        repos.pyx-20080314114432-g2b5lqe776tkbl4k-1
  util.c                         util.c-20080531154025-s8ef6ej9tytsnkkw-1
  util.h                         util.h-20080531154025-s8ef6ej9tytsnkkw-2
  wc.c                           wc.pyx-20080313142018-10l8l23vha2j9e6b-1
=== modified file 'client.c'
--- a/client.c	2008-08-01 20:45:59 +0000
+++ b/client.c	2008-08-01 20:55:49 +0000
@@ -271,13 +271,16 @@
 
 	Py_XDECREF(client->py_auth);
 
+
 	if (auth == Py_None) {
 		auth_providers = apr_array_make(client->pool, 0, sizeof(svn_auth_provider_object_t *));
 		if (auth_providers == NULL) {
 			PyErr_NoMemory();
 			return 1;
 		}
+		Py_BEGIN_ALLOW_THREADS
 		svn_auth_open(&client->client->auth_baton, auth_providers, client->pool);
+		Py_END_ALLOW_THREADS
 	} else {
 		client->client->auth_baton = ((AuthObject *)auth)->auth_baton;
 	}

=== modified file 'ra.c'
--- a/ra.c	2008-08-01 20:45:59 +0000
+++ b/ra.c	2008-08-01 20:55:49 +0000
@@ -348,15 +348,16 @@
 static svn_error_t *py_cb_editor_change_prop(void *dir_baton, const char *name, const svn_string_t *value, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)dir_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	if (value != NULL) {
 		ret = PyObject_CallMethod(self, "change_prop", "sz#", name, value->data, value->len);
 	} else {
 		ret = PyObject_CallMethod(self, "change_prop", "sO", name, Py_None);
 	}
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -579,16 +580,17 @@
 }
 
 #define RUN_RA_WITH_POOL(pool, ra, cmd) { \
+	svn_error_t *err; \
 	PyThreadState *_save; \
 	_save = PyEval_SaveThread(); \
-	if (!check_error((cmd))) { \
+	err = (cmd); \
+	PyEval_RestoreThread(_save); \
+	if (!check_error(err)) { \
 		apr_pool_destroy(pool); \
 		ra->busy = false; \
-		PyEval_RestoreThread(_save); \
 		return NULL; \
 	} \
 	ra->busy = false; \
-	PyEval_RestoreThread(_save); \
 }
 
 static bool ra_check_busy(RemoteAccessObject *raobj)

=== modified file 'repos.c'
--- a/repos.c	2008-07-30 05:51:22 +0000
+++ b/repos.c	2008-08-01 20:55:49 +0000
@@ -86,11 +86,14 @@
 	ret->pool = Pool(NULL);
 	if (ret->pool == NULL)
 		return NULL;
+	Py_BEGIN_ALLOW_THREADS
     if (!check_error(svn_repos_open(&ret->repos, path, ret->pool))) {
 		apr_pool_destroy(ret->pool);
+		PyEval_RestoreThread(_save);
 		PyObject_Del(ret);
 		return NULL;
 	}
+	Py_END_ALLOW_THREADS
 
 	return (PyObject *)ret;
 }

=== modified file 'util.c'
--- a/util.c	2008-08-01 20:45:59 +0000
+++ b/util.c	2008-08-01 20:55:49 +0000
@@ -60,8 +60,10 @@
 
 void PyErr_SetSubversionException(svn_error_t *error)
 {
-	PyObject *coremod = PyImport_ImportModule("bzrlib.plugins.svn.core"), *excobj;
-	PyObject *excval;
+	PyObject *coremod;
+	PyObject *excval, *excobj;
+
+	coremod = PyImport_ImportModule("bzrlib.plugins.svn.core");
 
 	if (coremod == NULL) {
 		return;

=== modified file 'util.h'
--- a/util.h	2008-08-01 20:45:59 +0000
+++ b/util.h	2008-08-01 20:55:49 +0000
@@ -38,11 +38,17 @@
 svn_error_t *py_svn_error(void);
 void PyErr_SetSubversionException(svn_error_t *error);
 
-#define RUN_SVN_WITH_POOL(pool, cmd)  \
-	if (!check_error((cmd))) { \
+#define RUN_SVN_WITH_POOL(pool, cmd) { \
+	svn_error_t *err; \
+	PyThreadState *_save; \
+	_save = PyEval_SaveThread(); \
+	err = (cmd); \
+	PyEval_RestoreThread(_save); \
+	if (!check_error(err)) { \
 		apr_pool_destroy(pool); \
 		return NULL; \
-	}
+	} \
+}
 
 PyObject *wrap_lock(svn_lock_t *lock);
 apr_array_header_t *revnum_list_to_apr_array(apr_pool_t *pool, PyObject *l);

=== modified file 'wc.c'
--- a/wc.c	2008-08-01 20:45:59 +0000
+++ b/wc.c	2008-08-01 20:55:49 +0000
@@ -272,10 +272,15 @@
 	} else {
 		parent_wc = ((AdmObject *)associated)->adm;
 	}
+	Py_BEGIN_ALLOW_THREADS
 	if (!check_error(svn_wc_adm_open3(&ret->adm, parent_wc, path, 
 					 write_lock, depth, py_cancel_func, cancel_func, 
-					 ret->pool)))
+					 ret->pool))) {
+		PyEval_RestoreThread(_save);
 		return NULL;
+	}
+	Py_END_ALLOW_THREADS
+
 
 	return (PyObject *)ret;
 }
@@ -568,13 +573,16 @@
 	if (pool == NULL)
 		return NULL;
 	latest_revnum = (svn_revnum_t *)apr_palloc(pool, sizeof(svn_revnum_t));
+	Py_BEGIN_ALLOW_THREADS
 	if (!check_error(svn_wc_get_update_editor2(latest_revnum, admobj->adm, target, 
 				use_commit_times, recurse, py_wc_notify_func, (void *)notify_func, 
 				py_cancel_func, (void *)cancel_func, diff3_cmd, &editor, &edit_baton, 
 				NULL, pool))) {
 		apr_pool_destroy(pool);
+		PyEval_RestoreThread(_save);
 		return NULL;
 	}
+	Py_END_ALLOW_THREADS
 	return new_editor_object(editor, edit_baton, pool, &Editor_Type, NULL, NULL);
 }
 
@@ -650,7 +658,9 @@
 {
 	AdmObject *admobj = (AdmObject *)self;
 	if (admobj->adm != NULL) {
+		Py_BEGIN_ALLOW_THREADS
 		svn_wc_adm_close(admobj->adm);
+		Py_END_ALLOW_THREADS
 		admobj->adm = NULL;
 	}
 




More information about the bazaar-commits mailing list