Rev 1510: Acquire gil where necessary. in file:///data/jelmer/bzr-svn/gil/

Jelmer Vernooij jelmer at samba.org
Fri Aug 1 21:46:00 BST 2008


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

------------------------------------------------------------
revno: 1510
revision-id: jelmer at samba.org-20080801204559-mns64h2depsxw7jp
parent: jelmer at samba.org-20080801201849-ob34wsdal1q7qcll
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: gil
timestamp: Fri 2008-08-01 22:45:59 +0200
message:
  Acquire gil where necessary.
modified:
  client.c                       client.pyx-20080313235339-wbyjbw2namuiql8f-1
  ra.c                           ra.pyx-20080313140933-qybkqaxe3m4mcll7-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-07-30 05:51:22 +0000
+++ b/client.c	2008-08-01 20:45:59 +0000
@@ -120,17 +120,18 @@
 static svn_error_t *py_log_msg_func2(const char **log_msg, const char **tmp_file, const apr_array_header_t *commit_items, void *baton, apr_pool_t *pool)
 {
 	PyObject *py_commit_items, *ret, *py_log_msg, *py_tmp_file;
+	PyGILState_STATE state;
+
 	if (baton == Py_None)
 		return NULL;
 
+	state = PyGILState_Ensure();
 	py_commit_items = wrap_py_commit_items(commit_items);
-	if (py_commit_items == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(py_commit_items);
 
 	ret = PyObject_CallFunction(baton, "O", py_commit_items);
 	Py_DECREF(py_commit_items);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	if (PyTuple_Check(ret)) {
 		py_log_msg = PyTuple_GetItem(ret, 0);
 		py_tmp_file = PyTuple_GetItem(ret, 1);
@@ -145,6 +146,7 @@
 		*tmp_file = PyString_AsString(py_tmp_file);
 	}
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 

=== modified file 'ra.c'
--- a/ra.c	2008-08-01 20:18:49 +0000
+++ b/ra.c	2008-08-01 20:45:59 +0000
@@ -41,18 +41,19 @@
 static svn_error_t *py_commit_callback(const svn_commit_info_t *commit_info, void *baton, apr_pool_t *pool)
 {
 	PyObject *fn = (PyObject *)baton, *ret;
-	PyGILState_STATE state = PyGILState_Ensure();
+	PyGILState_STATE state;
 	svn_error_t *err = NULL;
-
-	if (fn != Py_None) {
-		ret = PyObject_CallFunction(fn, "izz", 
-						commit_info->revision, commit_info->date, 
-						commit_info->author);
-		if (ret == NULL)
-			err = py_svn_error();
-		else
-			Py_DECREF(ret);
-	}
+	
+	if (fn == Py_None)
+		return NULL;
+
+	state = PyGILState_Ensure();
+
+	ret = PyObject_CallFunction(fn, "izz", 
+					commit_info->revision, commit_info->date, 
+					commit_info->author);
+	CB_CHECK_PYRETVAL(ret);
+	Py_DECREF(ret);
 	PyGILState_Release(state);
 	return err;
 }
@@ -72,6 +73,7 @@
 						   apr_pool_t *pool)
 {
 	PyObject *py_ra_err = Py_None, *ret, *py_lock;
+	PyGILState_STATE state = PyGILState_Ensure();
 	if (ra_err != NULL) {
 		py_ra_err = PyErr_NewSubversionException(ra_err);
 	}
@@ -80,9 +82,9 @@
 						  py_lock, py_ra_err);
 	Py_DECREF(py_lock);
 	Py_DECREF(py_ra_err);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -283,47 +285,51 @@
 static svn_error_t *py_cb_editor_set_target_revision(void *edit_baton, svn_revnum_t target_revision, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)edit_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	ret = PyObject_CallMethod(self, "set_target_revision", "l", target_revision);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_open_root(void *edit_baton, svn_revnum_t base_revision, apr_pool_t *pool, void **root_baton)
 {
 	PyObject *self = (PyObject *)edit_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	*root_baton = NULL;
 	ret = PyObject_CallMethod(self, "open_root", "l", base_revision);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	*root_baton = (void *)ret;
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_delete_entry(const char *path, svn_revnum_t revision, void *parent_baton, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)parent_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "delete_entry", "sl", path, revision);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_add_directory(const char *path, void *parent_baton, const char *copyfrom_path, svn_revnum_t copyfrom_revision, apr_pool_t *pool, void **child_baton)
 {
 	PyObject *self = (PyObject *)parent_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	*child_baton = NULL;
 	if (copyfrom_path == NULL) {
 		ret = PyObject_CallMethod(self, "add_directory", "s", path);
 	} else {
 		ret = PyObject_CallMethod(self, "add_directory", "ssl", path, copyfrom_path, copyfrom_revision);
 	}
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	*child_baton = (void *)ret;
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -331,10 +337,11 @@
 {
 	PyObject *self = (PyObject *)parent_baton, *ret;
 	*child_baton = NULL;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "open_directory", "sl", path, base_revision);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	*child_baton = (void *)ret;
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -356,46 +363,50 @@
 static svn_error_t *py_cb_editor_close_directory(void *dir_baton, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)dir_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "close", "");
 	Py_DECREF(self);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_absent_directory(const char *path, void *parent_baton, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)parent_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "absent_directory", "s", path);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_add_file(const char *path, void *parent_baton, const char *copy_path, svn_revnum_t copy_revision, apr_pool_t *file_pool, void **file_baton)
 {
 	PyObject *self = (PyObject *)parent_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	if (copy_path == NULL) {
 		ret = PyObject_CallMethod(self, "add_file", "s", path);
 	} else {
 		ret = PyObject_CallMethod(self, "add_file", "ssl", path, copy_path, 
 								  copy_revision);
 	}
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	*file_baton = (void *)ret;
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_open_file(const char *path, void *parent_baton, svn_revnum_t base_revision, apr_pool_t *file_pool, void **file_baton)
 {
 	PyObject *self = (PyObject *)parent_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "open_file", "sl", path, base_revision);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	*file_baton = (void *)ret;
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -404,11 +415,14 @@
 	int i;
 	PyObject *ops, *ret;
 	PyObject *fn = (PyObject *)baton, *py_new_data, *py_window;
+	PyGILState_STATE state;
 	if (fn == Py_None) {
 		/* User doesn't care about deltas */
 		return NULL;
 	}
 
+	state = PyGILState_Ensure();
+
 	if (window == NULL) {
 		py_window = Py_None;
 		Py_INCREF(py_window);
@@ -421,8 +435,7 @@
 											window->ops[i].action_code, 
 											window->ops[i].offset, 
 											window->ops[i].length);
-			if (pyval == NULL)
-				return NULL;
+			CB_CHECK_PYRETVAL(pyval);
 			PyList_SetItem(ops, i, pyval);
 		}
 		if (window->new_data != NULL && window->new_data->data != NULL) {
@@ -435,8 +448,7 @@
 								  window->sview_len, 
 								  window->tview_len, 
 								  window->src_ops, ops, py_new_data);
