152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn/* 252c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * Copyright (C) 2005-2017 The Android Open Source Project 352c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * 452c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License"); 552c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * you may not use this file except in compliance with the License. 652c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * You may obtain a copy of the License at 752c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * 852c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * http://www.apache.org/licenses/LICENSE-2.0 952c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * 1052c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * Unless required by applicable law or agreed to in writing, software 1152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS, 1252c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1352c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * See the License for the specific language governing permissions and 1452c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * limitations under the License. 1552c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn */ 1652c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 1752c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#ifndef _LIBS_LOG_LOG_TIME_H 1852c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#define _LIBS_LOG_LOG_TIME_H 1952c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 2052c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#include <stdint.h> 2152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#include <time.h> 2252c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 2352c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn/* struct log_time is a wire-format variant of struct timespec */ 2452c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#define NS_PER_SEC 1000000000ULL 2552c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 2652c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#ifndef __struct_log_time_defined 2752c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#define __struct_log_time_defined 2852c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 2952c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#ifdef __cplusplus 3052c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 3152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn/* 3252c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * NB: we did NOT define a copy constructor. This will result in structure 3352c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * no longer being compatible with pass-by-value which is desired 3452c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn * efficient behavior. Also, pass-by-reference breaks C/C++ ABI. 3552c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn */ 3652c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzynstruct log_time { 372ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn public: 382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t tv_sec; /* good to Feb 5 2106 */ 392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t tv_nsec; 402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn 412ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn static const uint32_t tv_sec_max = 0xFFFFFFFFUL; 422ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn static const uint32_t tv_nsec_max = 999999999UL; 432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn 44219ef270a6907f4310bc1640ac404707c5a6ecc4Mark Salyzyn log_time(const timespec& T) 45219ef270a6907f4310bc1640ac404707c5a6ecc4Mark Salyzyn : tv_sec(static_cast<uint32_t>(T.tv_sec)), 46219ef270a6907f4310bc1640ac404707c5a6ecc4Mark Salyzyn tv_nsec(static_cast<uint32_t>(T.tv_nsec)) { 472ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 48219ef270a6907f4310bc1640ac404707c5a6ecc4Mark Salyzyn explicit log_time(uint32_t sec, uint32_t nsec = 0) 49219ef270a6907f4310bc1640ac404707c5a6ecc4Mark Salyzyn : tv_sec(sec), tv_nsec(nsec) { 502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 5152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ 5252c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#define __struct_log_time_private_defined 532ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn static const timespec EPOCH; 5452c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#endif 552ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time() { 562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 5752c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#ifdef __linux__ 58219ef270a6907f4310bc1640ac404707c5a6ecc4Mark Salyzyn explicit log_time(clockid_t id) { 592ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn timespec T; 602ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn clock_gettime(id, &T); 612ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn tv_sec = static_cast<uint32_t>(T.tv_sec); 622ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn tv_nsec = static_cast<uint32_t>(T.tv_nsec); 632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 6452c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#endif 65219ef270a6907f4310bc1640ac404707c5a6ecc4Mark Salyzyn explicit log_time(const char* T) { 662ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn const uint8_t* c = reinterpret_cast<const uint8_t*>(T); 672ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn tv_sec = c[0] | (static_cast<uint32_t>(c[1]) << 8) | 682ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (static_cast<uint32_t>(c[2]) << 16) | 692ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (static_cast<uint32_t>(c[3]) << 24); 702ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn tv_nsec = c[4] | (static_cast<uint32_t>(c[5]) << 8) | 712ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (static_cast<uint32_t>(c[6]) << 16) | 722ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (static_cast<uint32_t>(c[7]) << 24); 732ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 742ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn 752ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn /* timespec */ 762ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator==(const timespec& T) const { 772ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (tv_sec == static_cast<uint32_t>(T.tv_sec)) && 782ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (tv_nsec == static_cast<uint32_t>(T.tv_nsec)); 792ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator!=(const timespec& T) const { 812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this == T); 822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator<(const timespec& T) const { 842ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (tv_sec < static_cast<uint32_t>(T.tv_sec)) || 852ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ((tv_sec == static_cast<uint32_t>(T.tv_sec)) && 862ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (tv_nsec < static_cast<uint32_t>(T.tv_nsec))); 872ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 882ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator>=(const timespec& T) const { 892ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this < T); 902ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 912ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator>(const timespec& T) const { 922ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (tv_sec > static_cast<uint32_t>(T.tv_sec)) || 932ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ((tv_sec == static_cast<uint32_t>(T.tv_sec)) && 942ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn (tv_nsec > static_cast<uint32_t>(T.tv_nsec))); 952ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 962ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator<=(const timespec& T) const { 972ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this > T); 982ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 9952c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 10052c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ 1012ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time operator-=(const timespec& T); 1022ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time operator-(const timespec& T) const { 1032ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time local(*this); 1042ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return local -= T; 1052ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1062ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time operator+=(const timespec& T); 1072ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time operator+(const timespec& T) const { 1082ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time local(*this); 1092ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return local += T; 1102ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 11152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#endif 11252c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 1132ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn /* log_time */ 1142ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator==(const log_time& T) const { 1152ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (tv_sec == T.tv_sec) && (tv_nsec == T.tv_nsec); 1162ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1172ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator!=(const log_time& T) const { 1182ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this == T); 1192ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1202ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator<(const log_time& T) const { 1212ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (tv_sec < T.tv_sec) || 1222ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ((tv_sec == T.tv_sec) && (tv_nsec < T.tv_nsec)); 1232ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1242ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator>=(const log_time& T) const { 1252ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this < T); 1262ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1272ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator>(const log_time& T) const { 1282ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return (tv_sec > T.tv_sec) || 1292ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn ((tv_sec == T.tv_sec) && (tv_nsec > T.tv_nsec)); 1302ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1312ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn bool operator<=(const log_time& T) const { 1322ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return !(*this > T); 1332ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 13452c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 13552c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ 1362ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time operator-=(const log_time& T); 1372ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time operator-(const log_time& T) const { 1382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time local(*this); 1392ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return local -= T; 1402ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 1412ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time operator+=(const log_time& T); 1422ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time operator+(const log_time& T) const { 1432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn log_time local(*this); 1442ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return local += T; 1452ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 14652c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#endif 14752c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 1482ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint64_t nsec() const { 1492ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn return static_cast<uint64_t>(tv_sec) * NS_PER_SEC + tv_nsec; 1502ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn } 15152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 15252c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ 1532ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn static const char default_format[]; 15452c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 1552ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn /* Add %#q for the fraction of a second to the standard library functions */ 1562ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn char* strptime(const char* s, const char* format = default_format); 15752c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#endif 15852c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn} __attribute__((__packed__)); 15952c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 16052c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#else 16152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 16252c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyntypedef struct log_time { 1632ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t tv_sec; 1642ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn uint32_t tv_nsec; 16552c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn} __attribute__((__packed__)) log_time; 16652c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 16752c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#endif 16852c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 16952c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#endif 17052c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn 17152c140ca7216a2abdccd3eec2118bc3a87ded376Mark Salyzyn#endif /* _LIBS_LOG_LOG_TIME_H */ 172