Mercurial > cpython-lru_cache-weakref
view Python/thread.c @ 14378:ca7316a00464 legacy-trunk
PyInterpreterState_New is not thread-safe, and the recent fix to _PyPclose
can cause it to get called by multiple threads simultaneously.
Ditto for PyInterpreterState_Delete.
Of the former, the docs say "The interpreter lock need not be held, but may
be held if it is necessary to serialize calls to this function". This
kinda implies it both is and isn't thread-safe.
Of the latter, the docs merely say "The interpreter lock need not be
held.", and the clause about serializing is absent.
I expect it was *believed* these are both thread-safe, and the bit about
serializing via the global lock was meant as a permission rather than a
caution.
I also expect we've never seen a problem here because the Python core
(prior to the _PyPclose fix) only calls these functions once per run.
The Py_NewInterpreter subsystem exposed by the C API (but not used by
Python itself) also calls them, but that subsystem appears to be very
rarely used.
Whatever, they're both thread-safe now.
| author | Tim Peters <tim.peters@gmail.com> |
|---|---|
| date | Sat, 02 Sep 2000 09:16:15 +0000 |
| parents | 6f6f965c5e2d |
| children | 756c8c6535fe |
line wrap: on
line source
/* Thread package. This is intended to be usable independently from Python. The implementation for system foobar is in a file thread_foobar.h which is included by this file dependent on config settings. Stuff shared by all thread_*.h files is collected here. */ #include "config.h" /* config.h may or may not define DL_IMPORT */ #ifndef DL_IMPORT /* declarations for DLL import/export */ #define DL_IMPORT(RTYPE) RTYPE #endif #ifndef DONT_HAVE_STDIO_H #include <stdio.h> #endif #ifdef HAVE_STDLIB_H #include <stdlib.h> #else #ifdef Py_DEBUG extern char *getenv(const char *); #endif #endif #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #ifdef __DGUX #define _USING_POSIX4A_DRAFT6 #endif #ifdef __sgi #ifndef HAVE_PTHREAD_H /* XXX Need to check in configure.in */ #undef _POSIX_THREADS #endif #endif #include "pythread.h" #ifdef __ksr__ #define _POSIX_THREADS #endif #ifndef _POSIX_THREADS #ifdef __sgi #define SGI_THREADS #endif #ifdef HAVE_THREAD_H #define SOLARIS_THREADS #endif #if defined(sun) && !defined(SOLARIS_THREADS) #define SUN_LWP #endif #ifdef __MWERKS__ #define _POSIX_THREADS #endif #endif /* _POSIX_THREADS */ #ifdef Py_DEBUG static int thread_debug = 0; #define dprintf(args) ((thread_debug & 1) && printf args) #define d2printf(args) ((thread_debug & 8) && printf args) #else #define dprintf(args) #define d2printf(args) #endif static int initialized; static void PyThread__init_thread(void); /* Forward */ void PyThread_init_thread(void) { #ifdef Py_DEBUG char *p = getenv("THREADDEBUG"); if (p) { if (*p) thread_debug = atoi(p); else thread_debug = 1; } #endif /* Py_DEBUG */ if (initialized) return; initialized = 1; dprintf(("PyThread_init_thread called\n")); PyThread__init_thread(); } #ifdef SGI_THREADS #include "thread_sgi.h" #endif #ifdef SOLARIS_THREADS #include "thread_solaris.h" #endif #ifdef SUN_LWP #include "thread_lwp.h" #endif #ifdef _GNU_PTH #include "thread_pth.h" #else #ifdef _POSIX_THREADS #include "thread_pthread.h" #endif #endif #ifdef C_THREADS #include "thread_cthread.h" #endif #ifdef NT_THREADS #include "thread_nt.h" #endif #ifdef OS2_THREADS #include "thread_os2.h" #endif #ifdef BEOS_THREADS #include "thread_beos.h" #endif #ifdef WINCE_THREADS #include "thread_wince.h" #endif /* #ifdef FOOBAR_THREADS #include "thread_foobar.h" #endif */
