]> granicus.if.org Git - python/commitdiff
SF patch 1044089: New C API function PyEval_ThreadsInitialized(), by Nick
authorTim Peters <tim.peters@gmail.com>
Mon, 11 Oct 2004 02:40:51 +0000 (02:40 +0000)
committerTim Peters <tim.peters@gmail.com>
Mon, 11 Oct 2004 02:40:51 +0000 (02:40 +0000)
Coghlan, for determining whether PyEval_InitThreads() has been called.
Also purged the undocumented+unused _PyThread_Started int.

Doc/api/init.tex
Include/ceval.h
Misc/NEWS
PC/os2emx/python24.def
PC/os2vacpp/python.def
Python/ceval.c
Python/pythonrun.c

index ba961242d7d42a0fa9c228ba674468888735bcb2..764c93275e20aecece062a4b9591101fb1aa2032 100644 (file)
@@ -24,7 +24,7 @@
 \end{cfuncdesc}
 
 \begin{cfuncdesc}{void}{Py_InitializeEx}{int initsigs}
-  This function works like \cfunction{Py_Initialize} if
+  This function works like \cfunction{Py_Initialize()} if
   \var{initsigs} is 1. If \var{initsigs} is 0, it skips
   initialization registration of signal handlers, which
   might be useful when Python is embedded. \versionadded{2.4}
@@ -517,14 +517,14 @@ for calling into Python from a C thread is
   This is a common situation (most Python programs do not use
   threads), and the lock operations slow the interpreter down a bit.
   Therefore, the lock is not created initially.  This situation is
-  equivalent to having acquired the lock: when there is only a single
+  equivalent to having acquired the lock:  when there is only a single
   thread, all object accesses are safe.  Therefore, when this function
   initializes the lock, it also acquires it.  Before the Python
   \module{thread}\refbimodindex{thread} module creates a new thread,
   knowing that either it has the lock or the lock hasn't been created
   yet, it calls \cfunction{PyEval_InitThreads()}.  When this call
-  returns, it is guaranteed that the lock has been created and that it
-  has acquired it.
+  returns, it is guaranteed that the lock has been created and that the
+  calling thread has acquired it.
 
   It is \strong{not} safe to call this function when it is unknown
   which thread (if any) currently has the global interpreter lock.
@@ -533,6 +533,14 @@ for calling into Python from a C thread is
   compile time.
 \end{cfuncdesc}
 
+\begin{cfuncdesc}{int}{PyEval_ThreadsInitialized}{}
+  Returns a non-zero value if \cfunction{PyEval_InitThreads()} has been
+  called.  This function can be called without holding the lock, and
+  therefore can be used to avoid calls to the locking API when running
+  single-threaded.  This function is not available when thread support
+  is disabled at compile time. \versionadded{2.4}
+\end{cfuncdesc}
+
 \begin{cfuncdesc}{void}{PyEval_AcquireLock}{}
   Acquire the global interpreter lock.  The lock must have been
   created earlier.  If this thread already has the lock, a deadlock
index 3d1f6fd2b0919faded23ae68617263b49301c486..d9320e02c18f6bfc3d88a04a401354b2a4bf8a8d 100644 (file)
@@ -120,6 +120,7 @@ PyAPI_FUNC(void) PyEval_RestoreThread(PyThreadState *);
 
 #ifdef WITH_THREAD
 
+PyAPI_FUNC(int)  PyEval_ThreadsInitialized(void);
 PyAPI_FUNC(void) PyEval_InitThreads(void);
 PyAPI_FUNC(void) PyEval_AcquireLock(void);
 PyAPI_FUNC(void) PyEval_ReleaseLock(void);
index 87c6f37f2c3b1723be0a0b36e23c4096317e584a..d5472044c02fa6732da2cb6dea333060a3549f86 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -136,6 +136,11 @@ Build
 C API
 -----
 
+- SF patch 1044089:  New function ``PyEval_ThreadsInitialized()`` returns
+  non-zero if PyEval_InitThreads() has been called.
+
+- The undocumented and unused extern int ``_PyThread_Started`` was removed.
+
 - The C API calls ``PyInterpreterState_New()`` and ``PyThreadState_New()``
   are two of the very few advertised as being safe to call without holding
   the GIL.  However, this wasn't true in a debug build, as bug 1041645
index 4cfd4b86639fcb54972af91e23ed976bc30d1fff..4f78914577761f0fd0d7e03e95db86281c1a201f 100644 (file)
@@ -980,7 +980,6 @@ EXPORTS
   "Py_UseClassExceptionsFlag"
   "Py_UnicodeFlag"
   "_Py_QnewFlag"
-  "_PyThread_Started"
 
 ; From python24_s.lib(structmember)
   "PyMember_Get"
index 8f1207bf398156771751ba33d8eeb4b127780480..bc73fac17a057747e944221c67398193820a07cc 100644 (file)
@@ -69,7 +69,6 @@ EXPORTS
                _PyImport_Inittab
                _PyParser_Grammar
                _PyParser_TokenNames
-               _PyThread_Started
                _Py_EllipsisObject
                _Py_NoneStruct
                _Py_PackageContext
index 2223aba735638a5c09e9dea9e7c194cf9a6be48a..4d26a7a7359efad99a6952e7e1429a3207ac47fe 100644 (file)
@@ -203,17 +203,20 @@ PyEval_GetCallStats(PyObject *self)
 #endif
 #include "pythread.h"
 
-extern int _PyThread_Started; /* Flag for Py_Exit */
-
 static PyThread_type_lock interpreter_lock = 0; /* This is the GIL */
 static long main_thread = 0;
 
+int
+PyEval_ThreadsInitialized(void)
+{
+       return interpreter_lock != 0;
+}
+
 void
 PyEval_InitThreads(void)
 {
        if (interpreter_lock)
                return;
-       _PyThread_Started = 1;
        interpreter_lock = PyThread_allocate_lock();
        PyThread_acquire_lock(interpreter_lock, 1);
        main_thread = PyThread_get_thread_ident();
index 06bec1e03860a47a16b61d8a0cbd3e6795f13681..92e051b17624c3121f74905626e400a1879d9748 100644 (file)
@@ -1517,7 +1517,6 @@ Py_FatalError(const char *msg)
 
 #ifdef WITH_THREAD
 #include "pythread.h"
-int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
 #endif
 
 #define NEXITFUNCS 32