Add and use the wxPyThreadBlocker class.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxPython/Phoenix/trunk@71603 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn
2012-05-30 03:24:34 +00:00
parent 209b24057c
commit 787cfb858e
19 changed files with 101 additions and 122 deletions

View File

@@ -33,29 +33,24 @@ public:
wxPyInputStream(PyObject* fileObj, bool block=true)
{
m_block = block;
wxPyBlock_t blocked = wxPyBlock_t_default;
if (block) blocked = wxPyBeginBlockThreads();
wxPyThreadBlocker blocker(m_block);
m_read = wxPyGetMethod(fileObj, "read");
m_seek = wxPyGetMethod(fileObj, "seek");
m_tell = wxPyGetMethod(fileObj, "tell");
if (block) wxPyEndBlockThreads(blocked);
}
virtual ~wxPyInputStream()
{
wxPyBlock_t blocked = wxPyBlock_t_default;
if (m_block) blocked = wxPyBeginBlockThreads();
wxPyThreadBlocker blocker(m_block);
Py_XDECREF(m_read);
Py_XDECREF(m_seek);
Py_XDECREF(m_tell);
if (m_block) wxPyEndBlockThreads(blocked);
}
wxPyInputStream(const wxPyInputStream& other)
{
wxPyBlock_t blocked = wxPyBeginBlockThreads();
wxPyThreadBlocker blocker;
m_read = other.m_read;
m_seek = other.m_seek;
m_tell = other.m_tell;
@@ -63,7 +58,6 @@ public:
Py_INCREF(m_read);
Py_INCREF(m_seek);
Py_INCREF(m_tell);
wxPyEndBlockThreads(blocked);
}
protected:
@@ -88,7 +82,7 @@ protected:
if (bufsize == 0)
return 0;
wxPyBlock_t blocked = wxPyBeginBlockThreads();
wxPyThreadBlocker blocker;
PyObject* arglist = Py_BuildValue("(i)", bufsize);
PyObject* result = PyEval_CallObject(m_read, arglist);
Py_DECREF(arglist);
@@ -106,7 +100,6 @@ protected:
}
else
m_lasterror = wxSTREAM_READ_ERROR;
wxPyEndBlockThreads(blocked);
return o;
}
@@ -118,7 +111,7 @@ protected:
wxFileOffset OnSysSeek(wxFileOffset off, wxSeekMode mode)
{
wxPyBlock_t blocked = wxPyBeginBlockThreads();
wxPyThreadBlocker blocker;
PyObject* arglist = PyTuple_New(2);
if (sizeof(wxFileOffset) > sizeof(long))
@@ -133,13 +126,12 @@ protected:
PyObject* result = PyEval_CallObject(m_seek, arglist);
Py_DECREF(arglist);
Py_XDECREF(result);
wxPyEndBlockThreads(blocked);
return OnSysTell();
}
wxFileOffset OnSysTell() const
{
wxPyBlock_t blocked = wxPyBeginBlockThreads();
wxPyThreadBlocker blocker;
PyObject* arglist = Py_BuildValue("()");
PyObject* result = PyEval_CallObject(m_tell, arglist);
Py_DECREF(arglist);
@@ -151,7 +143,6 @@ protected:
o = wxPyInt_AsLong(result);
Py_DECREF(result);
};
wxPyEndBlockThreads(blocked);
return o;
}