summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorAndrew MacIntyre <andymac@bullseye.apana.org.au>2006-06-04 12:31:09 (GMT)
committerAndrew MacIntyre <andymac@bullseye.apana.org.au>2006-06-04 12:31:09 (GMT)
commit6539d2d3c758b507f10779e218d52d6c9f355025 (patch)
treed3677cd901f44e2341a50be45d8a3d2f6d1f4da6 /Modules
parent7a071939d96702e13c377a5e7f87df7bf20391e5 (diff)
downloadcpython-6539d2d3c758b507f10779e218d52d6c9f355025.zip
cpython-6539d2d3c758b507f10779e218d52d6c9f355025.tar.gz
cpython-6539d2d3c758b507f10779e218d52d6c9f355025.tar.bz2
Patch #1454481: Make thread stack size runtime tunable.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/threadmodule.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c
index 6169658..c9227c6 100644
--- a/Modules/threadmodule.c
+++ b/Modules/threadmodule.c
@@ -586,6 +586,51 @@ allocated consecutive numbers starting at 1, this behavior should not\n\
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_stack_size(PyObject *self, PyObject *args)
+{
+ size_t old_size, new_size;
+ PyObject *set_size = NULL;
+
+ if (!PyArg_UnpackTuple(args, "stack_size", 0, 1, &set_size))
+ return NULL;
+
+ old_size = PyThread_get_stacksize();
+
+ if (set_size != NULL) {
+ if (PyInt_Check(set_size))
+ new_size = (size_t) PyInt_AsLong(set_size);
+ else {
+ PyErr_SetString(PyExc_TypeError,
+ "size must be an integer");
+ return NULL;
+ }
+ if (PyThread_set_stacksize(new_size))
+ return NULL;
+ }
+
+ return PyInt_FromLong((long) old_size);
+}
+
+PyDoc_STRVAR(stack_size_doc,
+"stack_size([size]) -> size\n\
+\n\
+Return the thread stack size used when creating new threads. The\n\
+optional size argument specifies the stack size (in bytes) to be used\n\
+for subsequently created threads, and must be 0 (use platform or\n\
+configured default) or a positive integer value of at least 32,768 (32kB).\n\
+If changing the thread stack size is unsupported, or the specified size\n\
+is invalid, a RuntimeWarning is issued and the stack size is unmodified.\n\
+32kB is currently the minimum supported stack size value, to guarantee\n\
+sufficient stack space for the interpreter itself.\n\
+\n\
+Note that some platforms may have particular restrictions on values for\n\
+the stack size, such as requiring allocation in multiples of the system\n\
+memory page size - platform documentation should be referred to for more\n\
+information (4kB pages are common; using multiples of 4096 for the\n\
+stack size is the suggested approach in the absence of more specific\n\
+information).");
+
static PyMethodDef thread_methods[] = {
{"start_new_thread", (PyCFunction)thread_PyThread_start_new_thread,
METH_VARARGS,
@@ -605,6 +650,9 @@ static PyMethodDef thread_methods[] = {
METH_NOARGS, interrupt_doc},
{"get_ident", (PyCFunction)thread_get_ident,
METH_NOARGS, get_ident_doc},
+ {"stack_size", (PyCFunction)thread_stack_size,
+ METH_VARARGS,
+ stack_size_doc},
#ifndef NO_EXIT_PROG
{"exit_prog", (PyCFunction)thread_PyThread_exit_prog,
METH_VARARGS},