• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
log_timelog_time44   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)
tv_seclog_time49       : 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
log_timelog_time55   log_time() {
56   }
57 #ifdef __linux__
log_timelog_time58   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
log_timelog_time65   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 
nseclog_time148   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