summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Parente Lima <hugo.pl@gmail.com>2011-01-04 18:46:40 -0200
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:48:07 -0300
commitaa305dc5ae5f463c31938fb50cd92257b0fc7911 (patch)
tree5147f99ab893e27e54e752cff69de7d6c211bb65
parentf7fd9277f47359f8eb4490bcb8f5bdc84000035e (diff)
Lock the gil on some hand written code to avoid crashes.
Reviewer: Renato Ara├║jo <renato.filho@openbossa.org> Marcelo Lira <marcelo.lira@openbossa.org>
-rw-r--r--PySide/QtCore/typesystem_core.xml8
-rw-r--r--PySide/QtDeclarative/pysideqmlregistertype.cpp6
2 files changed, 10 insertions, 4 deletions
diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml
index 54513f95..f41acd5c 100644
--- a/PySide/QtCore/typesystem_core.xml
+++ b/PySide/QtCore/typesystem_core.xml
@@ -650,13 +650,13 @@
// Define a global variable to handle qInstallMsgHandler callback
static PyObject* qtmsghandler = 0;
- void
- msghandlercallback(QtMsgType type, const char* msg)
+ static void msgHandlerCallback(QtMsgType type, const char* msg)
{
+ Shiboken::GilState state;
Shiboken::AutoDecRef arglist(Shiboken::makeTuple(type, msg));
Shiboken::AutoDecRef ret(PyObject_CallObject(qtmsghandler, arglist));
}
- void QtCoreModuleExit()
+ static void QtCoreModuleExit()
{
PySide::SignalManager::instance().clear();
}
@@ -673,7 +673,7 @@
%PYARG_0 = qtmsghandler ? qtmsghandler : Py_None;
Py_INCREF(%PYARG_1);
qtmsghandler = %PYARG_1;
- qInstallMsgHandler(msghandlercallback);
+ qInstallMsgHandler(msgHandlerCallback);
}
if (%PYARG_0 == Py_None)
diff --git a/PySide/QtDeclarative/pysideqmlregistertype.cpp b/PySide/QtDeclarative/pysideqmlregistertype.cpp
index 362e56d6..0b057586 100644
--- a/PySide/QtDeclarative/pysideqmlregistertype.cpp
+++ b/PySide/QtDeclarative/pysideqmlregistertype.cpp
@@ -27,6 +27,7 @@
#include <QMutex>
// shiboken
#include <typeresolver.h>
+#include <gilstate.h>
#include <sbkdbg.h>
// pyside
#include <pyside.h>
@@ -63,6 +64,7 @@ struct ElementFactoryBase
{
QMutexLocker locker(&nextQmlElementMutex);
PySide::nextQmlElementMemoryAddr = memory;
+ Shiboken::GilState state;
PyObject* obj = PyObject_CallObject(pyTypes[N], 0);
if (!obj || PyErr_Occurred())
PyErr_Print();
@@ -246,6 +248,7 @@ PyTypeObject PropertyListType = {
// Implementation of QDeclarativeListProperty<T>::AppendFunction callback
void propListAppender(QDeclarativeListProperty<QDeclarativeItem>* propList, QDeclarativeItem* item)
{
+ Shiboken::GilState state;
Shiboken::AutoDecRef args(Shiboken::makeTuple(propList->object, item));
DeclarativeListProperty* data = reinterpret_cast<DeclarativeListProperty*>(propList->data);
@@ -258,6 +261,7 @@ void propListAppender(QDeclarativeListProperty<QDeclarativeItem>* propList, QDec
// Implementation of QDeclarativeListProperty<T>::CountFunction callback
int propListCount(QDeclarativeListProperty<QDeclarativeItem>* propList)
{
+ Shiboken::GilState state;
Shiboken::AutoDecRef args(Shiboken::makeTuple(propList->object));
DeclarativeListProperty* data = reinterpret_cast<DeclarativeListProperty*>(propList->data);
@@ -275,6 +279,7 @@ int propListCount(QDeclarativeListProperty<QDeclarativeItem>* propList)
// Implementation of QDeclarativeListProperty<T>::AtFunction callback
QDeclarativeItem* propListAt(QDeclarativeListProperty<QDeclarativeItem>* propList, int index)
{
+ Shiboken::GilState state;
Shiboken::AutoDecRef args(Shiboken::makeTuple(propList->object, index));
DeclarativeListProperty* data = reinterpret_cast<DeclarativeListProperty*>(propList->data);
@@ -291,6 +296,7 @@ QDeclarativeItem* propListAt(QDeclarativeListProperty<QDeclarativeItem>* propLis
// Implementation of QDeclarativeListProperty<T>::ClearFunction callback
void propListClear(QDeclarativeListProperty<QDeclarativeItem>* propList)
{
+ Shiboken::GilState state;
Shiboken::AutoDecRef args(Shiboken::makeTuple(propList->object));
DeclarativeListProperty* data = reinterpret_cast<DeclarativeListProperty*>(propList->data);