summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-10-02 16:07:56 (GMT)
committerGitHub <noreply@github.com>2023-10-02 16:07:56 (GMT)
commit4d0d1c3866cc408ff3382a9a0220ac0e4f2b3b34 (patch)
treee64710870fc9e41b50cba8b563e2a509ea39309a
parent732ad44cec971be5255b1accbac6555d3615c2bf (diff)
downloadcpython-4d0d1c3866cc408ff3382a9a0220ac0e4f2b3b34.zip
cpython-4d0d1c3866cc408ff3382a9a0220ac0e4f2b3b34.tar.gz
cpython-4d0d1c3866cc408ff3382a9a0220ac0e4f2b3b34.tar.bz2
gh-110014: Remove PY_TIMEOUT_MAX from limited C API (#110217)
If the timeout is greater than PY_TIMEOUT_MAX, PyThread_acquire_lock_timed() uses a timeout of PY_TIMEOUT_MAX microseconds, which is around 280.6 years. This case is unlikely and limiting a timeout to 280.6 years sounds like a reasonable trade-off. The constant PY_TIMEOUT_MAX is not used in PyPI top 5,000 projects.
-rw-r--r--Doc/data/stable_abi.dat1
-rw-r--r--Doc/whatsnew/3.13.rst3
-rw-r--r--Include/cpython/pythread.h8
-rw-r--r--Include/pythread.h17
-rw-r--r--Lib/test/test_stable_abi_ctypes.py1
-rw-r--r--Misc/NEWS.d/next/C API/2023-10-02-13-39-57.gh-issue-110014.gfQ4jU.rst2
-rw-r--r--Misc/stable_abi.toml4
-rwxr-xr-xPC/python3dll.c1
8 files changed, 17 insertions, 20 deletions
diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat
index 07c6d51..c189c78 100644
--- a/Doc/data/stable_abi.dat
+++ b/Doc/data/stable_abi.dat
@@ -1,5 +1,4 @@
role,name,added,ifdef_note,struct_abi_kind
-var,PY_TIMEOUT_MAX,3.2,,
macro,PY_VECTORCALL_ARGUMENTS_OFFSET,3.12,,
function,PyAIter_Check,3.10,,
function,PyArg_Parse,3.2,,
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 1de5479..3a1b283 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -1290,3 +1290,6 @@ removed, although there is currently no date scheduled for their removal.
* :c:func:`PyThread_get_key_value`: use :c:func:`PyThread_tss_get`.
* :c:func:`PyThread_delete_key_value`: use :c:func:`PyThread_tss_delete`.
* :c:func:`PyThread_ReInitTLS`: no longer needed.
+
+* Remove undocumented ``PY_TIMEOUT_MAX`` constant from the limited C API.
+ (Contributed by Victor Stinner in :gh:`110014`.)
diff --git a/Include/cpython/pythread.h b/Include/cpython/pythread.h
index cd2aab7..03f710a 100644
--- a/Include/cpython/pythread.h
+++ b/Include/cpython/pythread.h
@@ -2,6 +2,14 @@
# error "this header file must not be included directly"
#endif
+// PY_TIMEOUT_MAX is the highest usable value (in microseconds) of PY_TIMEOUT_T
+// type, and depends on the system threading API.
+//
+// NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread module
+// exposes a higher-level API, with timeouts expressed in seconds and
+// floating-point numbers allowed.
+PyAPI_DATA(const long long) PY_TIMEOUT_MAX;
+
#define PYTHREAD_INVALID_THREAD_ID ((unsigned long)-1)
#ifdef HAVE_PTHREAD_H
diff --git a/Include/pythread.h b/Include/pythread.h
index 2c2fd63..0784f6b 100644
--- a/Include/pythread.h
+++ b/Include/pythread.h
@@ -33,27 +33,18 @@ PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int);
#define WAIT_LOCK 1
#define NOWAIT_LOCK 0
-/* PY_TIMEOUT_T is the integral type used to specify timeouts when waiting
- on a lock (see PyThread_acquire_lock_timed() below).
- PY_TIMEOUT_MAX is the highest usable value (in microseconds) of that
- type, and depends on the system threading API.
-
- NOTE: this isn't the same value as `_thread.TIMEOUT_MAX`. The _thread
- module exposes a higher-level API, with timeouts expressed in seconds
- and floating-point numbers allowed.
-*/
+// PY_TIMEOUT_T is the integral type used to specify timeouts when waiting
+// on a lock (see PyThread_acquire_lock_timed() below).
#define PY_TIMEOUT_T long long
-PyAPI_DATA(const long long) PY_TIMEOUT_MAX;
-
/* If microseconds == 0, the call is non-blocking: it returns immediately
even when the lock can't be acquired.
If microseconds > 0, the call waits up to the specified duration.
If microseconds < 0, the call waits until success (or abnormal failure)
- microseconds must be less than PY_TIMEOUT_MAX. Behaviour otherwise is
- undefined.
+ If *microseconds* is greater than PY_TIMEOUT_MAX, clamp the timeout to
+ PY_TIMEOUT_MAX microseconds.
If intr_flag is true and the acquire is interrupted by a signal, then the
call will return PY_LOCK_INTR. The caller may reattempt to acquire the
diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py
index 6e9496d..94f817f8e 100644
--- a/Lib/test/test_stable_abi_ctypes.py
+++ b/Lib/test/test_stable_abi_ctypes.py
@@ -35,7 +35,6 @@ class TestStableABIAvailability(unittest.TestCase):
SYMBOL_NAMES = (
- "PY_TIMEOUT_MAX",
"PyAIter_Check",
"PyArg_Parse",
"PyArg_ParseTuple",
diff --git a/Misc/NEWS.d/next/C API/2023-10-02-13-39-57.gh-issue-110014.gfQ4jU.rst b/Misc/NEWS.d/next/C API/2023-10-02-13-39-57.gh-issue-110014.gfQ4jU.rst
new file mode 100644
index 0000000..3a5ff7d
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2023-10-02-13-39-57.gh-issue-110014.gfQ4jU.rst
@@ -0,0 +1,2 @@
+Remove undocumented ``PY_TIMEOUT_MAX`` constant from the limited C API.
+Patch by Victor Stinner.
diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml
index 46e2307..8df3f85 100644
--- a/Misc/stable_abi.toml
+++ b/Misc/stable_abi.toml
@@ -1843,10 +1843,6 @@
[function.PyThread_start_new_thread]
added = '3.2'
-# Not mentioned in PEP 384, was implemented as a macro in Python <= 3.12
-[data.PY_TIMEOUT_MAX]
- added = '3.2'
-
# The following were added in PC/python3.def in Python 3.3:
# 7800f75827b1be557be16f3b18f5170fbf9fae08
# 9c56409d3353b8cd4cfc19e0467bbe23fd34fc92
diff --git a/PC/python3dll.c b/PC/python3dll.c
index 75728c7..2c1cc80 100755
--- a/PC/python3dll.c
+++ b/PC/python3dll.c
@@ -768,7 +768,6 @@ EXPORT_DATA(Py_FileSystemDefaultEncodeErrors)
EXPORT_DATA(Py_FileSystemDefaultEncoding)
EXPORT_DATA(Py_GenericAliasType)
EXPORT_DATA(Py_HasFileSystemDefaultEncoding)
-EXPORT_DATA(PY_TIMEOUT_MAX)
EXPORT_DATA(Py_UTF8Mode)
EXPORT_DATA(Py_Version)
EXPORT_DATA(PyBaseObject_Type)