--- /dev/null
+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()
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]