Mercurial > cpython-lru_cache-weakref
annotate Python/pystate.c @ 87690:66c1c9f32567 default tip
Add use_weakref option to functools.lru_cache
The use_weakref option makes lru_cache create weak references to the function
arguments when creating the cache key, which prevents them from staying in the
memory forever even after all other references to them are gone.
This is a proof of concept for http://bugs.python.org/issue19859
| author | Radomir Dopieralski <devel@sheep.art.pl> |
|---|---|
| date | Tue, 03 Dec 2013 16:02:48 +0100 |
| parents | 3ce0102e4c1f |
| children |
| rev | line source |
|---|---|
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
1 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 /* Thread and interpreter state structures and their interfaces */ |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 #include "Python.h" |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 |
|
33713
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
6 /* -------------------------------------------------------------------------- |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
7 CAUTION |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
8 |
|
84490
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
9 Always use PyMem_RawMalloc() and PyMem_RawFree() directly in this file. A |
|
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
10 number of these functions are advertised as safe to call when the GIL isn't |
|
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
11 held, and in a debug build Python redirects (e.g.) PyMem_NEW (etc) to Python's |
|
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
12 debugging obmalloc functions. Those aren't thread-safe (they rely on the GIL |
|
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
13 to avoid the expense of doing their own locking). |
|
33713
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
14 -------------------------------------------------------------------------- */ |
|
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
15 |
|
18689
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
16 #ifdef HAVE_DLOPEN |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
17 #ifdef HAVE_DLFCN_H |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
18 #include <dlfcn.h> |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
19 #endif |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
20 #ifndef RTLD_LAZY |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
21 #define RTLD_LAZY 1 |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
22 #endif |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
23 #endif |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
24 |
|
76285
5cc359804d61
take linkage def outside of WITH_THREAD conditional (closes #14569)
Benjamin Peterson <benjamin@python.org>
parents:
73694
diff
changeset
|
25 #ifdef __cplusplus |
|
5cc359804d61
take linkage def outside of WITH_THREAD conditional (closes #14569)
Benjamin Peterson <benjamin@python.org>
parents:
73694
diff
changeset
|
26 extern "C" { |
|
5cc359804d61
take linkage def outside of WITH_THREAD conditional (closes #14569)
Benjamin Peterson <benjamin@python.org>
parents:
73694
diff
changeset
|
27 #endif |
|
18689
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
28 |
| 11011 | 29 #ifdef WITH_THREAD |
| 30 #include "pythread.h" | |
| 31 static PyThread_type_lock head_mutex = NULL; /* Protects interp->tstate_head */ | |
|
13866
dfdb601cee1c
Removing warnings by gcc -Wall -- cast ugly || to void.
Moshe Zadka <moshez@math.huji.ac.il>
parents:
13658
diff
changeset
|
32 #define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock())) |
| 11011 | 33 #define HEAD_LOCK() PyThread_acquire_lock(head_mutex, WAIT_LOCK) |
| 34 #define HEAD_UNLOCK() PyThread_release_lock(head_mutex) | |
| 35117 | 35 |
| 36 /* The single PyInterpreterState used by this process' | |
| 37 GILState implementation | |
| 38 */ | |
| 39 static PyInterpreterState *autoInterpreterState = NULL; | |
| 40 static int autoTLSkey = 0; | |
| 11011 | 41 #else |
| 42 #define HEAD_INIT() /* Nothing */ | |
| 43 #define HEAD_LOCK() /* Nothing */ | |
| 44 #define HEAD_UNLOCK() /* Nothing */ | |
| 45 #endif | |
| 46 | |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
47 static PyInterpreterState *interp_head = NULL; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
48 |
|
61184
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
59316
diff
changeset
|
49 /* Assuming the current thread holds the GIL, this is the |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
59316
diff
changeset
|
50 PyThreadState for the current thread. */ |
|
4fd3ab5fa71d
Make (most of) Python's tests pass under Thread Sanitizer.
Jeffrey Yasskin <jyasskin@gmail.com>
parents:
59316
diff
changeset
|
51 _Py_atomic_address _PyThreadState_Current = {NULL}; |
|
27978
4b99a701defe
- PyEval_GetFrame() is now declared to return a PyFrameObject *
Guido van Rossum <guido@python.org>
parents:
26109
diff
changeset
|
52 PyThreadFrameGetter _PyThreadState_GetFrame = NULL; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
53 |
| 35661 | 54 #ifdef WITH_THREAD |
| 35117 | 55 static void _PyGILState_NoteThreadState(PyThreadState* tstate); |
| 35661 | 56 #endif |
| 35117 | 57 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
58 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
59 PyInterpreterState * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
60 PyInterpreterState_New(void) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
61 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
62 PyInterpreterState *interp = (PyInterpreterState *) |
|
84490
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
63 PyMem_RawMalloc(sizeof(PyInterpreterState)); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
64 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
65 if (interp != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
66 HEAD_INIT(); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
67 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
68 if (head_mutex == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
69 Py_FatalError("Can't initialize threads for interpreter"); |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
70 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
71 interp->modules = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
72 interp->modules_by_index = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
73 interp->sysdict = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
74 interp->builtins = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
75 interp->tstate_head = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
76 interp->codec_search_path = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
77 interp->codec_search_cache = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
78 interp->codec_error_registry = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
79 interp->codecs_initialized = 0; |
|
69708
2caf82aee7a4
Issue #10914: Initialize correctly the filesystem codec when creating a new
Victor Stinner <victor.stinner@haypocalc.com>
parents:
69637
diff
changeset
|
80 interp->fscodec_initialized = 0; |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76292
diff
changeset
|
81 interp->importlib = NULL; |
|
18689
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
82 #ifdef HAVE_DLOPEN |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
83 #ifdef RTLD_NOW |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
84 interp->dlopenflags = RTLD_NOW; |
|
18689
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
85 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
86 interp->dlopenflags = RTLD_LAZY; |
|
18689
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
87 #endif |
|
064de84385ca
Patch #412229: Add functions sys.getdlopenflags and sys.setdlopenflags.
Martin v. Löwis <martin@v.loewis.de>
parents:
18374
diff
changeset
|
88 #endif |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
31797
diff
changeset
|
89 #ifdef WITH_TSC |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
90 interp->tscdump = 0; |
|
32301
41c59d80bbc5
Patch #510695: Add TSC profiling for the VM.
Martin v. Löwis <martin@v.loewis.de>
parents:
31797
diff
changeset
|
91 #endif |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
92 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
93 HEAD_LOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
94 interp->next = interp_head; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
95 interp_head = interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
96 HEAD_UNLOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
97 } |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
98 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
99 return interp; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
100 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
101 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
102 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
103 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
104 PyInterpreterState_Clear(PyInterpreterState *interp) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
105 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
106 PyThreadState *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
107 HEAD_LOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
108 for (p = interp->tstate_head; p != NULL; p = p->next) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
109 PyThreadState_Clear(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
110 HEAD_UNLOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
111 Py_CLEAR(interp->codec_search_path); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
112 Py_CLEAR(interp->codec_search_cache); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
113 Py_CLEAR(interp->codec_error_registry); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
114 Py_CLEAR(interp->modules); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
115 Py_CLEAR(interp->modules_by_index); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
116 Py_CLEAR(interp->sysdict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
117 Py_CLEAR(interp->builtins); |
|
76303
2dd046be2c88
Issue #2377: Make importlib the implementation of __import__().
Brett Cannon <brett@python.org>
parents:
76292
diff
changeset
|
118 Py_CLEAR(interp->importlib); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
119 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
120 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
121 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
122 static void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
123 zapthreads(PyInterpreterState *interp) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
124 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
125 PyThreadState *p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
126 /* No need to lock the mutex here because this should only happen |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
127 when the threads are all really dead (XXX famous last words). */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
128 while ((p = interp->tstate_head) != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
129 PyThreadState_Delete(p); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
130 } |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
131 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
132 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
133 |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
134 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
135 PyInterpreterState_Delete(PyInterpreterState *interp) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
136 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
137 PyInterpreterState **p; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
138 zapthreads(interp); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
139 HEAD_LOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
140 for (p = &interp_head; ; p = &(*p)->next) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
141 if (*p == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
142 Py_FatalError( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
143 "PyInterpreterState_Delete: invalid interp"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
144 if (*p == interp) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
145 break; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
146 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
147 if (interp->tstate_head != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
148 Py_FatalError("PyInterpreterState_Delete: remaining threads"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
149 *p = interp->next; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
150 HEAD_UNLOCK(); |
|
84490
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
151 PyMem_RawFree(interp); |
|
73205
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
69708
diff
changeset
|
152 #ifdef WITH_THREAD |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
69708
diff
changeset
|
153 if (interp_head == NULL && head_mutex != NULL) { |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
69708
diff
changeset
|
154 PyThread_free_lock(head_mutex); |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
69708
diff
changeset
|
155 head_mutex = NULL; |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
69708
diff
changeset
|
156 } |
|
608975eafe86
Issue #10363: Deallocate global locks in Py_Finalize().
Antoine Pitrou <solipsis@pitrou.net>
parents:
69708
diff
changeset
|
157 #endif |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
158 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
159 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
160 |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
161 /* Default implementation for _PyThreadState_GetFrame */ |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
162 static struct _frame * |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
163 threadstate_getframe(PyThreadState *self) |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
164 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
165 return self->frame; |
|
26109
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
166 } |
|
e61b946474df
Assorted patches from Armin Rigo:
Michael W. Hudson <mwh@python.net>
parents:
25111
diff
changeset
|
167 |
|
59317
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
168 static PyThreadState * |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
169 new_threadstate(PyInterpreterState *interp, int init) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
170 { |
|
84490
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
171 PyThreadState *tstate = (PyThreadState *)PyMem_RawMalloc(sizeof(PyThreadState)); |
|
33713
517e4ec0df89
PyInterpreterState_New(), PyThreadState_New(): use malloc/free directly.
Tim Peters <tim.peters@gmail.com>
parents:
33711
diff
changeset
|
172 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
173 if (_PyThreadState_GetFrame == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
174 _PyThreadState_GetFrame = threadstate_getframe; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
175 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
176 if (tstate != NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
177 tstate->interp = interp; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
178 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
179 tstate->frame = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
180 tstate->recursion_depth = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
181 tstate->overflowed = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
182 tstate->recursion_critical = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
183 tstate->tracing = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
184 tstate->use_tracing = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
185 tstate->gilstate_counter = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
186 tstate->async_exc = NULL; |
|
29842
014cc362aa91
Initialize thread_id to 0 in unthreaded build. Fixes #770247.
Martin v. Löwis <martin@v.loewis.de>
parents:
29643
diff
changeset
|
187 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
188 tstate->thread_id = PyThread_get_thread_ident(); |
|
29842
014cc362aa91
Initialize thread_id to 0 in unthreaded build. Fixes #770247.
Martin v. Löwis <martin@v.loewis.de>
parents:
29643
diff
changeset
|
189 #else |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
190 tstate->thread_id = 0; |
|
29842
014cc362aa91
Initialize thread_id to 0 in unthreaded build. Fixes #770247.
Martin v. Löwis <martin@v.loewis.de>
parents:
29643
diff
changeset
|
191 #endif |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
192 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
193 tstate->dict = NULL; |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
194 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
195 tstate->curexc_type = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
196 tstate->curexc_value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
197 tstate->curexc_traceback = NULL; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
198 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
199 tstate->exc_type = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
200 tstate->exc_value = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
201 tstate->exc_traceback = NULL; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
202 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
203 tstate->c_profilefunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
204 tstate->c_tracefunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
205 tstate->c_profileobj = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
206 tstate->c_traceobj = NULL; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
207 |
|
78912
5aa1bc2f00ad
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
78678
diff
changeset
|
208 tstate->trash_delete_nesting = 0; |
|
5aa1bc2f00ad
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
78678
diff
changeset
|
209 tstate->trash_delete_later = NULL; |
|
85598
d52b68edbca6
Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85112
diff
changeset
|
210 tstate->on_delete = NULL; |
|
d52b68edbca6
Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85112
diff
changeset
|
211 tstate->on_delete_data = NULL; |
|
78912
5aa1bc2f00ad
Issue #13992: The trashcan mechanism is now thread-safe. This eliminates
Antoine Pitrou <solipsis@pitrou.net>
parents:
78678
diff
changeset
|
212 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
213 if (init) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
214 _PyThreadState_Init(tstate); |
| 35117 | 215 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
216 HEAD_LOCK(); |
|
83690
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
217 tstate->prev = NULL; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
218 tstate->next = interp->tstate_head; |
|
83690
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
219 if (tstate->next) |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
220 tstate->next->prev = tstate; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
221 interp->tstate_head = tstate; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
222 HEAD_UNLOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
223 } |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
224 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
225 return tstate; |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
226 } |
|
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
227 |
|
59317
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
228 PyThreadState * |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
229 PyThreadState_New(PyInterpreterState *interp) |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
230 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
231 return new_threadstate(interp, 1); |
|
59317
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
232 } |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
233 |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
234 PyThreadState * |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
235 _PyThreadState_Prealloc(PyInterpreterState *interp) |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
236 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
237 return new_threadstate(interp, 0); |
|
59317
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
238 } |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
239 |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
240 void |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
241 _PyThreadState_Init(PyThreadState *tstate) |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
242 { |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
243 #ifdef WITH_THREAD |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
244 _PyGILState_NoteThreadState(tstate); |
|
59317
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
245 #endif |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
246 } |
|
d7a62c16505b
Merged revisions 78639 via svnmerge from
Victor Stinner <victor.stinner@haypocalc.com>
parents:
49736
diff
changeset
|
247 |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
248 PyObject* |
|
77564
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
249 PyState_FindModule(struct PyModuleDef* module) |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
250 { |
|
77564
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
251 Py_ssize_t index = module->m_base.m_index; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
252 PyInterpreterState *state = PyThreadState_GET()->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
253 PyObject *res; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
254 if (index == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
255 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
256 if (state->modules_by_index == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
257 return NULL; |
|
78677
b96a4b1e7ecb
Issue #15726: Fix incorrect bounds checking in PyState_FindModule.
Antoine Pitrou <solipsis@pitrou.net>
parents:
76291
diff
changeset
|
258 if (index >= PyList_GET_SIZE(state->modules_by_index)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
259 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
260 res = PyList_GET_ITEM(state->modules_by_index, index); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
261 return res==Py_None ? NULL : res; |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
262 } |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
263 |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
264 int |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
265 _PyState_AddModule(PyObject* module, struct PyModuleDef* def) |
|
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
266 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
267 PyInterpreterState *state = PyThreadState_GET()->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
268 if (!def) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
269 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
270 if (!state->modules_by_index) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
271 state->modules_by_index = PyList_New(0); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
272 if (!state->modules_by_index) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
273 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
274 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
275 while(PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
276 if (PyList_Append(state->modules_by_index, Py_None) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
277 return -1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
278 Py_INCREF(module); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
279 return PyList_SetItem(state->modules_by_index, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
280 def->m_base.m_index, module); |
|
47580
94f64f11fdd0
Implement PEP 3121: new module initialization and finalization API.
Martin v. Löwis <martin@v.loewis.de>
parents:
44834
diff
changeset
|
281 } |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
282 |
|
77564
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
283 int |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
284 PyState_AddModule(PyObject* module, struct PyModuleDef* def) |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
285 { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
286 Py_ssize_t index; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
287 PyInterpreterState *state = PyThreadState_GET()->interp; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
288 if (!def) { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
289 Py_FatalError("PyState_AddModule: Module Definition is NULL"); |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
290 return -1; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
291 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
292 index = def->m_base.m_index; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
293 if (state->modules_by_index) { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
294 if(PyList_GET_SIZE(state->modules_by_index) >= index) { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
295 if(module == PyList_GET_ITEM(state->modules_by_index, index)) { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
296 Py_FatalError("PyState_AddModule: Module already added!"); |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
297 return -1; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
298 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
299 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
300 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
301 return _PyState_AddModule(module, def); |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
302 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
303 |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
304 int |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
305 PyState_RemoveModule(struct PyModuleDef* def) |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
306 { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
307 Py_ssize_t index = def->m_base.m_index; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
308 PyInterpreterState *state = PyThreadState_GET()->interp; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
309 if (index == 0) { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
310 Py_FatalError("PyState_RemoveModule: Module index invalid."); |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
311 return -1; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
312 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
313 if (state->modules_by_index == NULL) { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
314 Py_FatalError("PyState_RemoveModule: Interpreters module-list not acessible."); |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
315 return -1; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
316 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
317 if (index > PyList_GET_SIZE(state->modules_by_index)) { |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
318 Py_FatalError("PyState_RemoveModule: Module index out of bounds."); |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
319 return -1; |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
320 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
321 return PyList_SetItem(state->modules_by_index, index, Py_None); |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
322 } |
|
55e8cba34b11
Issue #15042: Add PyState_AddModule and PyState_RemoveModule.
Martin v. Löwis <martin@v.loewis.de>
parents:
76640
diff
changeset
|
323 |
|
85112
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
324 /* used by import.c:PyImport_Cleanup */ |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
325 void |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
326 _PyState_ClearModules(void) |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
327 { |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
328 PyInterpreterState *state = PyThreadState_GET()->interp; |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
329 if (state->modules_by_index) { |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
330 Py_ssize_t i; |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
331 for (i = 0; i < PyList_GET_SIZE(state->modules_by_index); i++) { |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
332 PyObject *m = PyList_GET_ITEM(state->modules_by_index, i); |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
333 if (PyModule_Check(m)) { |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
334 /* cleanup the saved copy of module dicts */ |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
335 PyModuleDef *md = PyModule_GetDef(m); |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
336 if (md) |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
337 Py_CLEAR(md->m_base.m_copy); |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
338 } |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
339 } |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
340 /* Setting modules_by_index to NULL could be dangerous, so we |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
341 clear the list instead. */ |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
342 if (PyList_SetSlice(state->modules_by_index, |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
343 0, PyList_GET_SIZE(state->modules_by_index), |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
344 NULL)) |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
345 PyErr_WriteUnraisable(state->modules_by_index); |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
346 } |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
347 } |
|
1edff836c954
Issue #10241: Clear extension module dict copies at interpreter shutdown.
Antoine Pitrou <solipsis@pitrou.net>
parents:
84979
diff
changeset
|
348 |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
349 void |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
350 PyThreadState_Clear(PyThreadState *tstate) |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
351 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
352 if (Py_VerboseFlag && tstate->frame != NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
353 fprintf(stderr, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
354 "PyThreadState_Clear: warning: thread still has a frame\n"); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
355 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
356 Py_CLEAR(tstate->frame); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
357 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
358 Py_CLEAR(tstate->dict); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
359 Py_CLEAR(tstate->async_exc); |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
360 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
361 Py_CLEAR(tstate->curexc_type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
362 Py_CLEAR(tstate->curexc_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
363 Py_CLEAR(tstate->curexc_traceback); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
364 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
365 Py_CLEAR(tstate->exc_type); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
366 Py_CLEAR(tstate->exc_value); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
367 Py_CLEAR(tstate->exc_traceback); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
368 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
369 tstate->c_profilefunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
370 tstate->c_tracefunc = NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
371 Py_CLEAR(tstate->c_profileobj); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
372 Py_CLEAR(tstate->c_traceobj); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
373 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
374 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 |
|
16139
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
376 /* Common code for PyThreadState_Delete() and PyThreadState_DeleteCurrent() */ |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
377 static void |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
378 tstate_delete_common(PyThreadState *tstate) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
379 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
380 PyInterpreterState *interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
381 if (tstate == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
382 Py_FatalError("PyThreadState_Delete: NULL tstate"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
383 interp = tstate->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
384 if (interp == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
385 Py_FatalError("PyThreadState_Delete: NULL interp"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
386 HEAD_LOCK(); |
|
83690
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
387 if (tstate->prev) |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
388 tstate->prev->next = tstate->next; |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
389 else |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
390 interp->tstate_head = tstate->next; |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
391 if (tstate->next) |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
392 tstate->next->prev = tstate->prev; |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
393 HEAD_UNLOCK(); |
|
85598
d52b68edbca6
Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85112
diff
changeset
|
394 if (tstate->on_delete != NULL) { |
|
d52b68edbca6
Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85112
diff
changeset
|
395 tstate->on_delete(tstate->on_delete_data); |
|
d52b68edbca6
Issue #18808: Thread.join() now waits for the underlying thread state to be destroyed before returning.
Antoine Pitrou <solipsis@pitrou.net>
parents:
85112
diff
changeset
|
396 } |
|
84490
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
397 PyMem_RawFree(tstate); |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 |
|
16139
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
401 void |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
402 PyThreadState_Delete(PyThreadState *tstate) |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
403 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
404 if (tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current)) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
405 Py_FatalError("PyThreadState_Delete: tstate is still current"); |
|
36683
da2a1049215d
Patch 1413181, by Gabriel Becedillas.
Tim Peters <tim.peters@gmail.com>
parents:
35661
diff
changeset
|
406 #ifdef WITH_THREAD |
|
64563
dc5986d0e5a4
Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
407 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
408 PyThread_delete_key_value(autoTLSkey); |
|
36683
da2a1049215d
Patch 1413181, by Gabriel Becedillas.
Tim Peters <tim.peters@gmail.com>
parents:
35661
diff
changeset
|
409 #endif /* WITH_THREAD */ |
|
84418
ff30bf84b378
Issue #18328: Reorder ops in PyThreadState_Delete*() functions. Now the
Christian Heimes <christian@cheimes.de>
parents:
78921
diff
changeset
|
410 tstate_delete_common(tstate); |
|
16139
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
411 } |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
412 |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
413 |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
414 #ifdef WITH_THREAD |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
415 void |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
416 PyThreadState_DeleteCurrent() |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
417 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
418 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
419 &_PyThreadState_Current); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
420 if (tstate == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
421 Py_FatalError( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
422 "PyThreadState_DeleteCurrent: no current tstate"); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
423 _Py_atomic_store_relaxed(&_PyThreadState_Current, NULL); |
|
64563
dc5986d0e5a4
Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
424 if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
425 PyThread_delete_key_value(autoTLSkey); |
|
84418
ff30bf84b378
Issue #18328: Reorder ops in PyThreadState_Delete*() functions. Now the
Christian Heimes <christian@cheimes.de>
parents:
78921
diff
changeset
|
426 tstate_delete_common(tstate); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
427 PyEval_ReleaseLock(); |
|
16139
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
428 } |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
429 #endif /* WITH_THREAD */ |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
430 |
|
d96ce9708c00
Add a new API, PyThreadState_DeleteCurrent() that combines
Guido van Rossum <guido@python.org>
parents:
14378
diff
changeset
|
431 |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
432 /* |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
433 * Delete all thread states except the one passed as argument. |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
434 * Note that, if there is a current thread state, it *must* be the one |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
435 * passed as argument. Also, this won't touch any other interpreters |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
436 * than the current one, since we don't know which thread state should |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
437 * be kept in those other interpreteres. |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
438 */ |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
439 void |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
440 _PyThreadState_DeleteExcept(PyThreadState *tstate) |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
441 { |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
442 PyInterpreterState *interp = tstate->interp; |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
443 PyThreadState *p, *next, *garbage; |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
444 HEAD_LOCK(); |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
445 /* Remove all thread states, except tstate, from the linked list of |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
446 thread states. This will allow calling PyThreadState_Clear() |
|
83690
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
447 without holding the lock. */ |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
448 garbage = interp->tstate_head; |
|
83690
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
449 if (garbage == tstate) |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
450 garbage = tstate->next; |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
451 if (tstate->prev) |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
452 tstate->prev->next = tstate->next; |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
453 if (tstate->next) |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
454 tstate->next->prev = tstate->prev; |
|
375d4fed4cf2
Issue #17912: Use a doubly linked-list for thread states.
Charles-Francois Natali <cf.natali@gmail.com>
parents:
83630
diff
changeset
|
455 tstate->prev = tstate->next = NULL; |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
456 interp->tstate_head = tstate; |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
457 HEAD_UNLOCK(); |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
458 /* Clear and deallocate all stale thread states. Even if this |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
459 executes Python code, we should be safe since it executes |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
460 in the current thread, not one of the stale threads. */ |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
461 for (p = garbage; p; p = next) { |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
462 next = p->next; |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
463 PyThreadState_Clear(p); |
|
84490
18bb92b0c458
Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents:
84419
diff
changeset
|
464 PyMem_RawFree(p); |
|
83630
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
465 } |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
466 } |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
467 |
|
847692b9902a
Issue #17094: Clear stale thread states after fork().
Antoine Pitrou <solipsis@pitrou.net>
parents:
82889
diff
changeset
|
468 |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
469 PyThreadState * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
470 PyThreadState_Get(void) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
471 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
472 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
473 &_PyThreadState_Current); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
474 if (tstate == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
475 Py_FatalError("PyThreadState_Get: no current thread"); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
476 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
477 return tstate; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 } |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 |
|
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 PyThreadState * |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
482 PyThreadState_Swap(PyThreadState *newts) |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
484 PyThreadState *oldts = (PyThreadState*)_Py_atomic_load_relaxed( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
485 &_PyThreadState_Current); |
|
5926
8d2194e22e67
The last of the mass checkins for separate (sub)interpreters.
Guido van Rossum <guido@python.org>
parents:
5849
diff
changeset
|
486 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
487 _Py_atomic_store_relaxed(&_PyThreadState_Current, newts); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
488 /* It should not be possible for more than one thread state |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
489 to be used for a thread. Check this the best we can in debug |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
490 builds. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
491 */ |
|
28914
33475661823d
Patch #729300: Disable error message if Python is not built for threads.
Martin v. Löwis <martin@v.loewis.de>
parents:
28694
diff
changeset
|
492 #if defined(Py_DEBUG) && defined(WITH_THREAD) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
493 if (newts) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
494 /* This can be called from PyEval_RestoreThread(). Similar |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
495 to it, we need to ensure errno doesn't change. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
496 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
497 int err = errno; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
498 PyThreadState *check = PyGILState_GetThisThreadState(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
499 if (check && check->interp == newts->interp && check != newts) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
500 Py_FatalError("Invalid thread state for this thread"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
501 errno = err; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
502 } |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
503 #endif |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
504 return oldts; |
|
5405
b7871ca930ad
Massive changes for separate thread state management.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
505 } |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
506 |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
507 /* An extension mechanism to store arbitrary additional per-thread state. |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
508 PyThreadState_GetDict() returns a dictionary that can be used to hold such |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
509 state; the caller should pick a unique key and store its state there. If |
|
28616
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
510 PyThreadState_GetDict() returns NULL, an exception has *not* been raised |
|
4f0b7acffc7d
- pythunrun.c, Py_Finalize(): move the call to _Py_PrintReferences()
Guido van Rossum <guido@python.org>
parents:
28325
diff
changeset
|
511 and the caller should assume no per-thread state is available. */ |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
512 |
|
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
513 PyObject * |
|
13658
f79434ee41fa
Mass ANSIfication of function definitions. Doesn't cover all 'extern'
Thomas Wouters <thomas@python.org>
parents:
13256
diff
changeset
|
514 PyThreadState_GetDict(void) |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
515 { |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
516 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed( |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
517 &_PyThreadState_Current); |
|
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
518 if (tstate == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
519 return NULL; |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
520 |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
521 if (tstate->dict == NULL) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
522 PyObject *d; |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
523 tstate->dict = d = PyDict_New(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
524 if (d == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
525 PyErr_Clear(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
526 } |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
527 return tstate->dict; |
|
7970
4ceee1ef99b0
/* An extension mechanism to store arbitrary additional per-thread state.
Guido van Rossum <guido@python.org>
parents:
6549
diff
changeset
|
528 } |
|
18733
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
529 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
530 |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
531 /* Asynchronously raise an exception in a thread. |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
532 Requested by Just van Rossum and Alex Martelli. |
| 34568 | 533 To prevent naive misuse, you must write your own extension |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
534 to call this, or use ctypes. Must be called with the GIL held. |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
535 Returns the number of tstates modified (normally 1, but 0 if `id` didn't |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
536 match any known thread id). Can be called with exc=NULL to clear an |
|
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
537 existing async exception. This raises no exceptions. */ |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
538 |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
539 int |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
540 PyThreadState_SetAsyncExc(long id, PyObject *exc) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
541 PyThreadState *tstate = PyThreadState_GET(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
542 PyInterpreterState *interp = tstate->interp; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
543 PyThreadState *p; |
|
39610
3674f20ac781
Merge current trunk into p3yk. This includes the PyNumber_Index API change,
Thomas Wouters <thomas@python.org>
parents:
39442
diff
changeset
|
544 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
545 /* Although the GIL is held, a few C API functions can be called |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
546 * without the GIL held, and in particular some that create and |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
547 * destroy thread and interpreter states. Those can mutate the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
548 * list of thread states we're traversing, so to prevent that we lock |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
549 * head_mutex for the duration. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
550 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
551 HEAD_LOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
552 for (p = interp->tstate_head; p != NULL; p = p->next) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
553 if (p->thread_id == id) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
554 /* Tricky: we need to decref the current value |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
555 * (if any) in p->async_exc, but that can in turn |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
556 * allow arbitrary Python code to run, including |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
557 * perhaps calls to this function. To prevent |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
558 * deadlock, we need to release head_mutex before |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
559 * the decref. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
560 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
561 PyObject *old_exc = p->async_exc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
562 Py_XINCREF(exc); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
563 p->async_exc = exc; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
564 HEAD_UNLOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
565 Py_XDECREF(old_exc); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
566 _PyEval_SignalAsyncExc(); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
567 return 1; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
568 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
569 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
570 HEAD_UNLOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
571 return 0; |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
572 } |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
573 |
|
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
574 |
|
18733
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
575 /* Routines for advanced debuggers, requested by David Beazley. |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
576 Don't use unless you know what you are doing! */ |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
577 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
578 PyInterpreterState * |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
579 PyInterpreterState_Head(void) |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
580 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
581 return interp_head; |
|
18733
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
582 } |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
583 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
584 PyInterpreterState * |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
585 PyInterpreterState_Next(PyInterpreterState *interp) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
586 return interp->next; |
|
18733
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
587 } |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
588 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
589 PyThreadState * |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
590 PyInterpreterState_ThreadHead(PyInterpreterState *interp) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
591 return interp->tstate_head; |
|
18733
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
592 } |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
593 |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
594 PyThreadState * |
|
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
595 PyThreadState_Next(PyThreadState *tstate) { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
596 return tstate->next; |
|
18733
b0329649b8cf
Add a low-level API to access interpreters, for David Beazley.
Guido van Rossum <guido@python.org>
parents:
18689
diff
changeset
|
597 } |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
598 |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
599 /* The implementation of sys._current_frames(). This is intended to be |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
600 called with the GIL held, as it will be when called via |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
601 sys._current_frames(). It's possible it would work fine even without |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
602 the GIL held, but haven't thought enough about that. |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
603 */ |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
604 PyObject * |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
605 _PyThread_CurrentFrames(void) |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
606 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
607 PyObject *result; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
608 PyInterpreterState *i; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
609 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
610 result = PyDict_New(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
611 if (result == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
612 return NULL; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
613 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
614 /* for i in all interpreters: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
615 * for t in all of i's thread states: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
616 * if t's frame isn't NULL, map t's id to its frame |
|
68585
bf94b6a73fc8
#11565: Fix several typos. Patch by Piotr Kasprzyk.
Ezio Melotti <ezio.melotti@gmail.com>
parents:
64563
diff
changeset
|
617 * Because these lists can mutate even when the GIL is held, we |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
618 * need to grab head_mutex for the duration. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
619 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
620 HEAD_LOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
621 for (i = interp_head; i != NULL; i = i->next) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
622 PyThreadState *t; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
623 for (t = i->tstate_head; t != NULL; t = t->next) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
624 PyObject *id; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
625 int stat; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
626 struct _frame *frame = t->frame; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
627 if (frame == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
628 continue; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
629 id = PyLong_FromLong(t->thread_id); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
630 if (id == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
631 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
632 stat = PyDict_SetItem(result, id, (PyObject *)frame); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
633 Py_DECREF(id); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
634 if (stat < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
635 goto Fail; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
636 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
637 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
638 HEAD_UNLOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
639 return result; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
640 |
|
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
641 Fail: |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
642 HEAD_UNLOCK(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
643 Py_DECREF(result); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
644 return NULL; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
645 } |
|
29643
fa97293533a9
Add PyThreadState_SetAsyncExc(long, PyObject *).
Guido van Rossum <guido@python.org>
parents:
28914
diff
changeset
|
646 |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
647 /* Python "auto thread state" API. */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
648 #ifdef WITH_THREAD |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
649 |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
650 /* Keep this as a static, as it is not reliable! It can only |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
651 ever be compared to the state for the *current* thread. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
652 * If not equal, then it doesn't matter that the actual |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
653 value may change immediately after comparison, as it can't |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
654 possibly change to the current thread's state. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
655 * If equal, then the current thread holds the lock, so the value can't |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
656 change until we yield the lock. |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
657 */ |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
658 static int |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
659 PyThreadState_IsCurrent(PyThreadState *tstate) |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
660 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
661 /* Must be the tstate for this thread */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
662 assert(PyGILState_GetThisThreadState()==tstate); |
|
61466
cab14be0ada1
Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61184
diff
changeset
|
663 return tstate == _Py_atomic_load_relaxed(&_PyThreadState_Current); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
664 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
665 |
|
33698
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
666 /* Internal initialization/finalization functions called by |
|
090ffcb83f0a
Trim trailing whitespace.
Tim Peters <tim.peters@gmail.com>
parents:
32301
diff
changeset
|
667 Py_Initialize/Py_Finalize |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
668 */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
669 void |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
670 _PyGILState_Init(PyInterpreterState *i, PyThreadState *t) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
671 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
672 assert(i && t); /* must init with valid states */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
673 autoTLSkey = PyThread_create_key(); |
|
64844
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
64558
diff
changeset
|
674 if (autoTLSkey == -1) |
|
8e428b8e7d81
issue 9786 Native TLS support for pthreads
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents:
64558
diff
changeset
|
675 Py_FatalError("Could not allocate TLS entry"); |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
676 autoInterpreterState = i; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
677 assert(PyThread_get_key_value(autoTLSkey) == NULL); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
678 assert(t->gilstate_counter == 0); |
| 35117 | 679 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
680 _PyGILState_NoteThreadState(t); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
681 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
682 |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
683 void |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
684 _PyGILState_Fini(void) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
685 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
686 PyThread_delete_key(autoTLSkey); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
687 autoInterpreterState = NULL; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
688 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
689 |
|
73694
ba90839c4993
Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents:
73205
diff
changeset
|
690 /* Reset the TLS key - called by PyOS_AfterFork(). |
|
69637
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
691 * This should not be necessary, but some - buggy - pthread implementations |
|
73694
ba90839c4993
Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents:
73205
diff
changeset
|
692 * don't reset TLS upon fork(), see issue #10517. |
|
69637
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
693 */ |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
694 void |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
695 _PyGILState_Reinit(void) |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
696 { |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
697 PyThreadState *tstate = PyGILState_GetThisThreadState(); |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
698 PyThread_delete_key(autoTLSkey); |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
699 if ((autoTLSkey = PyThread_create_key()) == -1) |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
700 Py_FatalError("Could not allocate TLS entry"); |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
701 |
|
73694
ba90839c4993
Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents:
73205
diff
changeset
|
702 /* If the thread had an associated auto thread state, reassociate it with |
|
ba90839c4993
Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents:
73205
diff
changeset
|
703 * the new key. */ |
|
ba90839c4993
Issue #13156: _PyGILState_Reinit(): Re-associate the auto thread state with the
Charles-François Natali <neologix@free.fr>
parents:
73205
diff
changeset
|
704 if (tstate && PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0) |
|
69637
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
705 Py_FatalError("Couldn't create autoTLSkey mapping"); |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
706 } |
|
7b7ad9a88451
Issue #10517: After fork(), reinitialize the TLS used by the PyGILState_*
Antoine Pitrou <solipsis@pitrou.net>
parents:
68586
diff
changeset
|
707 |
| 35117 | 708 /* When a thread state is created for a thread by some mechanism other than |
| 709 PyGILState_Ensure, it's important that the GILState machinery knows about | |
| 710 it so it doesn't try to create another thread state for the thread (this is | |
| 711 a better fix for SF bug #1010677 than the first one attempted). | |
| 712 */ | |
|
40450
cc992d75d5b3
Four months of trunk changes (including a few releases...)
Thomas Wouters <thomas@python.org>
parents:
39610
diff
changeset
|
713 static void |
| 35117 | 714 _PyGILState_NoteThreadState(PyThreadState* tstate) |
| 715 { | |
|
64563
dc5986d0e5a4
Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
716 /* If autoTLSkey isn't initialized, this must be the very first |
|
dc5986d0e5a4
Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
717 threadstate created in Py_Initialize(). Don't do anything for now |
|
dc5986d0e5a4
Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
718 (we'll be back here when _PyGILState_Init is called). */ |
|
dc5986d0e5a4
Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
719 if (!autoInterpreterState) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
720 return; |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
721 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
722 /* Stick the thread state for this thread in thread local storage. |
| 35117 | 723 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
724 The only situation where you can legitimately have more than one |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
725 thread state for an OS level thread is when there are multiple |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
726 interpreters, when: |
|
39442
654c380cf8b9
Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents:
37879
diff
changeset
|
727 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
728 a) You shouldn't really be using the PyGILState_ APIs anyway, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
729 and: |
| 35117 | 730 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
731 b) The slightly odd way PyThread_set_key_value works (see |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
732 comments by its implementation) means that the first thread |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
733 state created for that given OS level thread will "win", |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
734 which seems reasonable behaviour. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
735 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
736 if (PyThread_set_key_value(autoTLSkey, (void *)tstate) < 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
737 Py_FatalError("Couldn't create autoTLSkey mapping"); |
| 35117 | 738 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
739 /* PyGILState_Release must not try to delete this thread state. */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
740 tstate->gilstate_counter = 1; |
| 35117 | 741 } |
| 742 | |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
743 /* The public functions */ |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
744 PyThreadState * |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
745 PyGILState_GetThisThreadState(void) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
746 { |
|
64563
dc5986d0e5a4
Merged revisions 84623 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
61467
diff
changeset
|
747 if (autoInterpreterState == NULL) |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
748 return NULL; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
749 return (PyThreadState *)PyThread_get_key_value(autoTLSkey); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
750 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
751 |
|
82889
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
752 int |
|
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
753 PyGILState_Check(void) |
|
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
754 { |
|
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
755 /* can't use PyThreadState_Get() since it will assert that it has the GIL */ |
|
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
756 PyThreadState *tstate = (PyThreadState*)_Py_atomic_load_relaxed( |
|
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
757 &_PyThreadState_Current); |
|
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
758 return tstate && (tstate == PyGILState_GetThisThreadState()); |
|
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
759 } |
|
2e92d1567ad7
Issue #17522: Add the PyGILState_Check() API.
Kristján Valur Jónsson <sweskman@gmail.com>
parents:
78921
diff
changeset
|
760 |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
761 PyGILState_STATE |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
762 PyGILState_Ensure(void) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
763 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
764 int current; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
765 PyThreadState *tcur; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
766 /* Note that we do not auto-init Python here - apart from |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
767 potential races with 2 threads auto-initializing, pep-311 |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
768 spells out other issues. Embedders are expected to have |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
769 called Py_Initialize() and usually PyEval_InitThreads(). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
770 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
771 assert(autoInterpreterState); /* Py_Initialize() hasn't been called! */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
772 tcur = (PyThreadState *)PyThread_get_key_value(autoTLSkey); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
773 if (tcur == NULL) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
774 /* Create a new thread state for this thread */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
775 tcur = PyThreadState_New(autoInterpreterState); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
776 if (tcur == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
777 Py_FatalError("Couldn't create thread-state for new thread"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
778 /* This is our thread state! We'll need to delete it in the |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
779 matching call to PyGILState_Release(). */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
780 tcur->gilstate_counter = 0; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
781 current = 0; /* new thread state is never current */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
782 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
783 else |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
784 current = PyThreadState_IsCurrent(tcur); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
785 if (current == 0) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
786 PyEval_RestoreThread(tcur); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
787 /* Update our counter in the thread-state - no need for locks: |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
788 - tcur will remain valid as we hold the GIL. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
789 - the counter is safe as we are the only thread "allowed" |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
790 to modify this value |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
791 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
792 ++tcur->gilstate_counter; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
793 return current ? PyGILState_LOCKED : PyGILState_UNLOCKED; |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
794 } |
|
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
795 |
|
33699
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
796 void |
|
0c26db381673
Style guide & consistency changes. No semantic changes.
Tim Peters <tim.peters@gmail.com>
parents:
33698
diff
changeset
|
797 PyGILState_Release(PyGILState_STATE oldstate) |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
798 { |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
799 PyThreadState *tcur = (PyThreadState *)PyThread_get_key_value( |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
800 autoTLSkey); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
801 if (tcur == NULL) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
802 Py_FatalError("auto-releasing thread-state, " |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
803 "but no thread-state for this thread"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
804 /* We must hold the GIL and have our thread state current */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
805 /* XXX - remove the check - the assert should be fine, |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
806 but while this is very new (April 2003), the extra check |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
807 by release-only users can't hurt. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
808 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
809 if (! PyThreadState_IsCurrent(tcur)) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
810 Py_FatalError("This thread state must be current when releasing"); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
811 assert(PyThreadState_IsCurrent(tcur)); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
812 --tcur->gilstate_counter; |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
813 assert(tcur->gilstate_counter >= 0); /* illegal counter value */ |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
814 |
|
61467
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
815 /* If we're going to destroy this thread-state, we must |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
816 * clear it while the GIL is held, as destructors may run. |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
817 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
818 if (tcur->gilstate_counter == 0) { |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
819 /* can't have been locked when we created it */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
820 assert(oldstate == PyGILState_UNLOCKED); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
821 PyThreadState_Clear(tcur); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
822 /* Delete the thread-state. Note this releases the GIL too! |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
823 * It's vital that the GIL be held here, to avoid shutdown |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
824 * races; see bugs 225673 and 1061968 (that nasty bug has a |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
825 * habit of coming back). |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
826 */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
827 PyThreadState_DeleteCurrent(); |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
828 } |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
829 /* Release the lock if necessary */ |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
830 else if (oldstate == PyGILState_UNLOCKED) |
|
f197407bdba2
Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents:
59317
diff
changeset
|
831 PyEval_SaveThread(); |
|
28694
a4154dd5939a
New PyGILState_ API - implements pep 311, from patch 684256.
Mark Hammond <mhammond@skippinet.com.au>
parents:
28616
diff
changeset
|
832 } |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
833 |
|
76291
49f52d14b65c
move outside WITH_THREAD conditional
Benjamin Peterson <benjamin@python.org>
parents:
76285
diff
changeset
|
834 #endif /* WITH_THREAD */ |
|
49f52d14b65c
move outside WITH_THREAD conditional
Benjamin Peterson <benjamin@python.org>
parents:
76285
diff
changeset
|
835 |
|
37879
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
836 #ifdef __cplusplus |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
837 } |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
838 #endif |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
839 |
|
f731859e9b3b
Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents:
36683
diff
changeset
|
840 |
