Fix bug 728 - "QFileDialog.getOpenFileNames never returns (hangs)"

Reviewer: Lauro Moura <lauro.neto@openbossa.org>
          Luciano Wolf <luciano.wolf@openbossa.org>
This commit is contained in:
Hugo Parente Lima 2011-03-21 15:11:03 -03:00
commit 44f5f62618
3 changed files with 47 additions and 0 deletions

View file

@ -31,47 +31,65 @@
<!-- Templates to fix bool* parameters --> <!-- Templates to fix bool* parameters -->
<template name="fix_bool*"> <template name="fix_bool*">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;ok_); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;ok_);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="fix_args,bool*"> <template name="fix_args,bool*">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &amp;ok_); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &amp;ok_);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="fix_arg,bool*,arg"> <template name="fix_arg,bool*,arg">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, &amp;ok_, %3); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, &amp;ok_, %3);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="fix_bool*,arg"> <template name="fix_bool*,arg">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;ok_, %2); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;ok_, %2);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="fix_bool*,arg,arg"> <template name="fix_bool*,arg,arg">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;ok_, %2, %3); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;ok_, %2, %3);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="fix_bool*,arg,arg,arg"> <template name="fix_bool*,arg,arg,arg">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;ok_, %2, %3, %4); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;ok_, %2, %3, %4);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="fix_arg,arg,arg,arg,arg,arg,arg,bool*,arg"> <template name="fix_arg,arg,arg,arg,arg,arg,arg,bool*,arg">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, %7, &amp;ok_, %9); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, %7, &amp;ok_, %9);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="fix_arg,arg,arg,arg,arg,arg,bool*,arg"> <template name="fix_arg,arg,arg,arg,arg,arg,bool*,arg">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, &amp;ok_, %8); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6, &amp;ok_, %8);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="fix_arg,arg,arg,arg,arg,bool*,arg"> <template name="fix_arg,arg,arg,arg,arg,bool*,arg">
bool ok_; bool ok_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, &amp;ok_, %7); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, &amp;ok_, %7);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, ok_); %PYARG_0 = Shiboken::makeTuple(retval_, ok_);
</template> </template>
<template name="get_slice"> <template name="get_slice">
@ -102,37 +120,49 @@
<template name="fix_args,QRectF*"> <template name="fix_args,QRectF*">
QRectF rect_; QRectF rect_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &amp;rect_); %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &amp;rect_);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = %CONVERTTOPYTHON[QRectF](rect_); %PYARG_0 = %CONVERTTOPYTHON[QRectF](rect_);
</template> </template>
<template name="fix_args,QRect*"> <template name="fix_args,QRect*">
QRect rect_; QRect rect_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &amp;rect_); %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &amp;rect_);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = %CONVERTTOPYTHON[QRect](rect_); %PYARG_0 = %CONVERTTOPYTHON[QRect](rect_);
</template> </template>
<template name="fix_char*"> <template name="fix_char*">
char val_; char val_;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;val_); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&amp;val_);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, val_); %PYARG_0 = Shiboken::makeTuple(retval_, val_);
</template> </template>
<template name="fix_int*,int*,int*,int*"> <template name="fix_int*,int*,int*,int*">
int a, b, c, d; int a, b, c, d;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%CPPSELF.%FUNCTION_NAME(&amp;a, &amp;b, &amp;c, &amp;d); %CPPSELF.%FUNCTION_NAME(&amp;a, &amp;b, &amp;c, &amp;d);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(a, b, c, d); %PYARG_0 = Shiboken::makeTuple(a, b, c, d);
</template> </template>
<template name="fix_qreal*,qreal*,qreal*,qreal*"> <template name="fix_qreal*,qreal*,qreal*,qreal*">
qreal a, b, c, d; qreal a, b, c, d;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%CPPSELF.%FUNCTION_NAME(&amp;a, &amp;b, &amp;c, &amp;d); %CPPSELF.%FUNCTION_NAME(&amp;a, &amp;b, &amp;c, &amp;d);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(a, b, c, d); %PYARG_0 = Shiboken::makeTuple(a, b, c, d);
</template> </template>
<template name="fix_int*,int*,int*,int*,int*"> <template name="fix_int*,int*,int*,int*,int*">
int a, b, c, d, e; int a, b, c, d, e;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%CPPSELF.%FUNCTION_NAME(&amp;a, &amp;b, &amp;c, &amp;d, &amp;e); %CPPSELF.%FUNCTION_NAME(&amp;a, &amp;b, &amp;c, &amp;d, &amp;e);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(a, b, c, d, e); %PYARG_0 = Shiboken::makeTuple(a, b, c, d, e);
</template> </template>
<template name="fix_qreal*,qreal*,qreal*,qreal*,qreal*"> <template name="fix_qreal*,qreal*,qreal*,qreal*,qreal*">
@ -151,7 +181,9 @@
<template name="fix_return_args,int*"> <template name="fix_return_args,int*">
RETURNTYPE _ret; RETURNTYPE _ret;
int _arg; int _arg;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
_ret = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &amp;_arg); _ret = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &amp;_arg);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(_ret, _arg); %PYARG_0 = Shiboken::makeTuple(_ret, _arg);
</template> </template>
@ -165,7 +197,9 @@
<template name="fix_arg,int*,int*"> <template name="fix_arg,int*,int*">
%RETURN_TYPE _ret; %RETURN_TYPE _ret;
int a, b; int a, b;
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
_ret = %CPPSELF.%FUNCTION_NAME(%1, &amp;a, &amp;b); _ret = %CPPSELF.%FUNCTION_NAME(%1, &amp;a, &amp;b);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(_ret, a, b); %PYARG_0 = Shiboken::makeTuple(_ret, a, b);
</template> </template>
@ -174,12 +208,16 @@
</template> </template>
<template name="return_tuple_QValidator_QString_int"> <template name="return_tuple_QValidator_QString_int">
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %RETURN_TYPE(%CPPSELF.%FUNCTION_NAME(%1, %2)); %RETURN_TYPE retval_ = %RETURN_TYPE(%CPPSELF.%FUNCTION_NAME(%1, %2));
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, %1, %2); %PYARG_0 = Shiboken::makeTuple(retval_, %1, %2);
</template> </template>
<template name="return_for_QFileDialog"> <template name="return_for_QFileDialog">
PyThreadState* _save = PyEval_SaveThread(); // Py_BEGIN_ALLOW_THREADS
%RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6); %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2, %3, %4, %5, %6);
PyEval_RestoreThread(_save); // Py_END_ALLOW_THREADS
%PYARG_0 = Shiboken::makeTuple(retval_, %4); %PYARG_0 = Shiboken::makeTuple(retval_, %4);
</template> </template>
<template name="set_qapp_parent_for_orphan"> <template name="set_qapp_parent_for_orphan">

View file

@ -44,6 +44,7 @@ PYSIDE_TEST(bug_675.py)
PYSIDE_TEST(bug_696.py) PYSIDE_TEST(bug_696.py)
PYSIDE_TEST(bug_693.py) PYSIDE_TEST(bug_693.py)
PYSIDE_TEST(bug_714.py) PYSIDE_TEST(bug_714.py)
PYSIDE_TEST(bug_728.py)
PYSIDE_TEST(customproxywidget_test.py) PYSIDE_TEST(customproxywidget_test.py)
PYSIDE_TEST(deepcopy_test.py) PYSIDE_TEST(deepcopy_test.py)
PYSIDE_TEST(float_to_int_implicit_conversion_test.py) PYSIDE_TEST(float_to_int_implicit_conversion_test.py)

8
tests/QtGui/bug_728.py Normal file
View file

@ -0,0 +1,8 @@
from PySide.QtGui import *
from PySide.QtCore import *
app = QApplication([])
QTimer.singleShot(200, app.quit)
# This test for a dead lock in QFileDialog.getOpenFileNames, the test fail with a timeout if the dead lock exists.
QFileDialog.getOpenFileNames(None, "caption", QDir.homePath(), None, QFileDialog.DontUseNativeDialog)