xref: /llvm-project/libc/include/llvm-libc-macros/linux/sys-time-macros.h (revision 330793c91d08e6ac60334e4813746db898b9407e)
135a4fe4cSMichael Jones //===-- Definition of macros from sys/time.h ------------------------------===//
235a4fe4cSMichael Jones //
335a4fe4cSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
435a4fe4cSMichael Jones // See https://llvm.org/LICENSE.txt for license information.
535a4fe4cSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
635a4fe4cSMichael Jones //
735a4fe4cSMichael Jones //===----------------------------------------------------------------------===//
835a4fe4cSMichael Jones 
9*330793c9SNick Desaulniers #ifndef LLVM_LIBC_MACROS_LINUX_SYS_TIME_MACROS_H
10*330793c9SNick Desaulniers #define LLVM_LIBC_MACROS_LINUX_SYS_TIME_MACROS_H
1135a4fe4cSMichael Jones 
1235a4fe4cSMichael Jones // Add two timevals and put the result in timeval_ptr_result. If the resulting
1335a4fe4cSMichael Jones // usec value is greater than 999,999 then the microseconds are turned into full
1435a4fe4cSMichael Jones // seconds (1,000,000 is subtracted from usec and 1 is added to sec).
1535a4fe4cSMichael Jones #define timeradd(timeval_ptr_a, timeval_ptr_b, timeval_ptr_result)             \
1635a4fe4cSMichael Jones   (timeval_ptr_result)->tv_sec =                                               \
1735a4fe4cSMichael Jones       (timeval_ptr_a)->tv_sec + (timeval_ptr_b)->tv_sec +                      \
1835a4fe4cSMichael Jones       (((timeval_ptr_a)->tv_usec + (timeval_ptr_b)->tv_usec) >= 1000000 ? 1    \
1935a4fe4cSMichael Jones                                                                         : 0);  \
2035a4fe4cSMichael Jones   (timeval_ptr_result)->tv_usec =                                              \
2135a4fe4cSMichael Jones       (timeval_ptr_a)->tv_usec + (timeval_ptr_b)->tv_usec -                    \
2235a4fe4cSMichael Jones       (((timeval_ptr_a)->tv_usec + (timeval_ptr_b)->tv_usec) >= 1000000        \
2335a4fe4cSMichael Jones            ? 1000000                                                           \
2435a4fe4cSMichael Jones            : 0);
2535a4fe4cSMichael Jones 
2635a4fe4cSMichael Jones // Subtract two timevals and put the result in timeval_ptr_result. If the
2735a4fe4cSMichael Jones // resulting usec value is less than 0 then 1,000,000 is added to usec and 1 is
2835a4fe4cSMichael Jones // subtracted from sec.
2935a4fe4cSMichael Jones #define timersub(timeval_ptr_a, timeval_ptr_b, timeval_ptr_result)             \
3035a4fe4cSMichael Jones   (timeval_ptr_result)->tv_sec =                                               \
3135a4fe4cSMichael Jones       (timeval_ptr_a)->tv_sec - (timeval_ptr_b)->tv_sec -                      \
3235a4fe4cSMichael Jones       (((timeval_ptr_a)->tv_usec - (timeval_ptr_b)->tv_usec) < 0 ? 1 : 0);     \
3335a4fe4cSMichael Jones   (timeval_ptr_result)->tv_usec =                                              \
3435a4fe4cSMichael Jones       (timeval_ptr_a)->tv_usec - (timeval_ptr_b)->tv_usec +                    \
3535a4fe4cSMichael Jones       (((timeval_ptr_a)->tv_usec - (timeval_ptr_b)->tv_usec) < 0 ? 1000000     \
3635a4fe4cSMichael Jones                                                                  : 0);
3735a4fe4cSMichael Jones 
3835a4fe4cSMichael Jones // Reset a timeval to the epoch.
3935a4fe4cSMichael Jones #define timerclear(timeval_ptr)                                                \
4035a4fe4cSMichael Jones   (timeval_ptr)->tv_sec = 0;                                                   \
4135a4fe4cSMichael Jones   (timeval_ptr)->tv_usec = 0;
4235a4fe4cSMichael Jones 
4335a4fe4cSMichael Jones // Determine if a timeval is set to the epoch.
4435a4fe4cSMichael Jones #define timerisset(timeval_ptr)                                                \
4535a4fe4cSMichael Jones   (timeval_ptr)->tv_sec != 0 || (timeval_ptr)->tv_usec != 0;
4635a4fe4cSMichael Jones 
4735a4fe4cSMichael Jones // Compare two timevals using CMP.
4835a4fe4cSMichael Jones #define timercmp(timeval_ptr_a, timeval_ptr_b, CMP)                            \
4935a4fe4cSMichael Jones   (((timeval_ptr_a)->tv_sec == (timeval_ptr_b)->tv_sec)                        \
5035a4fe4cSMichael Jones        ? ((timeval_ptr_a)->tv_usec CMP(timeval_ptr_b)->tv_usec)                \
5135a4fe4cSMichael Jones        : ((timeval_ptr_a)->tv_sec CMP(timeval_ptr_b)->tv_sec))
5235a4fe4cSMichael Jones 
53*330793c9SNick Desaulniers #endif // LLVM_LIBC_MACROS_LINUX_SYS_TIME_MACROS_H
54