diff Modules/_threadmodule.c @ 56981:6cf84e5a6dd7

Merged revisions 75958 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r75958 | antoine.pitrou | 2009-10-30 18:07:08 +0100 (ven., 30 oct. 2009) | 7 lines 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(). ........
author Antoine Pitrou <solipsis@pitrou.net>
date Fri, 30 Oct 2009 17:25:12 +0000
parents 29908f2bc93f
children bf93e4df7bfb
line wrap: on
line diff
--- a/Modules/_threadmodule.c	Thu Oct 29 12:23:02 2009 +0000
+++ b/Modules/_threadmodule.c	Fri Oct 30 17:25:12 2009 +0000
@@ -14,7 +14,7 @@
 #include "pythread.h"
 
 static PyObject *ThreadError;
-
+static long nb_threads = 0;
 
 /* Lock objects */
 
@@ -439,6 +439,7 @@
 	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 @@
 	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 @@
 A thread's identity may be reused for another thread after it exits.");
 
 static PyObject *
+thread__count(PyObject *self)
+{
+	return PyLong_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 @@
 	 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},
@@ -748,6 +764,8 @@
 	if (PyModule_AddObject(m, "_local", (PyObject *)&localtype) < 0)
 		return NULL;
 
+	nb_threads = 0;
+
 	/* Initialize the C thread library */
 	PyThread_init_thread();
 	return m;