mirror of
https://github.com/python/cpython.git
synced 2025-11-01 02:38:53 +00:00
Merged revisions 68425,68461,68498 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r68425 | benjamin.peterson | 2009-01-08 20:56:32 -0600 (Thu, 08 Jan 2009) | 1 line fix markup ........ r68461 | kristjan.jonsson | 2009-01-09 15:35:16 -0600 (Fri, 09 Jan 2009) | 2 lines Issue 4293: Make Py_AddPendingCall() thread safe Add test cases and documentation ........ r68498 | benjamin.peterson | 2009-01-10 13:08:49 -0600 (Sat, 10 Jan 2009) | 1 line fix encoding ........
This commit is contained in:
parent
f343e01c17
commit
a54c9090ac
4 changed files with 158 additions and 5 deletions
|
|
@ -919,6 +919,43 @@ test_thread_state(PyObject *self, PyObject *args)
|
|||
return NULL;
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
/* test Py_AddPendingCalls using threads */
|
||||
static int _pending_callback(void *arg)
|
||||
{
|
||||
/* we assume the argument is callable object to which we own a reference */
|
||||
PyObject *callable = (PyObject *)arg;
|
||||
PyObject *r = PyObject_CallObject(callable, NULL);
|
||||
Py_DECREF(callable);
|
||||
Py_XDECREF(r);
|
||||
return r != NULL ? 0 : -1;
|
||||
}
|
||||
|
||||
/* The following requests n callbacks to _pending_callback. It can be
|
||||
* run from any python thread.
|
||||
*/
|
||||
PyObject *pending_threadfunc(PyObject *self, PyObject *arg)
|
||||
{
|
||||
PyObject *callable;
|
||||
int r;
|
||||
if (PyArg_ParseTuple(arg, "O", &callable) == 0)
|
||||
return NULL;
|
||||
|
||||
/* create the reference for the callbackwhile we hold the lock */
|
||||
Py_INCREF(callable);
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
r = Py_AddPendingCall(&_pending_callback, callable);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
if (r<0) {
|
||||
Py_DECREF(callable); /* unsuccessful add, destroy the extra reference */
|
||||
Py_INCREF(Py_False);
|
||||
return Py_False;
|
||||
}
|
||||
Py_INCREF(Py_True);
|
||||
return Py_True;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Some tests of PyUnicode_FromFormat(). This needs more tests. */
|
||||
|
|
@ -1171,6 +1208,7 @@ static PyMethodDef TestMethods[] = {
|
|||
{"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS},
|
||||
#ifdef WITH_THREAD
|
||||
{"_test_thread_state", test_thread_state, METH_VARARGS},
|
||||
{"_pending_threadfunc", pending_threadfunc, METH_VARARGS},
|
||||
#endif
|
||||
#ifdef HAVE_GETTIMEOFDAY
|
||||
{"profile_int", profile_int, METH_NOARGS},
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue