Home | History | Annotate | Download | only in Include
      1 #ifndef Py_LIMITED_API
      2 #ifndef Py_PYTIME_H
      3 #define Py_PYTIME_H
      4 
      5 #include "pyconfig.h" /* include for defines */
      6 #include "object.h"
      7 
      8 /**************************************************************************
      9 Symbols and macros to supply platform-independent interfaces to time related
     10 functions and constants
     11 **************************************************************************/
     12 #ifdef __cplusplus
     13 extern "C" {
     14 #endif
     15 
     16 /* _PyTime_t: Python timestamp with subsecond precision. It can be used to
     17    store a duration, and so indirectly a date (related to another date, like
     18    UNIX epoch). */
     19 typedef int64_t _PyTime_t;
     20 #define _PyTime_MIN PY_LLONG_MIN
     21 #define _PyTime_MAX PY_LLONG_MAX
     22 
     23 typedef enum {
     24     /* Round towards minus infinity (-inf).
     25        For example, used to read a clock. */
     26     _PyTime_ROUND_FLOOR=0,
     27     /* Round towards infinity (+inf).
     28        For example, used for timeout to wait "at least" N seconds. */
     29     _PyTime_ROUND_CEILING=1,
     30     /* Round to nearest with ties going to nearest even integer.
     31        For example, used to round from a Python float. */
     32     _PyTime_ROUND_HALF_EVEN
     33 } _PyTime_round_t;
     34 
     35 /* Convert a time_t to a PyLong. */
     36 PyAPI_FUNC(PyObject *) _PyLong_FromTime_t(
     37     time_t sec);
     38 
     39 /* Convert a PyLong to a time_t. */
     40 PyAPI_FUNC(time_t) _PyLong_AsTime_t(
     41     PyObject *obj);
     42 
     43 /* Convert a number of seconds, int or float, to time_t. */
     44 PyAPI_FUNC(int) _PyTime_ObjectToTime_t(
     45     PyObject *obj,
     46     time_t *sec,
     47     _PyTime_round_t);
     48 
     49 /* Convert a number of seconds, int or float, to a timeval structure.
     50    usec is in the range [0; 999999] and rounded towards zero.
     51    For example, -1.2 is converted to (-2, 800000). */
     52 PyAPI_FUNC(int) _PyTime_ObjectToTimeval(
     53     PyObject *obj,
     54     time_t *sec,
     55     long *usec,
     56     _PyTime_round_t);
     57 
     58 /* Convert a number of seconds, int or float, to a timespec structure.
     59    nsec is in the range [0; 999999999] and rounded towards zero.
     60    For example, -1.2 is converted to (-2, 800000000). */
     61 PyAPI_FUNC(int) _PyTime_ObjectToTimespec(
     62     PyObject *obj,
     63     time_t *sec,
     64     long *nsec,
     65     _PyTime_round_t);
     66 
     67 
     68 /* Create a timestamp from a number of seconds. */
     69 PyAPI_FUNC(_PyTime_t) _PyTime_FromSeconds(int seconds);
     70 
     71 /* Macro to create a timestamp from a number of seconds, no integer overflow.
     72    Only use the macro for small values, prefer _PyTime_FromSeconds(). */
     73 #define _PYTIME_FROMSECONDS(seconds) \
     74             ((_PyTime_t)(seconds) * (1000 * 1000 * 1000))
     75 
     76 /* Create a timestamp from a number of nanoseconds. */
     77 PyAPI_FUNC(_PyTime_t) _PyTime_FromNanoseconds(long long ns);
     78 
     79 /* Convert a number of seconds (Python float or int) to a timetamp.
     80    Raise an exception and return -1 on error, return 0 on success. */
     81 PyAPI_FUNC(int) _PyTime_FromSecondsObject(_PyTime_t *t,
     82     PyObject *obj,
     83     _PyTime_round_t round);
     84 
     85 /* Convert a number of milliseconds (Python float or int, 10^-3) to a timetamp.
     86    Raise an exception and return -1 on error, return 0 on success. */
     87 PyAPI_FUNC(int) _PyTime_FromMillisecondsObject(_PyTime_t *t,
     88     PyObject *obj,
     89     _PyTime_round_t round);
     90 
     91 /* Convert a timestamp to a number of seconds as a C double. */
     92 PyAPI_FUNC(double) _PyTime_AsSecondsDouble(_PyTime_t t);
     93 
     94 /* Convert timestamp to a number of milliseconds (10^-3 seconds). */
     95 PyAPI_FUNC(_PyTime_t) _PyTime_AsMilliseconds(_PyTime_t t,
     96     _PyTime_round_t round);
     97 
     98 /* Convert timestamp to a number of microseconds (10^-6 seconds). */
     99 PyAPI_FUNC(_PyTime_t) _PyTime_AsMicroseconds(_PyTime_t t,
    100     _PyTime_round_t round);
    101 
    102 /* Convert timestamp to a number of nanoseconds (10^-9 seconds) as a Python int
    103    object. */
    104 PyAPI_FUNC(PyObject *) _PyTime_AsNanosecondsObject(_PyTime_t t);
    105 
    106 /* Convert a timestamp to a timeval structure (microsecond resolution).
    107    tv_usec is always positive.
    108    Raise an exception and return -1 if the conversion overflowed,
    109    return 0 on success. */
    110 PyAPI_FUNC(int) _PyTime_AsTimeval(_PyTime_t t,
    111     struct timeval *tv,
    112     _PyTime_round_t round);
    113 
    114 /* Similar to _PyTime_AsTimeval(), but don't raise an exception on error. */
    115 PyAPI_FUNC(int) _PyTime_AsTimeval_noraise(_PyTime_t t,
    116     struct timeval *tv,
    117     _PyTime_round_t round);
    118 
    119 /* Convert a timestamp to a number of seconds (secs) and microseconds (us).
    120    us is always positive. This function is similar to _PyTime_AsTimeval()
    121    except that secs is always a time_t type, whereas the timeval structure
    122    uses a C long for tv_sec on Windows.
    123    Raise an exception and return -1 if the conversion overflowed,
    124    return 0 on success. */
    125 PyAPI_FUNC(int) _PyTime_AsTimevalTime_t(
    126     _PyTime_t t,
    127     time_t *secs,
    128     int *us,
    129     _PyTime_round_t round);
    130 
    131 #if defined(HAVE_CLOCK_GETTIME) || defined(HAVE_KQUEUE)
    132 /* Convert a timestamp to a timespec structure (nanosecond resolution).
    133    tv_nsec is always positive.
    134    Raise an exception and return -1 on error, return 0 on success. */
    135 PyAPI_FUNC(int) _PyTime_AsTimespec(_PyTime_t t, struct timespec *ts);
    136 #endif
    137 
    138 /* Get the current time from the system clock.
    139 
    140    The function cannot fail. _PyTime_Init() ensures that the system clock
    141    works. */
    142 PyAPI_FUNC(_PyTime_t) _PyTime_GetSystemClock(void);
    143 
    144 /* Get the time of a monotonic clock, i.e. a clock that cannot go backwards.
    145    The clock is not affected by system clock updates. The reference point of
    146    the returned value is undefined, so that only the difference between the
    147    results of consecutive calls is valid.
    148 
    149    The function cannot fail. _PyTime_Init() ensures that a monotonic clock
    150    is available and works. */
    151 PyAPI_FUNC(_PyTime_t) _PyTime_GetMonotonicClock(void);
    152 
    153 
    154 /* Structure used by time.get_clock_info() */
    155 typedef struct {
    156     const char *implementation;
    157     int monotonic;
    158     int adjustable;
    159     double resolution;
    160 } _Py_clock_info_t;
    161 
    162 /* Get the current time from the system clock.
    163  * Fill clock information if info is not NULL.
    164  * Raise an exception and return -1 on error, return 0 on success.
    165  */
    166 PyAPI_FUNC(int) _PyTime_GetSystemClockWithInfo(
    167     _PyTime_t *t,
    168     _Py_clock_info_t *info);
    169 
    170 /* Get the time of a monotonic clock, i.e. a clock that cannot go backwards.
    171    The clock is not affected by system clock updates. The reference point of
    172    the returned value is undefined, so that only the difference between the
    173    results of consecutive calls is valid.
    174 
    175    Fill info (if set) with information of the function used to get the time.
    176 
    177    Return 0 on success, raise an exception and return -1 on error. */
    178 PyAPI_FUNC(int) _PyTime_GetMonotonicClockWithInfo(
    179     _PyTime_t *t,
    180     _Py_clock_info_t *info);
    181 
    182 
    183 /* Initialize time.
    184    Return 0 on success, raise an exception and return -1 on error. */
    185 PyAPI_FUNC(int) _PyTime_Init(void);
    186 
    187 /* Converts a timestamp to the Gregorian time, using the local time zone.
    188    Return 0 on success, raise an exception and return -1 on error. */
    189 PyAPI_FUNC(int) _PyTime_localtime(time_t t, struct tm *tm);
    190 
    191 /* Converts a timestamp to the Gregorian time, assuming UTC.
    192    Return 0 on success, raise an exception and return -1 on error. */
    193 PyAPI_FUNC(int) _PyTime_gmtime(time_t t, struct tm *tm);
    194 
    195 #ifdef __cplusplus
    196 }
    197 #endif
    198 
    199 #endif /* Py_PYTIME_H */
    200 #endif /* Py_LIMITED_API */
    201