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