diff options
author | Johan Dahlin <zilch@src.gnome.org> | 2002-12-28 14:38:45 +0000 |
---|---|---|
committer | Johan Dahlin <zilch@src.gnome.org> | 2002-12-28 14:38:45 +0000 |
commit | 3c903d887ceb4a796e40ed23a61634a6665131fc (patch) | |
tree | 8d906cc092cc7f3ebdb9ee1c1de940e7fb102e5e /gtk/pygtktreemodel.c | |
parent | 599e8cc502f9f2f2daf5bdf6e30cdf9e4e8892fd (diff) | |
download | pygtk-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.c | 82 |
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; } } |