summaryrefslogtreecommitdiffstats
path: root/Modules/threadmodule.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2009-10-30 17:07:08 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2009-10-30 17:07:08 (GMT)
commit59c44f36e0a575671c0e8dab6a9de88666e481b0 (patch)
treed56d849af56fbc8af46e39c316cbfb1bb86cce36 /Modules/threadmodule.c
parent93c21714946d5fa287bb4aa1d9acb46d55f0b742 (diff)
downloadcpython-59c44f36e0a575671c0e8dab6a9de88666e481b0.zip
cpython-59c44f36e0a575671c0e8dab6a9de88666e481b0.tar.gz
cpython-59c44f36e0a575671c0e8dab6a9de88666e481b0.tar.bz2
Issue #7222: Make thread "reaping" more reliable so that reference
leak-chasing test runs give sensible results. The previous method of reaping threads could return successfully while some Thread objects were still referenced. This also introduces a new private function: :func:hread._count().
Diffstat (limited to 'Modules/threadmodule.c')
-rw-r--r--Modules/threadmodule.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c
index f6d7ee4..c962c79 100644
--- a/Modules/threadmodule.c
+++ b/Modules/threadmodule.c
@@ -14,7 +14,7 @@
#include "pythread.h"
static PyObject *ThreadError;
-
+static long nb_threads = 0;
/* Lock objects */
@@ -439,6 +439,7 @@ t_bootstrap(void *boot_raw)
tstate = PyThreadState_New(boot->interp);
PyEval_AcquireThread(tstate);
+ nb_threads++;
res = PyEval_CallObjectWithKeywords(
boot->func, boot->args, boot->keyw);
if (res == NULL) {
@@ -463,6 +464,7 @@ t_bootstrap(void *boot_raw)
Py_DECREF(boot->args);
Py_XDECREF(boot->keyw);
PyMem_DEL(boot_raw);
+ nb_threads--;
PyThreadState_Clear(tstate);
PyThreadState_DeleteCurrent();
PyThread_exit_thread();
@@ -606,6 +608,18 @@ be relied upon, and the number should be seen purely as a magic cookie.\n\
A thread's identity may be reused for another thread after it exits.");
static PyObject *
+thread__count(PyObject *self)
+{
+ return PyInt_FromLong(nb_threads);
+}
+
+PyDoc_STRVAR(_count_doc,
+"_count() -> integer\n\
+\n\
+Return the number of currently running (sub)threads.\n\
+This excludes the main thread.");
+
+static PyObject *
thread_stack_size(PyObject *self, PyObject *args)
{
size_t old_size;
@@ -678,6 +692,8 @@ static PyMethodDef thread_methods[] = {
METH_NOARGS, interrupt_doc},
{"get_ident", (PyCFunction)thread_get_ident,
METH_NOARGS, get_ident_doc},
+ {"_count", (PyCFunction)thread__count,
+ METH_NOARGS, _count_doc},
{"stack_size", (PyCFunction)thread_stack_size,
METH_VARARGS,
stack_size_doc},
@@ -735,6 +751,8 @@ initthread(void)
if (PyModule_AddObject(m, "_local", (PyObject *)&localtype) < 0)
return;
+ nb_threads = 0;
+
/* Initialize the C thread library */
PyThread_init_thread();
}