1*8d67ca89SAndroid Build Coastguard Worker /* 2*8d67ca89SAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project 3*8d67ca89SAndroid Build Coastguard Worker * All rights reserved. 4*8d67ca89SAndroid Build Coastguard Worker * 5*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 6*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 7*8d67ca89SAndroid Build Coastguard Worker * are met: 8*8d67ca89SAndroid Build Coastguard Worker * * Redistributions of source code must retain the above copyright 9*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 10*8d67ca89SAndroid Build Coastguard Worker * * Redistributions in binary form must reproduce the above copyright 11*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in 12*8d67ca89SAndroid Build Coastguard Worker * the documentation and/or other materials provided with the 13*8d67ca89SAndroid Build Coastguard Worker * distribution. 14*8d67ca89SAndroid Build Coastguard Worker * 15*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16*8d67ca89SAndroid Build Coastguard Worker * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17*8d67ca89SAndroid Build Coastguard Worker * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18*8d67ca89SAndroid Build Coastguard Worker * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19*8d67ca89SAndroid Build Coastguard Worker * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20*8d67ca89SAndroid Build Coastguard Worker * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21*8d67ca89SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22*8d67ca89SAndroid Build Coastguard Worker * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23*8d67ca89SAndroid Build Coastguard Worker * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24*8d67ca89SAndroid Build Coastguard Worker * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25*8d67ca89SAndroid Build Coastguard Worker * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*8d67ca89SAndroid Build Coastguard Worker * SUCH DAMAGE. 27*8d67ca89SAndroid Build Coastguard Worker */ 28*8d67ca89SAndroid Build Coastguard Worker 29*8d67ca89SAndroid Build Coastguard Worker #pragma once 30*8d67ca89SAndroid Build Coastguard Worker 31*8d67ca89SAndroid Build Coastguard Worker /** 32*8d67ca89SAndroid Build Coastguard Worker * @file time.h 33*8d67ca89SAndroid Build Coastguard Worker * @brief Clock and timer functionality. 34*8d67ca89SAndroid Build Coastguard Worker */ 35*8d67ca89SAndroid Build Coastguard Worker 36*8d67ca89SAndroid Build Coastguard Worker #include <sys/cdefs.h> 37*8d67ca89SAndroid Build Coastguard Worker #include <sys/time.h> 38*8d67ca89SAndroid Build Coastguard Worker #include <xlocale.h> 39*8d67ca89SAndroid Build Coastguard Worker 40*8d67ca89SAndroid Build Coastguard Worker __BEGIN_DECLS 41*8d67ca89SAndroid Build Coastguard Worker 42*8d67ca89SAndroid Build Coastguard Worker /* If we just use void* in the typedef, the compiler exposes that in error messages. */ 43*8d67ca89SAndroid Build Coastguard Worker struct __timezone_t; 44*8d67ca89SAndroid Build Coastguard Worker 45*8d67ca89SAndroid Build Coastguard Worker /** 46*8d67ca89SAndroid Build Coastguard Worker * The `timezone_t` type that represents a timezone. 47*8d67ca89SAndroid Build Coastguard Worker * 48*8d67ca89SAndroid Build Coastguard Worker * To use this with std::unique_ptr you'll want something like 49*8d67ca89SAndroid Build Coastguard Worker * `std::unique_ptr<std::remove_pointer_t<timezone_t>, decltype(&tzfree)> tz{tzalloc("Asia/Seoul"), tzfree};` 50*8d67ca89SAndroid Build Coastguard Worker * to remove the pointer. 51*8d67ca89SAndroid Build Coastguard Worker */ 52*8d67ca89SAndroid Build Coastguard Worker typedef struct __timezone_t* timezone_t; 53*8d67ca89SAndroid Build Coastguard Worker 54*8d67ca89SAndroid Build Coastguard Worker /** Divisor to compute seconds from the result of a call to clock(). */ 55*8d67ca89SAndroid Build Coastguard Worker #define CLOCKS_PER_SEC 1000000 56*8d67ca89SAndroid Build Coastguard Worker 57*8d67ca89SAndroid Build Coastguard Worker /** 58*8d67ca89SAndroid Build Coastguard Worker * The name of the current timezone's non-daylight savings (`tzname[0]`) and 59*8d67ca89SAndroid Build Coastguard Worker * daylight savings (`tzname[1]`) variants. See tzset(). 60*8d67ca89SAndroid Build Coastguard Worker */ 61*8d67ca89SAndroid Build Coastguard Worker extern char* _Nonnull tzname[]; 62*8d67ca89SAndroid Build Coastguard Worker 63*8d67ca89SAndroid Build Coastguard Worker /** Whether the current timezone ever uses daylight savings time. See tzset(). */ 64*8d67ca89SAndroid Build Coastguard Worker extern int daylight; 65*8d67ca89SAndroid Build Coastguard Worker 66*8d67ca89SAndroid Build Coastguard Worker /** The difference in seconds between UTC and the current timezone. See tzset(). */ 67*8d67ca89SAndroid Build Coastguard Worker extern long int timezone; 68*8d67ca89SAndroid Build Coastguard Worker 69*8d67ca89SAndroid Build Coastguard Worker struct sigevent; 70*8d67ca89SAndroid Build Coastguard Worker 71*8d67ca89SAndroid Build Coastguard Worker /** 72*8d67ca89SAndroid Build Coastguard Worker * A "broken-down" time, useful for parsing/formatting times for human consumption. 73*8d67ca89SAndroid Build Coastguard Worker */ 74*8d67ca89SAndroid Build Coastguard Worker struct tm { 75*8d67ca89SAndroid Build Coastguard Worker /** Seconds, 0-60. (60 is a leap second.) */ 76*8d67ca89SAndroid Build Coastguard Worker int tm_sec; 77*8d67ca89SAndroid Build Coastguard Worker /** Minutes, 0-59. */ 78*8d67ca89SAndroid Build Coastguard Worker int tm_min; 79*8d67ca89SAndroid Build Coastguard Worker /** Hours, 0-23. */ 80*8d67ca89SAndroid Build Coastguard Worker int tm_hour; 81*8d67ca89SAndroid Build Coastguard Worker /** Day of month, 1-31. */ 82*8d67ca89SAndroid Build Coastguard Worker int tm_mday; 83*8d67ca89SAndroid Build Coastguard Worker /** Month of year, 0-11. (Not 1-12!) */ 84*8d67ca89SAndroid Build Coastguard Worker int tm_mon; 85*8d67ca89SAndroid Build Coastguard Worker /** Years since 1900. (So 2023 is 123, not 2023!) */ 86*8d67ca89SAndroid Build Coastguard Worker int tm_year; 87*8d67ca89SAndroid Build Coastguard Worker /** Day of week, 0-6. (Sunday is 0, Saturday is 6.) */ 88*8d67ca89SAndroid Build Coastguard Worker int tm_wday; 89*8d67ca89SAndroid Build Coastguard Worker /** Day of year, 0-365. */ 90*8d67ca89SAndroid Build Coastguard Worker int tm_yday; 91*8d67ca89SAndroid Build Coastguard Worker /** Daylight savings flag, positive for DST in effect, 0 for DST not in effect, and -1 for unknown. */ 92*8d67ca89SAndroid Build Coastguard Worker int tm_isdst; 93*8d67ca89SAndroid Build Coastguard Worker /** Offset from UTC (GMT) in seconds for this time. */ 94*8d67ca89SAndroid Build Coastguard Worker long int tm_gmtoff; 95*8d67ca89SAndroid Build Coastguard Worker /** Name of the timezone for this time. */ 96*8d67ca89SAndroid Build Coastguard Worker const char* _Nullable tm_zone; 97*8d67ca89SAndroid Build Coastguard Worker }; 98*8d67ca89SAndroid Build Coastguard Worker 99*8d67ca89SAndroid Build Coastguard Worker /** Alternative name for `tm_zone` in `struct tm`. */ 100*8d67ca89SAndroid Build Coastguard Worker #define TM_ZONE tm_zone 101*8d67ca89SAndroid Build Coastguard Worker 102*8d67ca89SAndroid Build Coastguard Worker /** 103*8d67ca89SAndroid Build Coastguard Worker * [time(2)](https://man7.org/linux/man-pages/man2/time.2.html) returns 104*8d67ca89SAndroid Build Coastguard Worker * the number of seconds since the Unix epoch (1970-01-01 00:00:00 +0000). 105*8d67ca89SAndroid Build Coastguard Worker * 106*8d67ca89SAndroid Build Coastguard Worker * Returns the time in seconds on success, and returns -1 and sets `errno` on failure. 107*8d67ca89SAndroid Build Coastguard Worker */ 108*8d67ca89SAndroid Build Coastguard Worker time_t time(time_t* _Nullable __t); 109*8d67ca89SAndroid Build Coastguard Worker 110*8d67ca89SAndroid Build Coastguard Worker /** 111*8d67ca89SAndroid Build Coastguard Worker * [nanosleep(2)](https://man7.org/linux/man-pages/man2/nanosleep.2.html) sleeps 112*8d67ca89SAndroid Build Coastguard Worker * for at least the given time (or until a signal arrives). 113*8d67ca89SAndroid Build Coastguard Worker * 114*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and sets `errno` on failure. If the sleep 115*8d67ca89SAndroid Build Coastguard Worker * was interrupted by a signal, `errno` will be `EINTR` and `remainder` will be 116*8d67ca89SAndroid Build Coastguard Worker * the amount of time remaining. 117*8d67ca89SAndroid Build Coastguard Worker */ 118*8d67ca89SAndroid Build Coastguard Worker int nanosleep(const struct timespec* _Nonnull __duration, struct timespec* _Nullable __remainder); 119*8d67ca89SAndroid Build Coastguard Worker 120*8d67ca89SAndroid Build Coastguard Worker /** 121*8d67ca89SAndroid Build Coastguard Worker * [asctime(3)](https://man7.org/linux/man-pages/man3/asctime.3p.html) formats 122*8d67ca89SAndroid Build Coastguard Worker * the time `tm` as a string. 123*8d67ca89SAndroid Build Coastguard Worker * 124*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a string on success, and returns NULL on failure. 125*8d67ca89SAndroid Build Coastguard Worker * 126*8d67ca89SAndroid Build Coastguard Worker * That string will be overwritten by later calls to this function. 127*8d67ca89SAndroid Build Coastguard Worker * 128*8d67ca89SAndroid Build Coastguard Worker * New code should prefer strftime(). 129*8d67ca89SAndroid Build Coastguard Worker */ 130*8d67ca89SAndroid Build Coastguard Worker char* _Nullable asctime(const struct tm* _Nonnull __tm); 131*8d67ca89SAndroid Build Coastguard Worker 132*8d67ca89SAndroid Build Coastguard Worker /** 133*8d67ca89SAndroid Build Coastguard Worker * [asctime_r(3)](https://man7.org/linux/man-pages/man3/asctime_r.3p.html) formats 134*8d67ca89SAndroid Build Coastguard Worker * the time `tm` as a string in the given buffer `buf`. 135*8d67ca89SAndroid Build Coastguard Worker * 136*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a string on success, and returns NULL on failure. 137*8d67ca89SAndroid Build Coastguard Worker * 138*8d67ca89SAndroid Build Coastguard Worker * New code should prefer strftime(). 139*8d67ca89SAndroid Build Coastguard Worker */ 140*8d67ca89SAndroid Build Coastguard Worker char* _Nullable asctime_r(const struct tm* _Nonnull __tm, char* _Nonnull __buf); 141*8d67ca89SAndroid Build Coastguard Worker 142*8d67ca89SAndroid Build Coastguard Worker /** 143*8d67ca89SAndroid Build Coastguard Worker * [difftime(3)](https://man7.org/linux/man-pages/man3/difftime.3.html) returns 144*8d67ca89SAndroid Build Coastguard Worker * the difference between two times. 145*8d67ca89SAndroid Build Coastguard Worker * 146*8d67ca89SAndroid Build Coastguard Worker * Returns the difference in seconds. 147*8d67ca89SAndroid Build Coastguard Worker */ 148*8d67ca89SAndroid Build Coastguard Worker double difftime(time_t __lhs, time_t __rhs); 149*8d67ca89SAndroid Build Coastguard Worker 150*8d67ca89SAndroid Build Coastguard Worker /** 151*8d67ca89SAndroid Build Coastguard Worker * [mktime(3)](https://man7.org/linux/man-pages/man3/mktime.3p.html) converts 152*8d67ca89SAndroid Build Coastguard Worker * broken-down time `tm` into the number of seconds since the Unix epoch. 153*8d67ca89SAndroid Build Coastguard Worker * 154*8d67ca89SAndroid Build Coastguard Worker * See tzset() for details of how the timezone is set, and mktime_rz() 155*8d67ca89SAndroid Build Coastguard Worker * for an alternative. 156*8d67ca89SAndroid Build Coastguard Worker * 157*8d67ca89SAndroid Build Coastguard Worker * Returns the time in seconds on success, and returns -1 and sets `errno` on failure. 158*8d67ca89SAndroid Build Coastguard Worker */ 159*8d67ca89SAndroid Build Coastguard Worker time_t mktime(struct tm* _Nonnull __tm); 160*8d67ca89SAndroid Build Coastguard Worker 161*8d67ca89SAndroid Build Coastguard Worker /** 162*8d67ca89SAndroid Build Coastguard Worker * mktime_z(3) converts broken-down time `tm` into the number of seconds 163*8d67ca89SAndroid Build Coastguard Worker * since the Unix epoch, assuming the given timezone. 164*8d67ca89SAndroid Build Coastguard Worker * 165*8d67ca89SAndroid Build Coastguard Worker * Returns the time in seconds on success, and returns -1 and sets `errno` on failure. 166*8d67ca89SAndroid Build Coastguard Worker * 167*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35. 168*8d67ca89SAndroid Build Coastguard Worker */ 169*8d67ca89SAndroid Build Coastguard Worker 170*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35) 171*8d67ca89SAndroid Build Coastguard Worker time_t mktime_z(timezone_t _Nonnull __tz, struct tm* _Nonnull __tm) __INTRODUCED_IN(35); 172*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */ 173*8d67ca89SAndroid Build Coastguard Worker 174*8d67ca89SAndroid Build Coastguard Worker 175*8d67ca89SAndroid Build Coastguard Worker /** 176*8d67ca89SAndroid Build Coastguard Worker * [localtime(3)](https://man7.org/linux/man-pages/man3/localtime.3p.html) converts 177*8d67ca89SAndroid Build Coastguard Worker * the number of seconds since the Unix epoch in `t` to a broken-down time, taking 178*8d67ca89SAndroid Build Coastguard Worker * the device's timezone into account. 179*8d67ca89SAndroid Build Coastguard Worker * 180*8d67ca89SAndroid Build Coastguard Worker * That broken-down time will be overwritten by later calls to this function. 181*8d67ca89SAndroid Build Coastguard Worker * 182*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure. 183*8d67ca89SAndroid Build Coastguard Worker */ 184*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable localtime(const time_t* _Nonnull __t); 185*8d67ca89SAndroid Build Coastguard Worker 186*8d67ca89SAndroid Build Coastguard Worker /** 187*8d67ca89SAndroid Build Coastguard Worker * [localtime_r(3)](https://man7.org/linux/man-pages/man3/localtime_r.3p.html) converts 188*8d67ca89SAndroid Build Coastguard Worker * the number of seconds since the Unix epoch in `t` to a broken-down time. 189*8d67ca89SAndroid Build Coastguard Worker * That broken-down time will be written to the given struct `tm`. 190*8d67ca89SAndroid Build Coastguard Worker * 191*8d67ca89SAndroid Build Coastguard Worker * See tzset() for details of how the timezone is set, and localtime_rz() 192*8d67ca89SAndroid Build Coastguard Worker * for an alternative. 193*8d67ca89SAndroid Build Coastguard Worker * 194*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure. 195*8d67ca89SAndroid Build Coastguard Worker */ 196*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable localtime_r(const time_t* _Nonnull __t, struct tm* _Nonnull __tm); 197*8d67ca89SAndroid Build Coastguard Worker 198*8d67ca89SAndroid Build Coastguard Worker /** 199*8d67ca89SAndroid Build Coastguard Worker * localtime_rz(3) converts the number of seconds since the Unix epoch in 200*8d67ca89SAndroid Build Coastguard Worker * `t` to a broken-down time, assuming the given timezone. That broken-down 201*8d67ca89SAndroid Build Coastguard Worker * time will be written to the given struct `tm`. 202*8d67ca89SAndroid Build Coastguard Worker * 203*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure. 204*8d67ca89SAndroid Build Coastguard Worker * 205*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35. 206*8d67ca89SAndroid Build Coastguard Worker */ 207*8d67ca89SAndroid Build Coastguard Worker 208*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35) 209*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable localtime_rz(timezone_t _Nonnull __tz, const time_t* _Nonnull __t, struct tm* _Nonnull __tm) __INTRODUCED_IN(35); 210*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */ 211*8d67ca89SAndroid Build Coastguard Worker 212*8d67ca89SAndroid Build Coastguard Worker 213*8d67ca89SAndroid Build Coastguard Worker /** 214*8d67ca89SAndroid Build Coastguard Worker * Inverse of localtime(). 215*8d67ca89SAndroid Build Coastguard Worker */ 216*8d67ca89SAndroid Build Coastguard Worker time_t timelocal(struct tm* _Nonnull __tm); 217*8d67ca89SAndroid Build Coastguard Worker 218*8d67ca89SAndroid Build Coastguard Worker /** 219*8d67ca89SAndroid Build Coastguard Worker * [gmtime(3)](https://man7.org/linux/man-pages/man3/gmtime.3p.html) converts 220*8d67ca89SAndroid Build Coastguard Worker * the number of seconds since the Unix epoch in `t` to a broken-down time, using 221*8d67ca89SAndroid Build Coastguard Worker * UTC (historically also known as GMT). 222*8d67ca89SAndroid Build Coastguard Worker * 223*8d67ca89SAndroid Build Coastguard Worker * That broken-down time will be overwritten by later calls to this function. 224*8d67ca89SAndroid Build Coastguard Worker * 225*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure. 226*8d67ca89SAndroid Build Coastguard Worker */ 227*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable gmtime(const time_t* _Nonnull __t); 228*8d67ca89SAndroid Build Coastguard Worker 229*8d67ca89SAndroid Build Coastguard Worker /** 230*8d67ca89SAndroid Build Coastguard Worker * [gmtime_r(3)](https://man7.org/linux/man-pages/man3/gmtime_r.3p.html) converts 231*8d67ca89SAndroid Build Coastguard Worker * the number of seconds since the Unix epoch in `t` to a broken-down time, using 232*8d67ca89SAndroid Build Coastguard Worker * UTC (historically also known as GMT). 233*8d67ca89SAndroid Build Coastguard Worker * 234*8d67ca89SAndroid Build Coastguard Worker * That broken-down time will be written to the provided struct `tm`. 235*8d67ca89SAndroid Build Coastguard Worker * 236*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a broken-down time on success, and returns null and sets `errno` on failure. 237*8d67ca89SAndroid Build Coastguard Worker */ 238*8d67ca89SAndroid Build Coastguard Worker struct tm* _Nullable gmtime_r(const time_t* _Nonnull __t, struct tm* _Nonnull __tm); 239*8d67ca89SAndroid Build Coastguard Worker 240*8d67ca89SAndroid Build Coastguard Worker /** 241*8d67ca89SAndroid Build Coastguard Worker * Inverse of gmtime(). 242*8d67ca89SAndroid Build Coastguard Worker */ 243*8d67ca89SAndroid Build Coastguard Worker time_t timegm(struct tm* _Nonnull __tm); 244*8d67ca89SAndroid Build Coastguard Worker 245*8d67ca89SAndroid Build Coastguard Worker /** 246*8d67ca89SAndroid Build Coastguard Worker * [strptime(3)](https://man7.org/linux/man-pages/man3/strptime.3.html) parses 247*8d67ca89SAndroid Build Coastguard Worker * a string `s` assuming format `fmt` into broken-down time `tm`. 248*8d67ca89SAndroid Build Coastguard Worker * 249*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to the first character _not_ parsed, or null if no characters were parsed. 250*8d67ca89SAndroid Build Coastguard Worker */ 251*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strptime(const char* _Nonnull __s, const char* _Nonnull __fmt, struct tm* _Nonnull __tm) __strftimelike(2); 252*8d67ca89SAndroid Build Coastguard Worker 253*8d67ca89SAndroid Build Coastguard Worker /** 254*8d67ca89SAndroid Build Coastguard Worker * Equivalent to strptime() on Android where only C/POSIX locales are available. 255*8d67ca89SAndroid Build Coastguard Worker */ 256*8d67ca89SAndroid Build Coastguard Worker char* _Nullable strptime_l(const char* _Nonnull __s, const char* _Nonnull __fmt, struct tm* _Nonnull __tm, locale_t _Nonnull __l) __strftimelike(2) __RENAME(strptime); 257*8d67ca89SAndroid Build Coastguard Worker 258*8d67ca89SAndroid Build Coastguard Worker /** 259*8d67ca89SAndroid Build Coastguard Worker * [strftime(3)](https://man7.org/linux/man-pages/man3/strftime.3.html) formats 260*8d67ca89SAndroid Build Coastguard Worker * a broken-down time `tm` into the buffer `buf` using format `fmt`. 261*8d67ca89SAndroid Build Coastguard Worker * 262*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to the first character _not_ parsed, or null if no characters were parsed. 263*8d67ca89SAndroid Build Coastguard Worker */ 264*8d67ca89SAndroid Build Coastguard Worker size_t strftime(char* _Nonnull __buf, size_t __n, const char* _Nonnull __fmt, const struct tm* _Nullable __tm) __strftimelike(3); 265*8d67ca89SAndroid Build Coastguard Worker 266*8d67ca89SAndroid Build Coastguard Worker /** 267*8d67ca89SAndroid Build Coastguard Worker * Equivalent to strftime() on Android where only C/POSIX locales are available. 268*8d67ca89SAndroid Build Coastguard Worker */ 269*8d67ca89SAndroid Build Coastguard Worker size_t strftime_l(char* _Nonnull __buf, size_t __n, const char* _Nonnull __fmt, const struct tm* _Nullable __tm, locale_t _Nonnull __l) __strftimelike(3); 270*8d67ca89SAndroid Build Coastguard Worker 271*8d67ca89SAndroid Build Coastguard Worker /** 272*8d67ca89SAndroid Build Coastguard Worker * [ctime(3)](https://man7.org/linux/man-pages/man3/ctime.3p.html) formats 273*8d67ca89SAndroid Build Coastguard Worker * the time `tm` as a string. 274*8d67ca89SAndroid Build Coastguard Worker * 275*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a string on success, and returns NULL on failure. 276*8d67ca89SAndroid Build Coastguard Worker * 277*8d67ca89SAndroid Build Coastguard Worker * That string will be overwritten by later calls to this function. 278*8d67ca89SAndroid Build Coastguard Worker * 279*8d67ca89SAndroid Build Coastguard Worker * New code should prefer strftime(). 280*8d67ca89SAndroid Build Coastguard Worker */ 281*8d67ca89SAndroid Build Coastguard Worker char* _Nullable ctime(const time_t* _Nonnull __t); 282*8d67ca89SAndroid Build Coastguard Worker 283*8d67ca89SAndroid Build Coastguard Worker /** 284*8d67ca89SAndroid Build Coastguard Worker * [ctime_r(3)](https://man7.org/linux/man-pages/man3/ctime.3p.html) formats 285*8d67ca89SAndroid Build Coastguard Worker * the time `tm` as a string in the given buffer `buf`. 286*8d67ca89SAndroid Build Coastguard Worker * 287*8d67ca89SAndroid Build Coastguard Worker * Returns a pointer to a string on success, and returns NULL on failure. 288*8d67ca89SAndroid Build Coastguard Worker * 289*8d67ca89SAndroid Build Coastguard Worker * New code should prefer strftime(). 290*8d67ca89SAndroid Build Coastguard Worker */ 291*8d67ca89SAndroid Build Coastguard Worker char* _Nullable ctime_r(const time_t* _Nonnull __t, char* _Nonnull __buf); 292*8d67ca89SAndroid Build Coastguard Worker 293*8d67ca89SAndroid Build Coastguard Worker /** 294*8d67ca89SAndroid Build Coastguard Worker * [tzset(3)](https://man7.org/linux/man-pages/man3/tzset.3.html) tells 295*8d67ca89SAndroid Build Coastguard Worker * libc that the timezone has changed. 296*8d67ca89SAndroid Build Coastguard Worker * 297*8d67ca89SAndroid Build Coastguard Worker * tzset() on Android looks at both the system property 298*8d67ca89SAndroid Build Coastguard Worker * `persist.sys.timezone` and the environment variable `TZ`. The former is 299*8d67ca89SAndroid Build Coastguard Worker * the device's current timezone as shown in Settings, while the latter is 300*8d67ca89SAndroid Build Coastguard Worker * usually unset but can be used to override the global setting. This is a 301*8d67ca89SAndroid Build Coastguard Worker * bad idea outside of unit tests or single-threaded programs because it's 302*8d67ca89SAndroid Build Coastguard Worker * inherently thread-unsafe. See tzalloc(), localtime_rz(), mktime_z(), 303*8d67ca89SAndroid Build Coastguard Worker * and tzfree() for an alternative. 304*8d67ca89SAndroid Build Coastguard Worker */ 305*8d67ca89SAndroid Build Coastguard Worker void tzset(void); 306*8d67ca89SAndroid Build Coastguard Worker 307*8d67ca89SAndroid Build Coastguard Worker /** 308*8d67ca89SAndroid Build Coastguard Worker * tzalloc(3) allocates a timezone corresponding to the given Olson ID. 309*8d67ca89SAndroid Build Coastguard Worker * 310*8d67ca89SAndroid Build Coastguard Worker * A null `id` returns the system timezone (as seen in Settings) from 311*8d67ca89SAndroid Build Coastguard Worker * the system property `persist.sys.timezone`, ignoring `$TZ`. Although 312*8d67ca89SAndroid Build Coastguard Worker * tzset() honors `$TZ`, callers of tzalloc() can use `$TZ` themselves if 313*8d67ca89SAndroid Build Coastguard Worker * that's the (thread-unsafe) behavior they want, but by ignoring `$TZ` 314*8d67ca89SAndroid Build Coastguard Worker * tzalloc() is thread safe (though obviously the system timezone can 315*8d67ca89SAndroid Build Coastguard Worker * change, especially if your mobile device is actually mobile!). 316*8d67ca89SAndroid Build Coastguard Worker * 317*8d67ca89SAndroid Build Coastguard Worker * To use this with std::unique_ptr you'll want something like 318*8d67ca89SAndroid Build Coastguard Worker * `std::unique_ptr<std::remove_pointer_t<timezone_t>, decltype(&tzfree)> tz{tzalloc("Asia/Seoul"), tzfree};` 319*8d67ca89SAndroid Build Coastguard Worker * to remove the pointer. 320*8d67ca89SAndroid Build Coastguard Worker * 321*8d67ca89SAndroid Build Coastguard Worker * Returns a timezone object on success, and returns NULL and sets `errno` on failure. 322*8d67ca89SAndroid Build Coastguard Worker * 323*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35. 324*8d67ca89SAndroid Build Coastguard Worker */ 325*8d67ca89SAndroid Build Coastguard Worker 326*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35) 327*8d67ca89SAndroid Build Coastguard Worker timezone_t _Nullable tzalloc(const char* _Nullable __id) __INTRODUCED_IN(35); 328*8d67ca89SAndroid Build Coastguard Worker 329*8d67ca89SAndroid Build Coastguard Worker /** 330*8d67ca89SAndroid Build Coastguard Worker * tzfree(3) frees a timezone object returned by tzalloc(). 331*8d67ca89SAndroid Build Coastguard Worker * 332*8d67ca89SAndroid Build Coastguard Worker * To use this with std::unique_ptr you'll want something like 333*8d67ca89SAndroid Build Coastguard Worker * `std::unique_ptr<std::remove_pointer_t<timezone_t>, decltype(&tzfree)> tz{tzalloc("Asia/Seoul"), tzfree};` 334*8d67ca89SAndroid Build Coastguard Worker * to remove the pointer. 335*8d67ca89SAndroid Build Coastguard Worker * 336*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35. 337*8d67ca89SAndroid Build Coastguard Worker */ 338*8d67ca89SAndroid Build Coastguard Worker void tzfree(timezone_t _Nullable __tz) __INTRODUCED_IN(35); 339*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */ 340*8d67ca89SAndroid Build Coastguard Worker 341*8d67ca89SAndroid Build Coastguard Worker 342*8d67ca89SAndroid Build Coastguard Worker /** 343*8d67ca89SAndroid Build Coastguard Worker * [clock(3)](https://man7.org/linux/man-pages/man3/clock.3.html) 344*8d67ca89SAndroid Build Coastguard Worker * returns an approximation of CPU time used, equivalent to 345*8d67ca89SAndroid Build Coastguard Worker * `clock_gettime(CLOCK_PROCESS_CPUTIME_ID)` but with more confusing 346*8d67ca89SAndroid Build Coastguard Worker * units. Use `CLOCKS_PER_SEC` to convert the result to seconds. 347*8d67ca89SAndroid Build Coastguard Worker * 348*8d67ca89SAndroid Build Coastguard Worker * Returns the time in seconds on success, and returns -1 and sets `errno` on failure. 349*8d67ca89SAndroid Build Coastguard Worker * 350*8d67ca89SAndroid Build Coastguard Worker * New code should prefer `clock_gettime(CLOCK_PROCESS_CPUTIME_ID)`. 351*8d67ca89SAndroid Build Coastguard Worker */ 352*8d67ca89SAndroid Build Coastguard Worker clock_t clock(void); 353*8d67ca89SAndroid Build Coastguard Worker 354*8d67ca89SAndroid Build Coastguard Worker /** 355*8d67ca89SAndroid Build Coastguard Worker * [clock_getcpuclockid(3)](https://man7.org/linux/man-pages/man3/clock_getcpuclockid.3.html) 356*8d67ca89SAndroid Build Coastguard Worker * gets the clock ID of the cpu-time clock for the given `pid`. 357*8d67ca89SAndroid Build Coastguard Worker * 358*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and returns an error number on failure. 359*8d67ca89SAndroid Build Coastguard Worker */ 360*8d67ca89SAndroid Build Coastguard Worker 361*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(23) 362*8d67ca89SAndroid Build Coastguard Worker int clock_getcpuclockid(pid_t __pid, clockid_t* _Nonnull __clock) __INTRODUCED_IN(23); 363*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(23) */ 364*8d67ca89SAndroid Build Coastguard Worker 365*8d67ca89SAndroid Build Coastguard Worker 366*8d67ca89SAndroid Build Coastguard Worker /** 367*8d67ca89SAndroid Build Coastguard Worker * [clock_getres(2)](https://man7.org/linux/man-pages/man2/clock_getres.2.html) 368*8d67ca89SAndroid Build Coastguard Worker * gets the resolution of the given clock. 369*8d67ca89SAndroid Build Coastguard Worker * 370*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and returns an error number on failure. 371*8d67ca89SAndroid Build Coastguard Worker */ 372*8d67ca89SAndroid Build Coastguard Worker int clock_getres(clockid_t __clock, struct timespec* _Nullable __resolution); 373*8d67ca89SAndroid Build Coastguard Worker 374*8d67ca89SAndroid Build Coastguard Worker /** 375*8d67ca89SAndroid Build Coastguard Worker * [clock_gettime(2)](https://man7.org/linux/man-pages/man2/clock_gettime.2.html) 376*8d67ca89SAndroid Build Coastguard Worker * gets the time according to the given clock. 377*8d67ca89SAndroid Build Coastguard Worker * 378*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and returns an error number on failure. 379*8d67ca89SAndroid Build Coastguard Worker */ 380*8d67ca89SAndroid Build Coastguard Worker int clock_gettime(clockid_t __clock, struct timespec* _Nonnull __ts); 381*8d67ca89SAndroid Build Coastguard Worker 382*8d67ca89SAndroid Build Coastguard Worker /** 383*8d67ca89SAndroid Build Coastguard Worker * [clock_nanosleep(2)](https://man7.org/linux/man-pages/man2/clock_nanosleep.2.html) 384*8d67ca89SAndroid Build Coastguard Worker * sleeps for the given time (or until the given time if the TIMER_ABSTIME flag 385*8d67ca89SAndroid Build Coastguard Worker * is used), as measured by the given clock. 386*8d67ca89SAndroid Build Coastguard Worker * 387*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and returns an error number on failure. 388*8d67ca89SAndroid Build Coastguard Worker * If the sleep was interrupted by a signal, the return value will be `EINTR` 389*8d67ca89SAndroid Build Coastguard Worker * and `remainder` will be the amount of time remaining. 390*8d67ca89SAndroid Build Coastguard Worker */ 391*8d67ca89SAndroid Build Coastguard Worker int clock_nanosleep(clockid_t __clock, int __flags, const struct timespec* _Nonnull __time, struct timespec* _Nullable __remainder); 392*8d67ca89SAndroid Build Coastguard Worker 393*8d67ca89SAndroid Build Coastguard Worker /** 394*8d67ca89SAndroid Build Coastguard Worker * [clock_settime(2)](https://man7.org/linux/man-pages/man2/clock_settime.2.html) 395*8d67ca89SAndroid Build Coastguard Worker * sets the time for the given clock. 396*8d67ca89SAndroid Build Coastguard Worker * 397*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and returns an error number on failure. 398*8d67ca89SAndroid Build Coastguard Worker */ 399*8d67ca89SAndroid Build Coastguard Worker int clock_settime(clockid_t __clock, const struct timespec* _Nonnull __ts); 400*8d67ca89SAndroid Build Coastguard Worker 401*8d67ca89SAndroid Build Coastguard Worker /** 402*8d67ca89SAndroid Build Coastguard Worker * [timer_create(2)](https://man7.org/linux/man-pages/man2/timer_create.2.html) 403*8d67ca89SAndroid Build Coastguard Worker * creates a POSIX timer. 404*8d67ca89SAndroid Build Coastguard Worker * 405*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and sets `errno` on failure. 406*8d67ca89SAndroid Build Coastguard Worker */ 407*8d67ca89SAndroid Build Coastguard Worker int timer_create(clockid_t __clock, struct sigevent* _Nullable __event, timer_t _Nonnull * _Nonnull __timer_ptr); 408*8d67ca89SAndroid Build Coastguard Worker 409*8d67ca89SAndroid Build Coastguard Worker /** 410*8d67ca89SAndroid Build Coastguard Worker * [timer_delete(2)](https://man7.org/linux/man-pages/man2/timer_delete.2.html) 411*8d67ca89SAndroid Build Coastguard Worker * destroys a POSIX timer. 412*8d67ca89SAndroid Build Coastguard Worker * 413*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and sets `errno` on failure. 414*8d67ca89SAndroid Build Coastguard Worker */ 415*8d67ca89SAndroid Build Coastguard Worker int timer_delete(timer_t _Nonnull __timer); 416*8d67ca89SAndroid Build Coastguard Worker 417*8d67ca89SAndroid Build Coastguard Worker /** 418*8d67ca89SAndroid Build Coastguard Worker * [timer_settime(2)](https://man7.org/linux/man-pages/man2/timer_settime.2.html) 419*8d67ca89SAndroid Build Coastguard Worker * starts or stops a POSIX timer. 420*8d67ca89SAndroid Build Coastguard Worker * 421*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and sets `errno` on failure. 422*8d67ca89SAndroid Build Coastguard Worker */ 423*8d67ca89SAndroid Build Coastguard Worker int timer_settime(timer_t _Nonnull __timer, int __flags, const struct itimerspec* _Nonnull __new_value, struct itimerspec* _Nullable __old_value); 424*8d67ca89SAndroid Build Coastguard Worker 425*8d67ca89SAndroid Build Coastguard Worker /** 426*8d67ca89SAndroid Build Coastguard Worker * [timer_gettime(2)](https://man7.org/linux/man-pages/man2/timer_gettime.2.html) 427*8d67ca89SAndroid Build Coastguard Worker * gets the time until the given timer next fires. 428*8d67ca89SAndroid Build Coastguard Worker * 429*8d67ca89SAndroid Build Coastguard Worker * Returns 0 on success, and returns -1 and sets `errno` on failure. 430*8d67ca89SAndroid Build Coastguard Worker */ 431*8d67ca89SAndroid Build Coastguard Worker int timer_gettime(timer_t _Nonnull _timer, struct itimerspec* _Nonnull __ts); 432*8d67ca89SAndroid Build Coastguard Worker 433*8d67ca89SAndroid Build Coastguard Worker /** 434*8d67ca89SAndroid Build Coastguard Worker * [timer_getoverrun(2)](https://man7.org/linux/man-pages/man2/timer_getoverrun.2.html) 435*8d67ca89SAndroid Build Coastguard Worker * gets the overrun count (the number of times the timer should have fired, but 436*8d67ca89SAndroid Build Coastguard Worker * didn't) for the last time the timer fired. 437*8d67ca89SAndroid Build Coastguard Worker * 438*8d67ca89SAndroid Build Coastguard Worker * Returns the overrun count on success, and returns -1 and sets `errno` on failure. 439*8d67ca89SAndroid Build Coastguard Worker */ 440*8d67ca89SAndroid Build Coastguard Worker int timer_getoverrun(timer_t _Nonnull __timer); 441*8d67ca89SAndroid Build Coastguard Worker 442*8d67ca89SAndroid Build Coastguard Worker /** 443*8d67ca89SAndroid Build Coastguard Worker * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_REALTIME. 444*8d67ca89SAndroid Build Coastguard Worker * 445*8d67ca89SAndroid Build Coastguard Worker * Available since API level 29. 446*8d67ca89SAndroid Build Coastguard Worker */ 447*8d67ca89SAndroid Build Coastguard Worker #define TIME_UTC (CLOCK_REALTIME+1) 448*8d67ca89SAndroid Build Coastguard Worker 449*8d67ca89SAndroid Build Coastguard Worker /** 450*8d67ca89SAndroid Build Coastguard Worker * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_MONOTONIC. 451*8d67ca89SAndroid Build Coastguard Worker * 452*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35. 453*8d67ca89SAndroid Build Coastguard Worker */ 454*8d67ca89SAndroid Build Coastguard Worker #define TIME_MONOTONIC (CLOCK_MONOTONIC+1) 455*8d67ca89SAndroid Build Coastguard Worker 456*8d67ca89SAndroid Build Coastguard Worker /** 457*8d67ca89SAndroid Build Coastguard Worker * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_PROCESS_CPUTIME_ID. 458*8d67ca89SAndroid Build Coastguard Worker * 459*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35. 460*8d67ca89SAndroid Build Coastguard Worker */ 461*8d67ca89SAndroid Build Coastguard Worker #define TIME_ACTIVE (CLOCK_PROCESS_CPUTIME_ID+1) 462*8d67ca89SAndroid Build Coastguard Worker 463*8d67ca89SAndroid Build Coastguard Worker /** 464*8d67ca89SAndroid Build Coastguard Worker * The timebase for timespec_get() and timespec_getres() corresponding to CLOCK_THREAD_CPUTIME_ID. 465*8d67ca89SAndroid Build Coastguard Worker * 466*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35. 467*8d67ca89SAndroid Build Coastguard Worker */ 468*8d67ca89SAndroid Build Coastguard Worker #define TIME_THREAD_ACTIVE (CLOCK_THREAD_CPUTIME_ID+1) 469*8d67ca89SAndroid Build Coastguard Worker 470*8d67ca89SAndroid Build Coastguard Worker /** 471*8d67ca89SAndroid Build Coastguard Worker * timespec_get(3) is equivalent to clock_gettime() for the clock corresponding to the given base. 472*8d67ca89SAndroid Build Coastguard Worker * 473*8d67ca89SAndroid Build Coastguard Worker * Returns the base on success and returns 0 on failure. 474*8d67ca89SAndroid Build Coastguard Worker * 475*8d67ca89SAndroid Build Coastguard Worker * Available since API level 29 for TIME_UTC; other bases arrived later. 476*8d67ca89SAndroid Build Coastguard Worker * Code for Android should prefer clock_gettime(). 477*8d67ca89SAndroid Build Coastguard Worker */ 478*8d67ca89SAndroid Build Coastguard Worker 479*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(29) 480*8d67ca89SAndroid Build Coastguard Worker int timespec_get(struct timespec* _Nonnull __ts, int __base) __INTRODUCED_IN(29); 481*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(29) */ 482*8d67ca89SAndroid Build Coastguard Worker 483*8d67ca89SAndroid Build Coastguard Worker 484*8d67ca89SAndroid Build Coastguard Worker /** 485*8d67ca89SAndroid Build Coastguard Worker * timespec_getres(3) is equivalent to clock_getres() for the clock corresponding to the given base. 486*8d67ca89SAndroid Build Coastguard Worker * 487*8d67ca89SAndroid Build Coastguard Worker * Returns the base on success and returns 0 on failure. 488*8d67ca89SAndroid Build Coastguard Worker * 489*8d67ca89SAndroid Build Coastguard Worker * Available since API level 35. 490*8d67ca89SAndroid Build Coastguard Worker * Code for Android should prefer clock_gettime(). 491*8d67ca89SAndroid Build Coastguard Worker */ 492*8d67ca89SAndroid Build Coastguard Worker 493*8d67ca89SAndroid Build Coastguard Worker #if __BIONIC_AVAILABILITY_GUARD(35) 494*8d67ca89SAndroid Build Coastguard Worker int timespec_getres(struct timespec* _Nonnull __ts, int __base) __INTRODUCED_IN(35); 495*8d67ca89SAndroid Build Coastguard Worker #endif /* __BIONIC_AVAILABILITY_GUARD(35) */ 496*8d67ca89SAndroid Build Coastguard Worker 497*8d67ca89SAndroid Build Coastguard Worker 498*8d67ca89SAndroid Build Coastguard Worker __END_DECLS 499