| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Internal PyTime_t C API: see Doc/c-api/time.rst for the documentation.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // The PyTime_t type is an integer to support directly common arithmetic
 | 
					
						
							|  |  |  | // operations such as t1 + t2.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Time formats:
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // * Seconds.
 | 
					
						
							|  |  |  | // * Seconds as a floating point number (C double).
 | 
					
						
							|  |  |  | // * Milliseconds (10^-3 seconds).
 | 
					
						
							|  |  |  | // * Microseconds (10^-6 seconds).
 | 
					
						
							|  |  |  | // * 100 nanoseconds (10^-7 seconds), used on Windows.
 | 
					
						
							|  |  |  | // * Nanoseconds (10^-9 seconds).
 | 
					
						
							|  |  |  | // * timeval structure, 1 microsecond (10^-6 seconds).
 | 
					
						
							|  |  |  | // * timespec structure, 1 nanosecond (10^-9 seconds).
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Note that PyTime_t is now specified as int64_t, in nanoseconds.
 | 
					
						
							|  |  |  | // (If we need to change this, we'll need new public API with new names.)
 | 
					
						
							|  |  |  | // Previously, PyTime_t was configurable (in theory); some comments and code
 | 
					
						
							|  |  |  | // might still allude to that.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Integer overflows are detected and raise OverflowError. Conversion to a
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // resolution larger than 1 nanosecond is rounded correctly with the requested
 | 
					
						
							|  |  |  | // rounding mode. Available rounding modes:
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // * Round towards minus infinity (-inf). For example, used to read a clock.
 | 
					
						
							|  |  |  | // * Round towards infinity (+inf). For example, used for timeout to wait "at
 | 
					
						
							|  |  |  | //   least" N seconds.
 | 
					
						
							|  |  |  | // * Round to nearest with ties going to nearest even integer. For example, used
 | 
					
						
							|  |  |  | //   to round from a Python float.
 | 
					
						
							|  |  |  | // * Round away from zero. For example, used for timeout.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Some functions clamp the result in the range [PyTime_MIN; PyTime_MAX]. The
 | 
					
						
							|  |  |  | // caller doesn't have to handle errors and so doesn't need to hold the GIL to
 | 
					
						
							|  |  |  | // handle exceptions. For example, _PyTime_Add(t1, t2) computes t1+t2 and
 | 
					
						
							|  |  |  | // clamps the result on overflow.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | //
 | 
					
						
							|  |  |  | // Clocks:
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // * System clock
 | 
					
						
							|  |  |  | // * Monotonic clock
 | 
					
						
							|  |  |  | // * Performance counter
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Internally, operations like (t * k / q) with integers are implemented in a
 | 
					
						
							|  |  |  | // way to reduce the risk of integer overflow. Such operation is used to convert a
 | 
					
						
							|  |  |  | // clock value expressed in ticks with a frequency to PyTime_t, like
 | 
					
						
							|  |  |  | // QueryPerformanceCounter() with QueryPerformanceFrequency() on Windows.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-08 16:46:09 -07:00
										 |  |  | #ifndef Py_INTERNAL_TIME_H
 | 
					
						
							|  |  |  | #define Py_INTERNAL_TIME_H
 | 
					
						
							|  |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | extern "C" { | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef Py_BUILD_CORE
 | 
					
						
							|  |  |  | #  error "this header requires Py_BUILD_CORE define"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | #ifdef __clang__
 | 
					
						
							|  |  |  | struct timeval; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | typedef PyTime_t _PyTime_t; | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | #define _SIZEOF_PYTIME_T 8
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef enum { | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  |     // Round towards minus infinity (-inf).
 | 
					
						
							|  |  |  |     // For example, used to read a clock.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  |     _PyTime_ROUND_FLOOR=0, | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Round towards infinity (+inf).
 | 
					
						
							|  |  |  |     // For example, used for timeout to wait "at least" N seconds.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  |     _PyTime_ROUND_CEILING=1, | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Round to nearest with ties going to nearest even integer.
 | 
					
						
							|  |  |  |     // For example, used to round from a Python float.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  |     _PyTime_ROUND_HALF_EVEN=2, | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // Round away from zero
 | 
					
						
							|  |  |  |     // For example, used for timeout. _PyTime_ROUND_CEILING rounds
 | 
					
						
							|  |  |  |     // -1e-9 to 0 milliseconds which causes bpo-31786 issue.
 | 
					
						
							|  |  |  |     // _PyTime_ROUND_UP rounds -1e-9 to -1 millisecond which keeps
 | 
					
						
							|  |  |  |     // the timeout sign as expected. select.poll(timeout) must block
 | 
					
						
							|  |  |  |     // for negative values.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  |     _PyTime_ROUND_UP=3, | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // _PyTime_ROUND_TIMEOUT (an alias for _PyTime_ROUND_UP) should be
 | 
					
						
							|  |  |  |     // used for timeouts.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  |     _PyTime_ROUND_TIMEOUT = _PyTime_ROUND_UP | 
					
						
							|  |  |  | } _PyTime_round_t; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a time_t to a PyLong.
 | 
					
						
							|  |  |  | // Export for '_testinternalcapi' shared extension
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(PyObject*) _PyLong_FromTime_t(time_t sec); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a PyLong to a time_t.
 | 
					
						
							|  |  |  | // Export for '_datetime' shared extension
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(time_t) _PyLong_AsTime_t(PyObject *obj); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a number of seconds, int or float, to time_t.
 | 
					
						
							|  |  |  | // Export for '_datetime' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_ObjectToTime_t( | 
					
						
							|  |  |  |     PyObject *obj, | 
					
						
							|  |  |  |     time_t *sec, | 
					
						
							|  |  |  |     _PyTime_round_t); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a number of seconds, int or float, to a timeval structure.
 | 
					
						
							|  |  |  | // usec is in the range [0; 999999] and rounded towards zero.
 | 
					
						
							|  |  |  | // For example, -1.2 is converted to (-2, 800000).
 | 
					
						
							|  |  |  | // Export for '_datetime' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_ObjectToTimeval( | 
					
						
							|  |  |  |     PyObject *obj, | 
					
						
							|  |  |  |     time_t *sec, | 
					
						
							|  |  |  |     long *usec, | 
					
						
							|  |  |  |     _PyTime_round_t); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a number of seconds, int or float, to a timespec structure.
 | 
					
						
							|  |  |  | // nsec is in the range [0; 999999999] and rounded towards zero.
 | 
					
						
							|  |  |  | // For example, -1.2 is converted to (-2, 800000000).
 | 
					
						
							|  |  |  | // Export for '_testinternalcapi' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_ObjectToTimespec( | 
					
						
							|  |  |  |     PyObject *obj, | 
					
						
							|  |  |  |     time_t *sec, | 
					
						
							|  |  |  |     long *nsec, | 
					
						
							|  |  |  |     _PyTime_round_t); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Create a timestamp from a number of seconds.
 | 
					
						
							|  |  |  | // Export for '_socket' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyTime_FromSeconds(int seconds); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-08 02:33:22 +09:00
										 |  |  | // Create a timestamp from a number of seconds in double.
 | 
					
						
							|  |  |  | // Export for '_socket' shared extension.
 | 
					
						
							|  |  |  | PyAPI_FUNC(_PyTime_t) _PyTime_FromSecondsDouble(double seconds, _PyTime_round_t round); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Macro to create a timestamp from a number of seconds, no integer overflow.
 | 
					
						
							|  |  |  | // Only use the macro for small values, prefer _PyTime_FromSeconds().
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | #define _PYTIME_FROMSECONDS(seconds) \
 | 
					
						
							|  |  |  |             ((_PyTime_t)(seconds) * (1000 * 1000 * 1000)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Create a timestamp from a number of nanoseconds.
 | 
					
						
							|  |  |  | // Export for '_testinternalcapi' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(_PyTime_t ns); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Create a timestamp from a number of microseconds.
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Clamp to [PyTime_MIN; PyTime_MAX] on overflow.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | extern _PyTime_t _PyTime_FromMicrosecondsClamp(_PyTime_t us); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Create a timestamp from nanoseconds (Python int).
 | 
					
						
							|  |  |  | // Export for '_lsprof' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_FromNanosecondsObject(_PyTime_t *t, | 
					
						
							|  |  |  |     PyObject *obj); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a number of seconds (Python float or int) to a timestamp.
 | 
					
						
							|  |  |  | // Raise an exception and return -1 on error, return 0 on success.
 | 
					
						
							|  |  |  | // Export for '_socket' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_FromSecondsObject(_PyTime_t *t, | 
					
						
							|  |  |  |     PyObject *obj, | 
					
						
							|  |  |  |     _PyTime_round_t round); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a number of milliseconds (Python float or int, 10^-3) to a timestamp.
 | 
					
						
							|  |  |  | // Raise an exception and return -1 on error, return 0 on success.
 | 
					
						
							|  |  |  | // Export for 'select' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_FromMillisecondsObject(_PyTime_t *t, | 
					
						
							|  |  |  |     PyObject *obj, | 
					
						
							|  |  |  |     _PyTime_round_t round); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert timestamp to a number of milliseconds (10^-3 seconds).
 | 
					
						
							|  |  |  | // Export for '_ssl' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyTime_AsMilliseconds(_PyTime_t t, | 
					
						
							|  |  |  |     _PyTime_round_t round); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert timestamp to a number of microseconds (10^-6 seconds).
 | 
					
						
							|  |  |  | // Export for '_queue' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyTime_AsMicroseconds(_PyTime_t t, | 
					
						
							|  |  |  |     _PyTime_round_t round); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef MS_WINDOWS
 | 
					
						
							|  |  |  | // Convert timestamp to a number of 100 nanoseconds (10^-7 seconds).
 | 
					
						
							|  |  |  | extern _PyTime_t _PyTime_As100Nanoseconds(_PyTime_t t, | 
					
						
							|  |  |  |     _PyTime_round_t round); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert timestamp to a number of nanoseconds (10^-9 seconds) as a Python int
 | 
					
						
							|  |  |  | // object.
 | 
					
						
							|  |  |  | // Export for '_testinternalcapi' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(PyObject*) _PyTime_AsNanosecondsObject(_PyTime_t t); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef MS_WINDOWS
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Create a timestamp from a timeval structure.
 | 
					
						
							|  |  |  | // Raise an exception and return -1 on overflow, return 0 on success.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | extern int _PyTime_FromTimeval(_PyTime_t *tp, struct timeval *tv); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a timestamp to a timeval structure (microsecond resolution).
 | 
					
						
							|  |  |  | // tv_usec is always positive.
 | 
					
						
							|  |  |  | // Raise an exception and return -1 if the conversion overflowed,
 | 
					
						
							|  |  |  | // return 0 on success.
 | 
					
						
							|  |  |  | // Export for 'select' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t, | 
					
						
							|  |  |  |     struct timeval *tv, | 
					
						
							|  |  |  |     _PyTime_round_t round); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Similar to _PyTime_AsTimeval() but don't raise an exception on overflow.
 | 
					
						
							|  |  |  | // On overflow, clamp tv_sec to _PyTime_t min/max.
 | 
					
						
							|  |  |  | // Export for 'select' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(void) _PyTime_AsTimeval_clamp(_PyTime_t t, | 
					
						
							|  |  |  |     struct timeval *tv, | 
					
						
							|  |  |  |     _PyTime_round_t round); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a timestamp to a number of seconds (secs) and microseconds (us).
 | 
					
						
							|  |  |  | // us is always positive. This function is similar to _PyTime_AsTimeval()
 | 
					
						
							|  |  |  | // except that secs is always a time_t type, whereas the timeval structure
 | 
					
						
							|  |  |  | // uses a C long for tv_sec on Windows.
 | 
					
						
							|  |  |  | // Raise an exception and return -1 if the conversion overflowed,
 | 
					
						
							|  |  |  | // return 0 on success.
 | 
					
						
							|  |  |  | // Export for '_datetime' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_AsTimevalTime_t( | 
					
						
							|  |  |  |     _PyTime_t t, | 
					
						
							|  |  |  |     time_t *secs, | 
					
						
							|  |  |  |     int *us, | 
					
						
							|  |  |  |     _PyTime_round_t round); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Create a timestamp from a timespec structure.
 | 
					
						
							|  |  |  | // Raise an exception and return -1 on overflow, return 0 on success.
 | 
					
						
							| 
									
										
										
										
											2023-10-08 02:33:22 +09:00
										 |  |  | extern int _PyTime_FromTimespec(_PyTime_t *tp, const struct timespec *ts); | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Convert a timestamp to a timespec structure (nanosecond resolution).
 | 
					
						
							|  |  |  | // tv_nsec is always positive.
 | 
					
						
							|  |  |  | // Raise an exception and return -1 on error, return 0 on success.
 | 
					
						
							|  |  |  | // Export for '_testinternalcapi' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Similar to _PyTime_AsTimespec() but don't raise an exception on overflow.
 | 
					
						
							|  |  |  | // On overflow, clamp tv_sec to _PyTime_t min/max.
 | 
					
						
							|  |  |  | // Export for '_testinternalcapi' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(void) _PyTime_AsTimespec_clamp(_PyTime_t t, struct timespec *ts); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Compute t1 + t2. Clamp to [PyTime_MIN; PyTime_MAX] on overflow.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | extern _PyTime_t _PyTime_Add(_PyTime_t t1, _PyTime_t t2); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Structure used by time.get_clock_info()
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | typedef struct { | 
					
						
							|  |  |  |     const char *implementation; | 
					
						
							|  |  |  |     int monotonic; | 
					
						
							|  |  |  |     int adjustable; | 
					
						
							|  |  |  |     double resolution; | 
					
						
							|  |  |  | } _Py_clock_info_t; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Get the current time from the system clock.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // If the internal clock fails, silently ignore the error and return 0.
 | 
					
						
							|  |  |  | // On integer overflow, silently ignore the overflow and clamp the clock to
 | 
					
						
							|  |  |  | // [_PyTime_MIN; _PyTime_MAX].
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Use _PyTime_GetSystemClockWithInfo or the public PyTime_Time() to check
 | 
					
						
							|  |  |  | // for failure.
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Export for '_random' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Get the current time from the system clock.
 | 
					
						
							|  |  |  | // On success, set *t and *info (if not NULL), and return 0.
 | 
					
						
							|  |  |  | // On error, raise an exception and return -1.
 | 
					
						
							|  |  |  | extern int _PyTime_GetSystemClockWithInfo( | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  |     _PyTime_t *t, | 
					
						
							|  |  |  |     _Py_clock_info_t *info); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Get the time of a monotonic clock, i.e. a clock that cannot go backwards.
 | 
					
						
							|  |  |  | // The clock is not affected by system clock updates. The reference point of
 | 
					
						
							|  |  |  | // the returned value is undefined, so that only the difference between the
 | 
					
						
							|  |  |  | // results of consecutive calls is valid.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // If the internal clock fails, silently ignore the error and return 0.
 | 
					
						
							|  |  |  | // On integer overflow, silently ignore the overflow and clamp the clock to
 | 
					
						
							|  |  |  | // [_PyTime_MIN; _PyTime_MAX].
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Use _PyTime_GetMonotonicClockWithInfo or the public PyTime_Monotonic()
 | 
					
						
							|  |  |  | // to check for failure.
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Export for '_random' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Get the time of a monotonic clock, i.e. a clock that cannot go backwards.
 | 
					
						
							|  |  |  | // The clock is not affected by system clock updates. The reference point of
 | 
					
						
							|  |  |  | // the returned value is undefined, so that only the difference between the
 | 
					
						
							|  |  |  | // results of consecutive calls is valid.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Fill info (if set) with information of the function used to get the time.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Return 0 on success, raise an exception and return -1 on error.
 | 
					
						
							|  |  |  | // Export for '_testsinglephase' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_GetMonotonicClockWithInfo( | 
					
						
							|  |  |  |     _PyTime_t *t, | 
					
						
							|  |  |  |     _Py_clock_info_t *info); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Converts a timestamp to the Gregorian time, using the local time zone.
 | 
					
						
							|  |  |  | // Return 0 on success, raise an exception and return -1 on error.
 | 
					
						
							|  |  |  | // Export for '_datetime' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Converts a timestamp to the Gregorian time, assuming UTC.
 | 
					
						
							|  |  |  | // Return 0 on success, raise an exception and return -1 on error.
 | 
					
						
							|  |  |  | // Export for '_datetime' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Get the performance counter: clock with the highest available resolution to
 | 
					
						
							|  |  |  | // measure a short duration.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // If the internal clock fails, silently ignore the error and return 0.
 | 
					
						
							|  |  |  | // On integer overflow, silently ignore the overflow and clamp the clock to
 | 
					
						
							|  |  |  | // [_PyTime_MIN; _PyTime_MAX].
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Use _PyTime_GetPerfCounterWithInfo() or the public PyTime_PerfCounter
 | 
					
						
							|  |  |  | // to check for failure.
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Export for '_lsprof' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyTime_GetPerfCounter(void); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | // Get the performance counter: clock with the highest available resolution to
 | 
					
						
							|  |  |  | // measure a short duration.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Fill info (if set) with information of the function used to get the time.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Return 0 on success, raise an exception and return -1 on error.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | extern int _PyTime_GetPerfCounterWithInfo( | 
					
						
							|  |  |  |     _PyTime_t *t, | 
					
						
							|  |  |  |     _Py_clock_info_t *info); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-12 18:13:10 +01:00
										 |  |  | // Alias for backward compatibility
 | 
					
						
							|  |  |  | #define _PyTime_MIN PyTime_MIN
 | 
					
						
							|  |  |  | #define _PyTime_MAX PyTime_MAX
 | 
					
						
							|  |  |  | #define _PyTime_AsSecondsDouble PyTime_AsSecondsDouble
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // --- _PyDeadline -----------------------------------------------------------
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Create a deadline.
 | 
					
						
							|  |  |  | // Pseudo code: _PyTime_GetMonotonicClock() + timeout.
 | 
					
						
							| 
									
										
										
										
											2023-07-25 04:25:45 +02:00
										 |  |  | // Export for '_ssl' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyDeadline_Init(_PyTime_t timeout); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Get remaining time from a deadline.
 | 
					
						
							|  |  |  | // Pseudo code: deadline - _PyTime_GetMonotonicClock().
 | 
					
						
							| 
									
										
										
										
											2023-07-25 04:25:45 +02:00
										 |  |  | // Export for '_ssl' shared extension.
 | 
					
						
							| 
									
										
										
										
											2023-07-02 00:27:18 +02:00
										 |  |  | PyAPI_FUNC(_PyTime_t) _PyDeadline_Get(_PyTime_t deadline); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-01 19:50:10 +01:00
										 |  |  | // --- _PyTimeFraction -------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  |     _PyTime_t numer; | 
					
						
							|  |  |  |     _PyTime_t denom; | 
					
						
							|  |  |  | } _PyTimeFraction; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Set a fraction.
 | 
					
						
							|  |  |  | // Return 0 on success.
 | 
					
						
							|  |  |  | // Return -1 if the fraction is invalid.
 | 
					
						
							|  |  |  | extern int _PyTimeFraction_Set( | 
					
						
							|  |  |  |     _PyTimeFraction *frac, | 
					
						
							|  |  |  |     _PyTime_t numer, | 
					
						
							|  |  |  |     _PyTime_t denom); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Compute ticks * frac.numer / frac.denom.
 | 
					
						
							|  |  |  | // Clamp to [_PyTime_MIN; _PyTime_MAX] on overflow.
 | 
					
						
							|  |  |  | extern _PyTime_t _PyTimeFraction_Mul( | 
					
						
							|  |  |  |     _PyTime_t ticks, | 
					
						
							|  |  |  |     const _PyTimeFraction *frac); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Compute a clock resolution: frac.numer / frac.denom / 1e9.
 | 
					
						
							|  |  |  | extern double _PyTimeFraction_Resolution( | 
					
						
							|  |  |  |     const _PyTimeFraction *frac); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-12-08 16:46:09 -07:00
										 |  |  | #ifdef __cplusplus
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2023-08-24 17:17:40 +02:00
										 |  |  | #endif   // !Py_INTERNAL_TIME_H
 |