diff options
author | Andrew MacIntyre <andymac@bullseye.apana.org.au> | 2006-06-04 12:31:09 (GMT) |
---|---|---|
committer | Andrew MacIntyre <andymac@bullseye.apana.org.au> | 2006-06-04 12:31:09 (GMT) |
commit | 6539d2d3c758b507f10779e218d52d6c9f355025 (patch) | |
tree | d3677cd901f44e2341a50be45d8a3d2f6d1f4da6 /Modules | |
parent | 7a071939d96702e13c377a5e7f87df7bf20391e5 (diff) | |
download | cpython-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.c | 48 |
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}, |