]> granicus.if.org Git - python/commitdiff
bpo-36475: Make PyThread_exit_thread with _Py_NO_RETURN (GH-13068)
authorVictor Stinner <vstinner@redhat.com>
Sat, 4 May 2019 15:48:05 +0000 (11:48 -0400)
committerGitHub <noreply@github.com>
Sat, 4 May 2019 15:48:05 +0000 (11:48 -0400)
Include/pyerrors.h
Include/pyport.h
Include/pythread.h
Python/ceval.c
Python/thread_nt.h
Python/thread_pthread.h

index 5c6751868df489d583f3f52b8320ccb806d869fe..94af3cb3420ec6187d42b7bccef8bb0e7720b80c 100644 (file)
@@ -21,17 +21,6 @@ PyAPI_FUNC(void) PyErr_GetExcInfo(PyObject **, PyObject **, PyObject **);
 PyAPI_FUNC(void) PyErr_SetExcInfo(PyObject *, PyObject *, PyObject *);
 #endif
 
-#if defined(__clang__) || \
-    (defined(__GNUC__) && \
-     ((__GNUC__ >= 3) || \
-      (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5)))
-#  define _Py_NO_RETURN __attribute__((__noreturn__))
-#elif defined(_MSC_VER)
-#  define _Py_NO_RETURN __declspec(noreturn)
-#else
-#  define _Py_NO_RETURN
-#endif
-
 /* Defined in Python/pylifecycle.c */
 PyAPI_FUNC(void) _Py_NO_RETURN Py_FatalError(const char *message);
 
index 97fb5e59f9e54477c56069c50b31e4dbe97e3ae1..ab88a9ac5c529e73f8db8b928c7f922d81abd3b2 100644 (file)
@@ -829,4 +829,18 @@ extern _invalid_parameter_handler _Py_silent_invalid_parameter_handler;
 #  define _Py_FORCE_UTF8_FS_ENCODING
 #endif
 
+/* Mark a function which cannot return. Example:
+
+   PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void); */
+#if defined(__clang__) || \
+    (defined(__GNUC__) && \
+     ((__GNUC__ >= 3) || \
+      (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5)))
+#  define _Py_NO_RETURN __attribute__((__noreturn__))
+#elif defined(_MSC_VER)
+#  define _Py_NO_RETURN __declspec(noreturn)
+#else
+#  define _Py_NO_RETURN
+#endif
+
 #endif /* Py_PYPORT_H */
index eb61033b2d908985af043a1876e4c9a757f9de3f..bc1d92cd1ff199b4c50a224d770c313b44408fe8 100644 (file)
@@ -23,7 +23,7 @@ typedef enum PyLockStatus {
 
 PyAPI_FUNC(void) PyThread_init_thread(void);
 PyAPI_FUNC(unsigned long) PyThread_start_new_thread(void (*)(void *), void *);
-PyAPI_FUNC(void) PyThread_exit_thread(void);
+PyAPI_FUNC(void) _Py_NO_RETURN PyThread_exit_thread(void);
 PyAPI_FUNC(unsigned long) PyThread_get_thread_ident(void);
 
 PyAPI_FUNC(PyThread_type_lock) PyThread_allocate_lock(void);
index 8ae273e0820d2acce880efb25cb729cd22960053..e616a3f539898d8c9ff7ff091455cbdc171bd494 100644 (file)
@@ -211,7 +211,6 @@ exit_thread_if_finalizing(PyThreadState *tstate)
     if (_Py_IsFinalizing() && !_Py_CURRENTLY_FINALIZING(tstate)) {
         drop_gil(tstate);
         PyThread_exit_thread();
-        Py_UNREACHABLE();
     }
 }
 
index fdb192b7d77a1604677219a911534cfbbaf598e8..5e00c351146055d40661242e0f8760d05f512597 100644 (file)
@@ -227,7 +227,7 @@ PyThread_get_thread_ident(void)
     return GetCurrentThreadId();
 }
 
-void
+void _Py_NO_RETURN
 PyThread_exit_thread(void)
 {
     dprintf(("%lu: PyThread_exit_thread called\n", PyThread_get_thread_ident()));
index 25f58d9446d8d607dd0c268a5669c864ad3375ca..1f4f36d52d5552782734aecba14c3aca58ae40c4 100644 (file)
@@ -302,7 +302,7 @@ PyThread_get_thread_ident(void)
     return (unsigned long) threadid;
 }
 
-void
+void _Py_NO_RETURN
 PyThread_exit_thread(void)
 {
     dprintf(("PyThread_exit_thread called\n"));