diff options
author | Mark Salyzyn <salyzyn@google.com> | 2017-01-25 08:16:33 -0800 |
---|---|---|
committer | Mark Salyzyn <salyzyn@google.com> | 2017-01-25 15:41:43 -0800 |
commit | 52c140ca7216a2abdccd3eec2118bc3a87ded376 (patch) | |
tree | 8d91af0dc13eec6619f333ddc55d9fd363a423ab /liblog | |
parent | dd61659e73e71d025979ba0001be0a81ea0e9711 (diff) | |
download | core-52c140ca7216a2abdccd3eec2118bc3a87ded376.tar.gz core-52c140ca7216a2abdccd3eec2118bc3a87ded376.tar.bz2 core-52c140ca7216a2abdccd3eec2118bc3a87ded376.zip |
liblog: add log/log_time.h
Move log_time definitions to their own home.
struct log_time
Test: gTest liblog-unit-tests --gtest_filter=liblog.log_time
Bug: 34250038
Change-Id: I400cf4cc865d1c167699a4654ecb69455a18e604
Diffstat (limited to 'liblog')
-rw-r--r-- | liblog/include/log/log.h | 172 | ||||
-rw-r--r-- | liblog/include/log/log_time.h | 196 | ||||
-rw-r--r-- | liblog/tests/Android.mk | 3 | ||||
-rw-r--r-- | liblog/tests/log_time_test.cpp | 43 |
4 files changed, 242 insertions, 172 deletions
diff --git a/liblog/include/log/log.h b/liblog/include/log/log.h index 36c1e682e..9192a709e 100644 --- a/liblog/include/log/log.h +++ b/liblog/include/log/log.h @@ -32,6 +32,7 @@ #include <log/log_main.h> #include <log/log_radio.h> #include <log/log_system.h> +#include <log/log_time.h> #include <log/uio.h> /* helper to define iovec for portability */ #ifdef __cplusplus @@ -230,177 +231,6 @@ struct logger_entry_v4 { }; #endif -/* struct log_time is a wire-format variant of struct timespec */ -#define NS_PER_SEC 1000000000ULL - -#ifndef __struct_log_time_defined -#define __struct_log_time_defined -#ifdef __cplusplus - -/* - * NB: we did NOT define a copy constructor. This will result in structure - * no longer being compatible with pass-by-value which is desired - * efficient behavior. Also, pass-by-reference breaks C/C++ ABI. - */ -struct log_time { -public: - uint32_t tv_sec; /* good to Feb 5 2106 */ - uint32_t tv_nsec; - - static const uint32_t tv_sec_max = 0xFFFFFFFFUL; - static const uint32_t tv_nsec_max = 999999999UL; - - log_time(const timespec& T) - { - tv_sec = static_cast<uint32_t>(T.tv_sec); - tv_nsec = static_cast<uint32_t>(T.tv_nsec); - } - log_time(uint32_t sec, uint32_t nsec) - { - tv_sec = sec; - tv_nsec = nsec; - } -#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ -#define __struct_log_time_private_defined - static const timespec EPOCH; -#endif - log_time() - { - } -#ifdef __linux__ - log_time(clockid_t id) - { - timespec T; - clock_gettime(id, &T); - tv_sec = static_cast<uint32_t>(T.tv_sec); - tv_nsec = static_cast<uint32_t>(T.tv_nsec); - } -#endif - log_time(const char* T) - { - const uint8_t* c = reinterpret_cast<const uint8_t*>(T); - tv_sec = c[0] | - (static_cast<uint32_t>(c[1]) << 8) | - (static_cast<uint32_t>(c[2]) << 16) | - (static_cast<uint32_t>(c[3]) << 24); - tv_nsec = c[4] | - (static_cast<uint32_t>(c[5]) << 8) | - (static_cast<uint32_t>(c[6]) << 16) | - (static_cast<uint32_t>(c[7]) << 24); - } - - /* timespec */ - bool operator== (const timespec& T) const - { - return (tv_sec == static_cast<uint32_t>(T.tv_sec)) - && (tv_nsec == static_cast<uint32_t>(T.tv_nsec)); - } - bool operator!= (const timespec& T) const - { - return !(*this == T); - } - bool operator< (const timespec& T) const - { - return (tv_sec < static_cast<uint32_t>(T.tv_sec)) - || ((tv_sec == static_cast<uint32_t>(T.tv_sec)) - && (tv_nsec < static_cast<uint32_t>(T.tv_nsec))); - } - bool operator>= (const timespec& T) const - { - return !(*this < T); - } - bool operator> (const timespec& T) const - { - return (tv_sec > static_cast<uint32_t>(T.tv_sec)) - || ((tv_sec == static_cast<uint32_t>(T.tv_sec)) - && (tv_nsec > static_cast<uint32_t>(T.tv_nsec))); - } - bool operator<= (const timespec& T) const - { - return !(*this > T); - } - -#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ - log_time operator-= (const timespec& T); - log_time operator- (const timespec& T) const - { - log_time local(*this); - return local -= T; - } - log_time operator+= (const timespec& T); - log_time operator+ (const timespec& T) const - { - log_time local(*this); - return local += T; - } -#endif - - /* log_time */ - bool operator== (const log_time& T) const - { - return (tv_sec == T.tv_sec) && (tv_nsec == T.tv_nsec); - } - bool operator!= (const log_time& T) const - { - return !(*this == T); - } - bool operator< (const log_time& T) const - { - return (tv_sec < T.tv_sec) - || ((tv_sec == T.tv_sec) && (tv_nsec < T.tv_nsec)); - } - bool operator>= (const log_time& T) const - { - return !(*this < T); - } - bool operator> (const log_time& T) const - { - return (tv_sec > T.tv_sec) - || ((tv_sec == T.tv_sec) && (tv_nsec > T.tv_nsec)); - } - bool operator<= (const log_time& T) const - { - return !(*this > T); - } - -#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ - log_time operator-= (const log_time& T); - log_time operator- (const log_time& T) const - { - log_time local(*this); - return local -= T; - } - log_time operator+= (const log_time& T); - log_time operator+ (const log_time& T) const - { - log_time local(*this); - return local += T; - } -#endif - - uint64_t nsec() const - { - return static_cast<uint64_t>(tv_sec) * NS_PER_SEC + tv_nsec; - } - -#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ - static const char default_format[]; - - /* Add %#q for the fraction of a second to the standard library functions */ - char* strptime(const char* s, const char* format = default_format); -#endif -} __attribute__((__packed__)); - -#else - -typedef struct log_time { - uint32_t tv_sec; - uint32_t tv_nsec; -} __attribute__((__packed__)) log_time; - -#endif -#endif - /* * The maximum size of the log entry payload that can be * written to the logger. An attempt to write more than diff --git a/liblog/include/log/log_time.h b/liblog/include/log/log_time.h new file mode 100644 index 000000000..900dc1b94 --- /dev/null +++ b/liblog/include/log/log_time.h @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2005-2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _LIBS_LOG_LOG_TIME_H +#define _LIBS_LOG_LOG_TIME_H + +#include <stdint.h> +#include <time.h> + +/* struct log_time is a wire-format variant of struct timespec */ +#define NS_PER_SEC 1000000000ULL + +#ifndef __struct_log_time_defined +#define __struct_log_time_defined + +#ifdef __cplusplus + +/* + * NB: we did NOT define a copy constructor. This will result in structure + * no longer being compatible with pass-by-value which is desired + * efficient behavior. Also, pass-by-reference breaks C/C++ ABI. + */ +struct log_time { +public: + uint32_t tv_sec; /* good to Feb 5 2106 */ + uint32_t tv_nsec; + + static const uint32_t tv_sec_max = 0xFFFFFFFFUL; + static const uint32_t tv_nsec_max = 999999999UL; + + log_time(const timespec& T) + { + tv_sec = static_cast<uint32_t>(T.tv_sec); + tv_nsec = static_cast<uint32_t>(T.tv_nsec); + } + log_time(uint32_t sec, uint32_t nsec) + { + tv_sec = sec; + tv_nsec = nsec; + } +#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ +#define __struct_log_time_private_defined + static const timespec EPOCH; +#endif + log_time() + { + } +#ifdef __linux__ + log_time(clockid_t id) + { + timespec T; + clock_gettime(id, &T); + tv_sec = static_cast<uint32_t>(T.tv_sec); + tv_nsec = static_cast<uint32_t>(T.tv_nsec); + } +#endif + log_time(const char* T) + { + const uint8_t* c = reinterpret_cast<const uint8_t*>(T); + tv_sec = c[0] | + (static_cast<uint32_t>(c[1]) << 8) | + (static_cast<uint32_t>(c[2]) << 16) | + (static_cast<uint32_t>(c[3]) << 24); + tv_nsec = c[4] | + (static_cast<uint32_t>(c[5]) << 8) | + (static_cast<uint32_t>(c[6]) << 16) | + (static_cast<uint32_t>(c[7]) << 24); + } + + /* timespec */ + bool operator== (const timespec& T) const + { + return (tv_sec == static_cast<uint32_t>(T.tv_sec)) + && (tv_nsec == static_cast<uint32_t>(T.tv_nsec)); + } + bool operator!= (const timespec& T) const + { + return !(*this == T); + } + bool operator< (const timespec& T) const + { + return (tv_sec < static_cast<uint32_t>(T.tv_sec)) + || ((tv_sec == static_cast<uint32_t>(T.tv_sec)) + && (tv_nsec < static_cast<uint32_t>(T.tv_nsec))); + } + bool operator>= (const timespec& T) const + { + return !(*this < T); + } + bool operator> (const timespec& T) const + { + return (tv_sec > static_cast<uint32_t>(T.tv_sec)) + || ((tv_sec == static_cast<uint32_t>(T.tv_sec)) + && (tv_nsec > static_cast<uint32_t>(T.tv_nsec))); + } + bool operator<= (const timespec& T) const + { + return !(*this > T); + } + +#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ + log_time operator-= (const timespec& T); + log_time operator- (const timespec& T) const + { + log_time local(*this); + return local -= T; + } + log_time operator+= (const timespec& T); + log_time operator+ (const timespec& T) const + { + log_time local(*this); + return local += T; + } +#endif + + /* log_time */ + bool operator== (const log_time& T) const + { + return (tv_sec == T.tv_sec) && (tv_nsec == T.tv_nsec); + } + bool operator!= (const log_time& T) const + { + return !(*this == T); + } + bool operator< (const log_time& T) const + { + return (tv_sec < T.tv_sec) + || ((tv_sec == T.tv_sec) && (tv_nsec < T.tv_nsec)); + } + bool operator>= (const log_time& T) const + { + return !(*this < T); + } + bool operator> (const log_time& T) const + { + return (tv_sec > T.tv_sec) + || ((tv_sec == T.tv_sec) && (tv_nsec > T.tv_nsec)); + } + bool operator<= (const log_time& T) const + { + return !(*this > T); + } + +#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ + log_time operator-= (const log_time& T); + log_time operator- (const log_time& T) const + { + log_time local(*this); + return local -= T; + } + log_time operator+= (const log_time& T); + log_time operator+ (const log_time& T) const + { + log_time local(*this); + return local += T; + } +#endif + + uint64_t nsec() const + { + return static_cast<uint64_t>(tv_sec) * NS_PER_SEC + tv_nsec; + } + +#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ + static const char default_format[]; + + /* Add %#q for the fraction of a second to the standard library functions */ + char* strptime(const char* s, const char* format = default_format); +#endif +} __attribute__((__packed__)); + +#else + +typedef struct log_time { + uint32_t tv_sec; + uint32_t tv_nsec; +} __attribute__((__packed__)) log_time; + +#endif + +#endif + +#endif /* _LIBS_LOG_LOG_TIME_H */ diff --git a/liblog/tests/Android.mk b/liblog/tests/Android.mk index 7bbf86d57..845067503 100644 --- a/liblog/tests/Android.mk +++ b/liblog/tests/Android.mk @@ -58,7 +58,8 @@ test_src_files := \ liblog_test.cpp \ log_id_test.cpp \ log_radio_test.cpp \ - log_system_test.cpp + log_system_test.cpp \ + log_time_test.cpp # to prevent breaking the build if bionic not relatively visible to us ifneq ($(wildcard $(LOCAL_PATH)/../../../../bionic/libc/bionic/libc_logging.cpp),) diff --git a/liblog/tests/log_time_test.cpp b/liblog/tests/log_time_test.cpp new file mode 100644 index 000000000..f2601b6ee --- /dev/null +++ b/liblog/tests/log_time_test.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <time.h> + +#include <gtest/gtest.h> +// Test the APIs in this standalone include file +#include <log/log_time.h> + +TEST(liblog, log_time) { +#ifdef __ANDROID__ + +#ifdef _SYSTEM_CORE_INCLUDE_PRIVATE_ANDROID_LOGGER_H_ + log_time(CLOCK_MONOTONIC); + + EXPECT_EQ(log_time, log_time::EPOCH); +#endif + + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + log_time tl(ts); + + EXPECT_EQ(tl, ts); + EXPECT_GE(tl, ts); + EXPECT_LE(tl, ts); + +#else + GTEST_LOG_(INFO) << "This test does nothing.\n"; +#endif +} |