summaryrefslogtreecommitdiff
path: root/gtk/pygtktreemodel.c
diff options
context:
space:
mode:
authorJohan Dahlin <zilch@src.gnome.org>2002-12-28 14:38:45 +0000
committerJohan Dahlin <zilch@src.gnome.org>2002-12-28 14:38:45 +0000
commit3c903d887ceb4a796e40ed23a61634a6665131fc (patch)
tree8d906cc092cc7f3ebdb9ee1c1de940e7fb102e5e /gtk/pygtktreemodel.c
parent599e8cc502f9f2f2daf5bdf6e30cdf9e4e8892fd (diff)
downloadpygtk-3c903d887ceb4a796e40ed23a61634a6665131fc.tar.gz
Improve threading support by adding pyg_thread_block/unblock around all
* gobjectmodule.c, gtk/gtk.override, gtk/pygtkcellrenderer.c, gtk/pygtktreemodel: Improve threading support by adding pyg_thread_block/unblock around all PyObject_Call* and g_object_refs. Based upon patch by Jon Trowbridge. Fixes #99102.
Diffstat (limited to 'gtk/pygtktreemodel.c')
-rw-r--r--gtk/pygtktreemodel.c82
1 files changed, 60 insertions, 22 deletions
diff --git a/gtk/pygtktreemodel.c b/gtk/pygtktreemodel.c
index 46e868dd..d9757d91 100644
--- a/gtk/pygtktreemodel.c
+++ b/gtk/pygtktreemodel.c
@@ -191,23 +191,26 @@ pygtk_generic_tree_model_get_flags(GtkTreeModel *tree_model)
PyObject *self, *py_ret;
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), 0);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
#ifdef DEBUG_TREE_MODEL
g_message("get_flags()");
#endif
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_flags", "");
- pyg_unblock_threads();
if (py_ret) {
guint ret = PyInt_AsLong(py_ret);
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return ret;
} else {
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return 0;
}
}
@@ -219,23 +222,26 @@ pygtk_generic_tree_model_get_n_columns(GtkTreeModel *tree_model)
g_return_val_if_fail(tree_model != NULL, 0);
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), 0);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
#ifdef DEBUG_TREE_MODEL
g_message("get_n_columns()");
#endif
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_n_columns", "");
- pyg_unblock_threads();
if (py_ret) {
gint ret = PyInt_AsLong(py_ret);
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return ret;
} else {
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return 0;
}
}
@@ -247,24 +253,26 @@ pygtk_generic_tree_model_get_column_type(GtkTreeModel *tree_model, gint index)
g_return_val_if_fail(tree_model != NULL, G_TYPE_INVALID);
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), G_TYPE_INVALID);
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
#ifdef DEBUG_TREE_MODEL
g_message("get_column_type(%d)", index);
#endif
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_column_type",
"(i)", index);
- pyg_unblock_threads();
if (py_ret) {
GType ret = pyg_type_from_object(py_ret);
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return ret;
} else {
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return G_TYPE_INVALID;
}
}
@@ -279,6 +287,9 @@ pygtk_generic_tree_model_get_iter(GtkTreeModel *tree_model,
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
g_return_val_if_fail(iter != NULL, FALSE);
g_return_val_if_fail(path != NULL, FALSE);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
@@ -286,10 +297,8 @@ pygtk_generic_tree_model_get_iter(GtkTreeModel *tree_model,
g_message("get_iter(%p)", path);
#endif
py_path = pygtk_tree_path_to_pyobject(path);
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "get_iter",
"(O)", py_path);
- pyg_unblock_threads();
Py_DECREF(py_path);
if (py_ret) {
@@ -298,16 +307,19 @@ pygtk_generic_tree_model_get_iter(GtkTreeModel *tree_model,
if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
Py_DECREF((PyObject *)iter->user_data);
}
+ pyg_unblock_threads();
return TRUE;
} else {
iter->user_data = NULL;
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return FALSE;
}
} else {
PyErr_Print();
PyErr_Clear();
iter->user_data = NULL;
+ pyg_unblock_threads();
return FALSE;
}
}
@@ -337,10 +349,12 @@ pygtk_generic_tree_model_get_path(GtkTreeModel *tree_model, GtkTreeIter *iter)
g_warning("could not convert return value of get_path() to "
"a GtkTreePath");
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return path;
} else {
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return NULL;
}
}
@@ -354,6 +368,9 @@ pygtk_generic_tree_model_get_value(GtkTreeModel*tree_model, GtkTreeIter *iter,
g_return_if_fail(tree_model != NULL);
g_return_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model));
g_return_if_fail(iter != NULL);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
@@ -364,10 +381,8 @@ pygtk_generic_tree_model_get_value(GtkTreeModel*tree_model, GtkTreeIter *iter,
/* init value to column type */
g_value_init(value, pygtk_generic_tree_model_get_column_type(tree_model, column));
- pyg_block_threads();
py_value = PyObject_CallMethod(self, METHOD_PREFIX "get_value",
"(Oi)", (PyObject *)iter->user_data,column);
- pyg_unblock_threads();
if (py_value) {
pyg_value_from_pyobject(value, py_value);
@@ -376,6 +391,7 @@ pygtk_generic_tree_model_get_value(GtkTreeModel*tree_model, GtkTreeIter *iter,
PyErr_Print();
PyErr_Clear();
}
+ pyg_unblock_threads();
}
static gboolean
@@ -386,16 +402,17 @@ pygtk_generic_tree_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter)
g_return_val_if_fail(tree_model != NULL, FALSE);
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
g_return_val_if_fail(iter != NULL, FALSE);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
#ifdef DEBUG_TREE_MODEL
g_message("iter_next(%p)", iter);
#endif
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_next",
"(O)", (PyObject *)iter->user_data);
- pyg_unblock_threads();
if (py_ret) {
if (py_ret != Py_None) {
/* XXXX handle reference counting here */
@@ -403,16 +420,19 @@ pygtk_generic_tree_model_iter_next(GtkTreeModel *tree_model, GtkTreeIter *iter)
if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
Py_DECREF((PyObject *)iter->user_data);
}
+ pyg_unblock_threads();
return TRUE;
} else {
iter->user_data = NULL;
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return FALSE;
}
} else {
iter->user_data = NULL;
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return FALSE;
}
}
@@ -426,6 +446,9 @@ pygtk_generic_tree_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *it
g_return_val_if_fail(tree_model != NULL, FALSE);
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
g_return_val_if_fail(iter != NULL, FALSE);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
@@ -434,10 +457,8 @@ pygtk_generic_tree_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *it
#endif
if (parent && parent->user_data != NULL)
py_parent = (PyObject *)parent->user_data;
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_children",
"(O)", py_parent);
- pyg_unblock_threads();
if (py_ret) {
if (py_ret != Py_None) {
/* XXXX handle reference counting here */
@@ -445,16 +466,19 @@ pygtk_generic_tree_model_iter_children(GtkTreeModel *tree_model, GtkTreeIter *it
if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
Py_DECREF((PyObject *)iter->user_data);
}
+ pyg_unblock_threads();
return TRUE;
} else {
iter->user_data = NULL;
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return FALSE;
}
} else {
iter->user_data = NULL;
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return FALSE;
}
}
@@ -467,24 +491,27 @@ pygtk_generic_tree_model_iter_has_child(GtkTreeModel *tree_model, GtkTreeIter *i
g_return_val_if_fail(tree_model != NULL, FALSE);
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
g_return_val_if_fail(iter != NULL, FALSE);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
#ifdef DEBUG_TREE_MODEL
g_message("iter_has_child(%p)", iter);
#endif
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_has_child",
"(O)", (PyObject *)iter->user_data);
- pyg_unblock_threads();
if (py_ret) {
gboolean ret = PyObject_IsTrue(py_ret);
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return ret;
} else {
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return FALSE;
}
}
@@ -497,24 +524,27 @@ pygtk_generic_tree_model_iter_n_children(GtkTreeModel *tree_model, GtkTreeIter *
g_return_val_if_fail(tree_model != NULL, FALSE);
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
g_return_val_if_fail(iter != NULL, FALSE);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
#ifdef DEBUG_TREE_MODEL
g_message("iter_n_children(%p)", iter);
#endif
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_n_children",
"(O)", (PyObject *)iter->user_data);
- pyg_unblock_threads();
if (py_ret) {
gint ret = PyInt_AsLong(py_ret);
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return ret;
} else {
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return 0;
}
}
@@ -528,6 +558,9 @@ pygtk_generic_tree_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *
g_return_val_if_fail(tree_model != NULL, FALSE);
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
g_return_val_if_fail(iter != NULL, FALSE);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
@@ -536,10 +569,8 @@ pygtk_generic_tree_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *
#endif
if (parent && parent->user_data != NULL)
py_parent = (PyObject *)parent->user_data;
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_nth_child",
"(Oi)", py_parent, n);
- pyg_unblock_threads();
if (py_ret) {
if (py_ret != Py_None) {
/* XXXX handle reference counting here */
@@ -547,16 +578,19 @@ pygtk_generic_tree_model_iter_nth_child(GtkTreeModel *tree_model, GtkTreeIter *
if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
Py_DECREF((PyObject *)iter->user_data);
}
+ pyg_unblock_threads();
return TRUE;
} else {
iter->user_data = NULL;
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return FALSE;
}
} else {
iter->user_data = NULL;
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return FALSE;
}
}
@@ -570,6 +604,9 @@ pygtk_generic_tree_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter
g_return_val_if_fail(tree_model != NULL, FALSE);
g_return_val_if_fail(PYGTK_IS_GENERIC_TREE_MODEL(tree_model), FALSE);
g_return_val_if_fail(iter != NULL, FALSE);
+
+ pyg_block_threads();
+
/* this call finds the wrapper for this GObject */
self = pygobject_new((GObject *)tree_model);
@@ -578,10 +615,8 @@ pygtk_generic_tree_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter
#endif
if (child && child->user_data != NULL)
py_child = (PyObject *)child->user_data;
- pyg_block_threads();
py_ret = PyObject_CallMethod(self, METHOD_PREFIX "iter_parent",
"(O)", py_child);
- pyg_unblock_threads();
if (py_ret) {
if (py_ret != Py_None) {
/* XXXX handle reference counting here */
@@ -589,16 +624,19 @@ pygtk_generic_tree_model_iter_parent(GtkTreeModel *tree_model, GtkTreeIter *iter
if (!PYGTK_GENERIC_TREE_MODEL(tree_model)->leak_references) {
Py_DECREF((PyObject *)iter->user_data);
}
+ pyg_unblock_threads();
return TRUE;
} else {
iter->user_data = NULL;
Py_DECREF(py_ret);
+ pyg_unblock_threads();
return FALSE;
}
} else {
iter->user_data = NULL;
PyErr_Print();
PyErr_Clear();
+ pyg_unblock_threads();
return FALSE;
}
}