Home | History | Annotate | Download | only in log
      1 /*
      2  * Copyright (C) 2005-2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef _LIBS_LOG_LOG_TIME_H
     18 #define _LIBS_LOG_LOG_TIME_H
     19 
     20 #include <stdint.h>
     21 #include <time.h>
     22 
     23 /* struct log_time is a wire-format variant of struct timespec */
     24 #define NS_PER_SEC 1000000000ULL
     25 
     26 #ifndef __struct_log_time_defined
     27 #define __struct_log_time_defined
     28 
     29 #ifdef __cplusplus
     30 
     31 /*
     32  * NB: we did NOT define a copy constructor. This will result in structure
     33  * no longer being compatible with pass-by-value which is desired
     34  * efficient behavior. Also, pass-by-reference breaks C/C++ ABI.
     35  */
     36 struct log_time {
     37  public:
     38   uint32_t tv_sec; /* good to Feb 5 2106 */
     39   uint32_t tv_nsec;
     40 
     41   static const uint32_t tv_sec_max = 0xFFFFFFFFUL;
     42   static const uint32_t tv_nsec_max = 999999999UL;
     43 
     44   log_time(const timespec& T)
     45       : tv_sec(static_cast<uint32_t>(T.tv_sec)),
     46         tv_nsec(static_cast<uint32_t>(T.tv_nsec)) {
     47   }
     48   explicit log_time(uint32_t sec, uint32_t nsec = 0)
     49       : tv_sec(sec), tv_nsec(nsec) {
     50   }
     51 #ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_
     52 #define __struct_log_time_private_defined
     53   static const timespec EPOCH;
     54 #endif
     55   log_time() {
     56   }
     57 #ifdef __linux__
     58   explicit log_time(clockid_t id) {
     59     timespec T;
     60     clock_gettime(id, &T);
     61     tv_sec = static_cast<uint32_t>(T.tv_sec);
     62     tv_nsec = static_cast<uint32_t>(T.tv_nsec);
     63   }
     64 #endif
     65   explicit log_time(const char* T) {
     66     const uint8_t* c = reinterpret_cast<const uint8_t*>(T);
     67     tv_sec = c[0] | (static_cast<uint32_t>(c[1]) << 8) |
     68              (static_cast<uint32_t>(c[2]) << 16) |
     69              (static_cast<uint32_t>(c[3]) << 24);
     70     tv_nsec = c[4] | (static_cast<uint32_t>(c[5]) << 8) |
     71               (static_cast<uint32_t>(c[6]) << 16) |
     72               (static_cast<uint32_t>(c[7]) << 24);
     73   }
     74 
     75   /* timespec */
     76   bool operator==(const timespec& T) const {
     77     return (tv_sec == static_cast<uint32_t>(T.tv_sec)) &&
     78            (tv_nsec == static_cast<uint32_t>(T.tv_nsec));
     79   }
     80   bool operator!=(const timespec& T) const {
     81     return !(*this == T);
     82   }
     83   bool operator<(const timespec& T) const {
     84     return (tv_sec < static_cast<uint32_t>(T.tv_sec)) ||
     85            ((tv_sec == static_cast<uint32_t>(T.tv_sec)) &&
     86             (tv_nsec < static_cast<uint32_t>(T.tv_nsec)));
     87   }
     88   bool operator>=(const timespec& T) const {
     89     return !(*this < T);
     90   }
     91   bool operator>(const timespec& T) const {
     92     return (tv_sec > static_cast<uint32_t>(T.tv_sec)) ||
     93            ((tv_sec == static_cast<uint32_t>(T.tv_sec)) &&
     94             (tv_nsec > static_cast<uint32_t>(T.tv_nsec)));
     95   }
     96   bool operator<=(const timespec& T) const {
     97     return !(*this > T);
     98   }
     99 
    100 #ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_
    101   log_time operator-=(const timespec& T);
    102   log_time operator-(const timespec& T) const {
    103     log_time local(*this);
    104     return local -= T;
    105   }
    106   log_time operator+=(const timespec& T);
    107   log_time operator+(const timespec& T) const {
    108     log_time local(*this);
    109     return local += T;
    110   }
    111 #endif
    112 
    113   /* log_time */
    114   bool operator==(const log_time& T) const {
    115     return (tv_sec == T.tv_sec) && (tv_nsec == T.tv_nsec);
    116   }
    117   bool operator!=(const log_time& T) const {
    118     return !(*this == T);
    119   }
    120   bool operator<(const log_time& T) const {
    121     return (tv_sec < T.tv_sec) ||
    122            ((tv_sec == T.tv_sec) && (tv_nsec < T.tv_nsec));
    123   }
    124   bool operator>=(const log_time& T) const {
    125     return !(*this < T);
    126   }
    127   bool operator>(const log_time& T) const {
    128     return (tv_sec > T.tv_sec) ||
    129            ((tv_sec == T.tv_sec) && (tv_nsec > T.tv_nsec));
    130   }
    131   bool operator<=(const log_time& T) const {
    132     return !(*this > T);
    133   }
    134 
    135 #ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_
    136   log_time operator-=(const log_time& T);
    137   log_time operator-(const log_time& T) const {
    138     log_time local(*this);
    139     return local -= T;
    140   }
    141   log_time operator+=(const log_time& T);
    142   log_time operator+(const log_time& T) const {
    143     log_time local(*this);
    144     return local += T;
    145   }
    146 #endif
    147 
    148   uint64_t nsec() const {
    149     return static_cast<uint64_t>(tv_sec) * NS_PER_SEC + tv_nsec;
    150   }
    151 
    152 #ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_
    153   static const char default_format[];
    154 
    155   /* Add %#q for the fraction of a second to the standard library functions */
    156   char* strptime(const char* s, const char* format = default_format);
    157 #endif
    158 } __attribute__((__packed__));
    159 
    160 #else
    161 
    162 typedef struct log_time {
    163   uint32_t tv_sec;
    164   uint32_t tv_nsec;
    165 } __attribute__((__packed__)) log_time;
    166 
    167 #endif
    168 
    169 #endif
    170 
    171 #endif /* _LIBS_LOG_LOG_TIME_H */
    172