gh-116738: Make syslog module thread-safe (#136760)

Make the setlogmask() function in the syslog module thread-safe. These changes are relevant for scenarios where the GIL is disabled or when using subinterpreters.
This commit is contained in:
Alper
2025-07-21 09:24:42 -07:00
committed by GitHub
parent 5f9e38f9b9
commit 65893c6f9c
3 changed files with 53 additions and 1 deletions

View File

@@ -0,0 +1,44 @@
import unittest
import threading
from test.support import import_helper, threading_helper
from test.support.threading_helper import run_concurrently
syslog = import_helper.import_module("syslog")
NTHREADS = 32
# Similar to Lib/test/test_syslog.py, this test's purpose is to verify that
# the code neither crashes nor leaks.
@threading_helper.requires_working_threading()
class TestSyslog(unittest.TestCase):
def test_racing_syslog(self):
def worker():
"""
The syslog module provides the following functions:
openlog(), syslog(), closelog(), and setlogmask().
"""
thread_id = threading.get_ident()
syslog.openlog(f"thread-id: {thread_id}")
try:
for _ in range(5):
syslog.syslog("logline")
syslog.setlogmask(syslog.LOG_MASK(syslog.LOG_INFO))
syslog.syslog(syslog.LOG_INFO, "logline LOG_INFO")
syslog.setlogmask(syslog.LOG_MASK(syslog.LOG_ERR))
syslog.syslog(syslog.LOG_ERR, "logline LOG_ERR")
syslog.setlogmask(syslog.LOG_UPTO(syslog.LOG_DEBUG))
finally:
syslog.closelog()
# Run the worker concurrently to exercise all these syslog functions
run_concurrently(
worker_func=worker,
nthreads=NTHREADS,
)
if __name__ == "__main__":
unittest.main()

View File

@@ -0,0 +1,2 @@
Make functions in :mod:`syslog` thread-safe on the :term:`free threaded
<free threading>` build.

View File

@@ -298,7 +298,13 @@ syslog_setlogmask_impl(PyObject *module, long maskpri)
return -1;
}
return setlogmask(maskpri);
static PyMutex setlogmask_mutex = {0};
PyMutex_Lock(&setlogmask_mutex);
// Linux man page (3): setlogmask() is MT-Unsafe race:LogMask.
long previous_mask = setlogmask(maskpri);
PyMutex_Unlock(&setlogmask_mutex);
return previous_mask;
}
/*[clinic input]