-		if (py_window == NULL)
-			return NULL;
+		CB_CHECK_PYRETVAL(py_window);
 		Py_DECREF(ops);
 		Py_DECREF(py_new_data);
 	}
@@ -446,22 +458,23 @@
 		/* Signals all delta windows have been received */
 		Py_DECREF(fn);
 	}
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_apply_textdelta(void *file_baton, const char *base_checksum, apr_pool_t *pool, svn_txdelta_window_handler_t *handler, void **handler_baton)
 {
 	PyObject *self = (PyObject *)file_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	*handler_baton = NULL;
 
 	ret = PyObject_CallMethod(self, "apply_textdelta", "z", base_checksum);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	*handler_baton = (void *)ret;
 	*handler = py_txdelta_window_handler;
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -469,6 +482,7 @@
 										 const char *text_checksum, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)file_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	if (text_checksum != NULL) {
 		ret = PyObject_CallMethod(self, "close", "");
@@ -476,41 +490,44 @@
 		ret = PyObject_CallMethod(self, "close", "s", text_checksum);
 	}
 	Py_DECREF(self);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_absent_file(const char *path, void *parent_baton, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)parent_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "absent_file", "s", path);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_close_edit(void *edit_baton, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)edit_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "close", "");
 	Py_DECREF(self);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_cb_editor_abort_edit(void *edit_baton, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)edit_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "abort", "");
 	Py_DECREF(self);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -536,18 +553,18 @@
 static svn_error_t *py_file_rev_handler(void *baton, const char *path, svn_revnum_t rev, apr_hash_t *rev_props, svn_txdelta_window_handler_t *delta_handler, void **delta_baton, apr_array_header_t *prop_diffs, apr_pool_t *pool)
 {
 	PyObject *fn = (PyObject *)baton, *ret, *py_rev_props;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	py_rev_props = prop_hash_to_dict(rev_props);
-	if (py_rev_props == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(py_rev_props);
 
 	ret = PyObject_CallFunction(fn, "slO", path, rev, py_rev_props);
 	Py_DECREF(py_rev_props);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 
 	*delta_baton = (void *)ret;
 	*delta_handler = py_txdelta_window_handler;
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -589,20 +606,23 @@
 {
 	RemoteAccessObject *self = (RemoteAccessObject *)baton;
 	PyObject *ret;
+	PyGILState_STATE state;
 
 	if (self->client_string_func == Py_None) {
 		*name = NULL;
 		return NULL;
 	}
 
+	state = PyGILState_Ensure();
+
 	ret = PyObject_CallFunction(self->client_string_func, "");
 
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 
 	*name = apr_pstrdup(pool, PyString_AsString(ret));
 	Py_DECREF(ret);
 
+	PyGILState_Release(state);
 	return NULL;
 }
 #endif
@@ -614,6 +634,7 @@
 	RemoteAccessObject *self = (RemoteAccessObject *)callback;
 	PyObject *ret;
 	apr_status_t status;
+	PyGILState_STATE state;
 
 	if (self->open_tmp_file_func == Py_None) {
 		const char *path;
@@ -625,10 +646,11 @@
 		return NULL;
 	}
 
+	state = PyGILState_Ensure();
+
 	ret = PyObject_CallFunction(self->open_tmp_file_func, "");
 
-	if (ret == NULL) 
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	
 	if (PyString_Check(ret)) {
 		char* fname = PyString_AsString(ret);
@@ -637,7 +659,8 @@
 		if (status) {
 			PyErr_SetAprStatus(status);
 			Py_DECREF(ret);
-			return NULL;
+			PyGILState_Release(state);
+			return py_svn_error();
 		}
 		Py_DECREF(ret);
 	} else if (PyFile_Check(ret)) {
@@ -654,14 +677,17 @@
 		if (status) {
 			PyErr_SetAprStatus(status);
 			Py_DECREF(ret);
-			return NULL;
+			PyGILState_Release(state);
+			return py_svn_error();
 		}
 	} else {
 		PyErr_SetString(PyExc_TypeError, "Unknown type for file variable");
 		Py_DECREF(ret);
-		return NULL;
+		PyGILState_Release(state);
+		return py_svn_error();
 	}	
 
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -1067,14 +1093,15 @@
 	PyObject *py_start_fn = PyTuple_GetItem(cbs, 0);
 	PyObject *py_revprops = prop_hash_to_dict(rev_props);
 	PyObject *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	ret = PyObject_CallFunction(py_start_fn, "lO", revision, py_revprops);
-	if (ret == NULL) 
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 
 	*editor = &py_editor;
 	*edit_baton = ret;
 
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -1086,14 +1113,15 @@
 	PyObject *py_finish_fn = PyTuple_GetItem(cbs, 1);
 	PyObject *py_revprops = prop_hash_to_dict(rev_props);
 	PyObject *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	ret = PyObject_CallFunction(py_finish_fn, "lOO", revision, py_revprops, edit_baton);
-	if (ret == NULL) 
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 
 	Py_DECREF((PyObject *)edit_baton);
 	Py_DECREF(ret);
 
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -1681,11 +1709,12 @@
 static svn_error_t *py_location_segment_receiver(svn_location_segment_t *segment, void *baton, apr_pool_t *pool)
 {
 	PyObject *fn = baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	ret = PyObject_CallFunction(fn, "llz", segment->range_start, segment->range_end, segment->path);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_XDECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 #endif
@@ -2227,31 +2256,39 @@
 {
 	PyObject *fn = (PyObject *)baton, *ret;
 	PyObject *py_username, *py_may_save;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallFunction(fn, "sb", realm, may_save);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 
-	if (ret == Py_None)
+	if (ret == Py_None) {
+		PyGILState_Release(state);
 		return NULL;
+	}
 
 	if (!PyTuple_Check(ret)) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple with username credentials");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	if (PyTuple_Size(ret) != 2) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple with username credentials to be size 2");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	py_may_save = PyTuple_GetItem(ret, 1);
+	CB_CHECK_PYRETVAL(py_may_save);
 	if (!PyBool_Check(py_may_save)) {
 		PyErr_SetString(PyExc_TypeError, "may_save should be boolean");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	py_username = PyTuple_GetItem(ret, 0);
+	CB_CHECK_PYRETVAL(py_username);
 	if (!PyString_Check(py_username)) {
 		PyErr_SetString(PyExc_TypeError, "username hsould be string");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
@@ -2259,6 +2296,7 @@
 	(*cred)->username = apr_pstrdup(pool, PyString_AsString(py_username));
 	(*cred)->may_save = (py_may_save == Py_True);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -2282,34 +2320,42 @@
 {
 	PyObject *fn = (PyObject *)baton, *ret;
 	PyObject *py_may_save, *py_username, *py_password;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallFunction(fn, "ssb", realm, username, may_save);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	if (!PyTuple_Check(ret)) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple with simple credentials");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	if (PyTuple_Size(ret) != 3) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple of size 3");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	py_may_save = PyTuple_GetItem(ret, 2);
+	CB_CHECK_PYRETVAL(py_may_save);
 
 	if (!PyBool_Check(py_may_save)) {
 		PyErr_SetString(PyExc_TypeError, "may_save should be boolean");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	
 	py_username = PyTuple_GetItem(ret, 0);
+	CB_CHECK_PYRETVAL(py_username);
 	if (!PyString_Check(py_username)) {
 		PyErr_SetString(PyExc_TypeError, "username should be string");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	py_password = PyTuple_GetItem(ret, 1);
+	CB_CHECK_PYRETVAL(py_password);
 	if (!PyString_Check(py_password)) {
 		PyErr_SetString(PyExc_TypeError, "password should be string");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
@@ -2318,6 +2364,7 @@
 	(*cred)->password = apr_pstrdup(pool, PyString_AsString(py_password));
 	(*cred)->may_save = (py_may_save == Py_True);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -2344,6 +2391,7 @@
 	PyObject *fn = (PyObject *)baton;
 	PyObject *ret;
 	PyObject *py_cert, *py_may_save, *py_accepted_failures;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	if (cert_info == NULL) {
 		py_cert = Py_None;
@@ -2353,32 +2401,34 @@
 						  cert_info->issuer_dname, cert_info->ascii_cert);
 	}
 
-	if (py_cert == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(py_cert);
 
 	ret = PyObject_CallFunction(fn, "slOb", realm, failures, py_cert, may_save);
 	Py_DECREF(py_cert);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 
 	if (!PyTuple_Check(ret)) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple with server trust credentials");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	if (PyTuple_Size(ret) != 2) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple of size 2");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	py_accepted_failures = PyTuple_GetItem(ret, 0);
 	if (!PyInt_Check(py_accepted_failures)) {
 		PyErr_SetString(PyExc_TypeError, "accepted_failures should be integer");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	py_may_save = PyTuple_GetItem(ret, 1);
 	if (!PyBool_Check(py_may_save)) {
 		PyErr_SetString(PyExc_TypeError, "may_save should be boolean");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	
@@ -2387,6 +2437,7 @@
 	(*cred)->may_save = (py_may_save == Py_True);
 
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -2412,60 +2463,69 @@
 static svn_error_t *py_ssl_client_cert_pw_prompt(svn_auth_cred_ssl_client_cert_pw_t **cred, void *baton, const char *realm, svn_boolean_t may_save, apr_pool_t *pool)
 {
 	PyObject *fn = (PyObject *)baton, *ret, *py_may_save, *py_password;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallFunction(fn, "sb", realm, may_save);
-	if (ret == NULL) 
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	if (!PyTuple_Check(ret)) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple with client cert pw credentials");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	if (PyTuple_Size(ret) != 2) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple of size 2");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	py_may_save = PyTuple_GetItem(ret, 1);
 	if (!PyBool_Check(py_may_save)) {
 		PyErr_SetString(PyExc_TypeError, "may_save should be boolean");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	py_password = PyTuple_GetItem(ret, 0);
 	if (!PyString_Check(py_password)) {
 		PyErr_SetString(PyExc_TypeError, "password should be string");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	*cred = apr_pcalloc(pool, sizeof(**cred));
 	(*cred)->password = apr_pstrdup(pool, PyString_AsString(py_password));
 	(*cred)->may_save = (py_may_save == Py_True);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_ssl_client_cert_prompt(svn_auth_cred_ssl_client_cert_t **cred, void *baton, const char *realm, svn_boolean_t may_save, apr_pool_t *pool)
 {
 	PyObject *fn = (PyObject *)baton, *ret, *py_may_save, *py_cert_file;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallFunction(fn, "sb", realm, may_save);
-	if (ret == NULL) 
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 
 	if (!PyTuple_Check(ret)) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple with client cert credentials");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	if (PyTuple_Size(ret) != 2) {
 		PyErr_SetString(PyExc_TypeError, "expected tuple of size 2");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	py_may_save = PyTuple_GetItem(ret, 1);
 	if (!PyBool_Check(py_may_save)) {
 		PyErr_SetString(PyExc_TypeError, "may_save should be boolean");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
 	py_cert_file = PyTuple_GetItem(ret, 0);
 	if (!PyString_Check(py_cert_file)) {
 		PyErr_SetString(PyExc_TypeError, "cert_file should be string");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 
@@ -2473,6 +2533,7 @@
 	(*cred)->cert_file = apr_pstrdup(pool, PyString_AsString(py_cert_file));
 	(*cred)->may_save = (py_may_save == Py_True);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 

=== modified file 'util.c'
--- a/util.c	2008-07-30 05:51:22 +0000
+++ b/util.c	2008-08-01 20:45:59 +0000
@@ -179,22 +179,22 @@
 svn_error_t *py_svn_log_entry_receiver(void *baton, svn_log_entry_t *log_entry, apr_pool_t *pool)
 {
 	PyObject *revprops, *py_changed_paths, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	py_changed_paths = pyify_changed_paths(log_entry->changed_paths, pool);
-	if (py_changed_paths == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(py_changed_paths);
 
 	revprops = prop_hash_to_dict(log_entry->revprops);
-	if (revprops == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(revprops);
 
 	ret = PyObject_CallFunction((PyObject *)baton, "OlOb", py_changed_paths, 
 								 log_entry->revision, revprops, log_entry->has_children);
 	Py_DECREF(py_changed_paths);
 	Py_DECREF(revprops);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+
+	PyGILState_Release(state);
 	return NULL;
 }
 #endif
@@ -202,12 +202,13 @@
 svn_error_t *py_svn_log_wrapper(void *baton, apr_hash_t *changed_paths, svn_revnum_t revision, const char *author, const char *date, const char *message, apr_pool_t *pool)
 {
 	PyObject *revprops, *py_changed_paths, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 
 	py_changed_paths = pyify_changed_paths(changed_paths, pool);
-	if (py_changed_paths == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(py_changed_paths);
 
 	revprops = PyDict_New();
+	CB_CHECK_PYRETVAL(revprops);
 	if (message != NULL) {
 		PyDict_SetItemString(revprops, SVN_PROP_REVISION_LOG, 
 							 PyString_FromString(message));
@@ -224,9 +225,10 @@
 								 revision, revprops, FALSE);
 	Py_DECREF(py_changed_paths);
 	Py_DECREF(revprops);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -264,37 +266,44 @@
 static svn_error_t *py_stream_read(void *baton, char *buffer, apr_size_t *length)
 {
 	PyObject *self = (PyObject *)baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
+
 	ret = PyObject_CallMethod(self, "read", "i", *length);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
+
 	if (!PyString_Check(ret)) {
 		PyErr_SetString(PyExc_TypeError, "Expected stream read function to return string");
+		PyGILState_Release(state);
 		return py_svn_error();
 	}
 	*length = PyString_Size(ret);
 	memcpy(buffer, PyString_AS_STRING(ret), *length);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_stream_write(void *baton, const char *data, apr_size_t *len)
 {
 	PyObject *self = (PyObject *)baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
+
 	ret = PyObject_CallMethod(self, "write", "s#", data, len[0]);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_stream_close(void *baton)
 {
 	PyObject *self = (PyObject *)baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "close", "");
 	Py_DECREF(self);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
 	Py_DECREF(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 

=== modified file 'util.h'
--- a/util.h	2008-07-01 21:19:01 +0000
+++ b/util.h	2008-08-01 20:45:59 +0000
@@ -58,4 +58,10 @@
 
 #pragma GCC visibility pop
 
+#define CB_CHECK_PYRETVAL(ret) \
+	if (ret == NULL) { \
+		PyGILState_Release(state); \
+		return py_svn_error(); \
+	}
+
 #endif /* _BZR_SVN_UTIL_H_ */

=== modified file 'wc.c'
--- a/wc.c	2008-07-30 07:15:40 +0000
+++ b/wc.c	2008-08-01 20:45:59 +0000
@@ -34,55 +34,60 @@
 static svn_error_t *py_ra_report_set_path(void *baton, const char *path, svn_revnum_t revision, int start_empty, const char *lock_token, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)baton, *py_lock_token, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	if (lock_token == NULL) {
 		py_lock_token = Py_None;
 	} else {
 		py_lock_token = PyString_FromString(lock_token);
 	}
 	ret = PyObject_CallMethod(self, "set_path", "slbO", path, revision, start_empty, py_lock_token);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_ra_report_delete_path(void *baton, const char *path, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "delete_path", "s", path);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_ra_report_link_path(void *report_baton, const char *path, const char *url, svn_revnum_t revision, int start_empty, const char *lock_token, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)report_baton, *ret, *py_lock_token;
+	PyGILState_STATE state = PyGILState_Ensure();
 	if (lock_token == NULL) {
 		py_lock_token = Py_None;
 	} else { 
 		py_lock_token = PyString_FromString(lock_token);
 	}
 	ret = PyObject_CallMethod(self, "link_path", "sslbO", path, url, revision, start_empty, py_lock_token);
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_ra_report_finish(void *baton, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "finish", "");
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
 static svn_error_t *py_ra_report_abort(void *baton, apr_pool_t *pool)
 {
 	PyObject *self = (PyObject *)baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallMethod(self, "abort", "");
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 
@@ -111,9 +116,10 @@
 static svn_error_t *py_wc_found_entry(const char *path, const svn_wc_entry_t *entry, void *walk_baton, apr_pool_t *pool)
 {
 	PyObject *fn = (PyObject *)walk_baton, *ret;
+	PyGILState_STATE state = PyGILState_Ensure();
 	ret = PyObject_CallFunction(fn, "sO", path, py_entry(entry));
-	if (ret == NULL)
-		return py_svn_error();
+	CB_CHECK_PYRETVAL(ret);
+	PyGILState_Release(state);
 	return NULL;
 }
 




More information about the bazaar-commits mailing list