mirror of
https://github.com/python/cpython.git
synced 2025-12-04 00:30:19 +00:00
Massive changes for separate thread state management.
All per-thread globals are moved into a struct which is manipulated separately.
This commit is contained in:
parent
73237c54b4
commit
a027efa5bf
15 changed files with 865 additions and 262 deletions
134
Include/pystate.h
Normal file
134
Include/pystate.h
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
#ifndef Py_PYSTATE_H
|
||||
#define Py_PYSTATE_H
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/***********************************************************
|
||||
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
|
||||
The Netherlands.
|
||||
|
||||
All Rights Reserved
|
||||
|
||||
Permission to use, copy, modify, and distribute this software and its
|
||||
documentation for any purpose and without fee is hereby granted,
|
||||
provided that the above copyright notice appear in all copies and that
|
||||
both that copyright notice and this permission notice appear in
|
||||
supporting documentation, and that the names of Stichting Mathematisch
|
||||
Centrum or CWI or Corporation for National Research Initiatives or
|
||||
CNRI not be used in advertising or publicity pertaining to
|
||||
distribution of the software without specific, written prior
|
||||
permission.
|
||||
|
||||
While CWI is the initial source for this software, a modified version
|
||||
is made available by the Corporation for National Research Initiatives
|
||||
(CNRI) at the Internet address ftp://ftp.python.org.
|
||||
|
||||
STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
|
||||
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
|
||||
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
|
||||
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||
PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
******************************************************************/
|
||||
|
||||
/* Thread and interpreter state structures and their interfaces */
|
||||
|
||||
|
||||
/* State shared between threads */
|
||||
|
||||
#define NEXITFUNCS 32
|
||||
|
||||
typedef struct _is {
|
||||
|
||||
PyObject *import_modules;
|
||||
PyObject *sysdict;
|
||||
|
||||
int nthreads;
|
||||
|
||||
void (*exitfuncs[NEXITFUNCS])();
|
||||
int nexitfuncs;
|
||||
|
||||
} PyInterpreterState;
|
||||
|
||||
|
||||
/* State unique per thread */
|
||||
|
||||
struct _frame; /* Avoid including frameobject.h */
|
||||
|
||||
typedef struct _ts {
|
||||
|
||||
PyInterpreterState *interpreter_state;
|
||||
|
||||
struct _frame *frame;
|
||||
int recursion_depth;
|
||||
int ticker;
|
||||
int tracing;
|
||||
|
||||
PyObject *sys_profilefunc;
|
||||
PyObject *sys_tracefunc;
|
||||
int sys_checkinterval;
|
||||
|
||||
PyObject *curexc_type;
|
||||
PyObject *curexc_value;
|
||||
PyObject *curexc_traceback;
|
||||
|
||||
PyObject *exc_type;
|
||||
PyObject *exc_value;
|
||||
PyObject *exc_traceback;
|
||||
|
||||
/* XXX Other state that should be here:
|
||||
- signal handlers
|
||||
- low-level "pending calls"
|
||||
Problem with both is that they may be referenced from
|
||||
interrupt handlers where there is no clear concept of a
|
||||
"current thread"???
|
||||
*/
|
||||
|
||||
} PyThreadState;
|
||||
|
||||
|
||||
PyInterpreterState *PyInterpreterState_New(void);
|
||||
void PyInterpreterState_Delete(PyInterpreterState *);
|
||||
|
||||
PyThreadState *PyThreadState_New(PyInterpreterState *);
|
||||
void PyThreadState_Delete(PyThreadState *);
|
||||
|
||||
PyThreadState *PyThreadState_Get(void);
|
||||
PyThreadState *PyThreadState_Swap(PyThreadState *);
|
||||
|
||||
/* Some background.
|
||||
|
||||
There are lots of issues here.
|
||||
|
||||
First, we can build Python without threads, with threads, or (when
|
||||
Greg Stein's mods are out of beta, on some platforms) with free
|
||||
threading.
|
||||
|
||||
Next, assuming some form of threading is used, there can be several
|
||||
kinds of threads. Python code can create threads with the thread
|
||||
module. C code can create threads with the interface defined in
|
||||
python's "thread.h". Or C code can create threads directly with
|
||||
the OS threads interface (e.g. Solaris threads, SGI threads or
|
||||
pthreads, whatever is being used, as long as it's the same that
|
||||
Python is configured for).
|
||||
|
||||
Next, let's discuss sharing of interpreter state between threads.
|
||||
The exception state (sys.exc_* currently) should never be shared
|
||||
between threads, because it is stack frame specific. The contents
|
||||
of the sys module, in particular sys.modules and sys.path, are
|
||||
generally shared between threads. But occasionally it is useful to
|
||||
have separate module collections, e.g. when threads originate in C
|
||||
code and are used to execute unrelated Python scripts.
|
||||
(Traditionally, one would use separate processes for this, but
|
||||
there are lots of reasons why threads are attractive.)
|
||||
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* !Py_PYSTATE_H */
|
||||
Loading…
Add table
Add a link
Reference in a new issue