Skip to content

Commit

Permalink
pythongh-108294: Add time.sleep audit event (pythonGH-108298)
Browse files Browse the repository at this point in the history
  • Loading branch information
encukou committed Aug 23, 2023
1 parent 2dfbd4f commit 31b61d1
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 0 deletions.
5 changes: 5 additions & 0 deletions Doc/library/time.rst
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,8 @@ Functions
* Or use ``nanosleep()`` if available (resolution: 1 nanosecond);
* Or use ``select()`` (resolution: 1 microsecond).

.. audit-event:: time.sleep secs

.. versionchanged:: 3.11
On Unix, the ``clock_nanosleep()`` and ``nanosleep()`` functions are now
used if available. On Windows, a waitable timer is now used.
Expand All @@ -389,6 +391,9 @@ Functions
:pep:`475` for the rationale).


.. versionchanged:: 3.13
Raises an auditing event.

.. index::
single: % (percent); datetime format

Expand Down
15 changes: 15 additions & 0 deletions Lib/test/audit-tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -514,6 +514,21 @@ def test_not_in_gc():
assert hook not in o


def test_time():
import time

def hook(event, args):
if event.startswith("time."):
print(event, *args)
sys.addaudithook(hook)

time.sleep(0)
time.sleep(0.0625) # 1/16, a small exact float
try:
time.sleep(-1)
except ValueError:
pass

def test_sys_monitoring_register_callback():
import sys

Expand Down
15 changes: 15 additions & 0 deletions Lib/test/test_audit.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,21 @@ def test_not_in_gc(self):
if returncode:
self.fail(stderr)

def test_time(self):
returncode, events, stderr = self.run_python("test_time")
if returncode:
self.fail(stderr)

if support.verbose:
print(*events, sep='\n')

actual = [(ev[0], ev[2]) for ev in events]
expected = [("time.sleep", "0"),
("time.sleep", "0.0625"),
("time.sleep", "-1")]

self.assertEqual(actual, expected)


def test_sys_monitoring_register_callback(self):
returncode, events, stderr = self.run_python("test_sys_monitoring_register_callback")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:func:`time.sleep` now raises an auditing event.
2 changes: 2 additions & 0 deletions Modules/timemodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,8 @@ Return the clk_id of a thread's CPU time clock.");
static PyObject *
time_sleep(PyObject *self, PyObject *timeout_obj)
{
PySys_Audit("time.sleep", "O", timeout_obj);

_PyTime_t timeout;
if (_PyTime_FromSecondsObject(&timeout, timeout_obj, _PyTime_ROUND_TIMEOUT))
return NULL;
Expand Down

0 comments on commit 31b61d1

Please sign in to comment.