From 750aec384cea90e594030fe73aae0cd895ee0269 Mon Sep 17 00:00:00 2001 From: Maksym Malyhin Date: Wed, 7 Jul 2021 11:13:51 -0400 Subject: [PATCH 1/3] Signpost API wrapper draft --- GoogleUtilities/Logger/GULSignpostLogger.h | 57 ++++++++++++++++++++++ GoogleUtilities/Logger/GULSignpostLogger.m | 17 +++++++ 2 files changed, 74 insertions(+) create mode 100644 GoogleUtilities/Logger/GULSignpostLogger.h create mode 100644 GoogleUtilities/Logger/GULSignpostLogger.m diff --git a/GoogleUtilities/Logger/GULSignpostLogger.h b/GoogleUtilities/Logger/GULSignpostLogger.h new file mode 100644 index 00000000..c450b591 --- /dev/null +++ b/GoogleUtilities/Logger/GULSignpostLogger.h @@ -0,0 +1,57 @@ +// +// GULSignpostLogger.h +// GoogleUtilities +// +// Created by Maksym Malyhin on 2021-07-07. +// + +// Wrapper that allows using signpost () API when available and do nothing when it's not. It is introduced to reduce availability checks on the client side. + +#if __has_include() +#import + +typedef os_log_t gul_os_log_t; +typedef os_signpost_id_t gul_os_signpost_id_t; + +// See `os_signpost_id_generate`. +#define gul_os_signpost_id_generate(log) \ + os_signpost_id_generate(log) + +// See `os_signpost_interval_begin`. +#define gul_os_signpost_interval_begin(log, interval_id, name, ...) \ + os_signpost_interval_begin(log, interval_id, name, ##__VA_ARGS__) + +// See `os_signpost_interval_end`. +#define gul_os_signpost_interval_end(log, interval_id, name, ...) \ + os_signpost_interval_end(log, interval_id, name, ##__VA_ARGS__) + +// See `os_signpost_interval_end`. +#define gul_os_signpost_interval_emit(log, event_id, name, ...) \ + os_signpost_interval_emit(log, event_id, name, ##__VA_ARGS__) + +// See `_gul_default_signpost_log`. +#define gul_default_signpost_log() \ + _gul_default_signpost_log + +#else // __has_include() + +// Placeholders for the signpost API methods and types when it's not available. + +typedef void gul_os_log_t; +typedef void gul_os_signpost_id_t; + +#define gul_os_signpost_id_generate(log) + +#define gul_os_signpost_interval_begin(log, interval_id, name, ...) + +#define gul_os_signpost_interval_end(log, interval_id, name, ...) + +#define gul_os_signpost_interval_emit(log, event_id, name, ...) + +#define gul_default_signpost_log() + +#endif // __has_include() + +/// Returns a default instance of `gul_os_log_t` to be used for signpost logging when available. +/// @return A default instance of `gul_os_log_t`. +gul_os_log_t _gul_default_signpost_log(void); diff --git a/GoogleUtilities/Logger/GULSignpostLogger.m b/GoogleUtilities/Logger/GULSignpostLogger.m new file mode 100644 index 00000000..dc2264f7 --- /dev/null +++ b/GoogleUtilities/Logger/GULSignpostLogger.m @@ -0,0 +1,17 @@ +// +// GULSignpostLogger.m +// GoogleUtilities +// +// Created by Maksym Malyhin on 2021-07-07. +// + +#import "GULSignpostLogger.h" + +gul_os_log_t _gul_default_signpost_log(void) { + static gul_os_log_t _default_signpost_log; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + _default_signpost_log = os_log_create("com.GoogleUtilities.signpost", "signpost") + }); + return _default_signpost_log; +} From f847b7cf582af1756ae03ef19ba0cb3b43973303 Mon Sep 17 00:00:00 2001 From: Maksym Malyhin Date: Wed, 7 Jul 2021 11:51:12 -0400 Subject: [PATCH 2/3] Tests and experiements --- GoogleUtilities/Logger/GULSignpostLogger.m | 14 +++++++++-- .../GoogleUtilities}/GULSignpostLogger.h | 8 +++--- .../Unit/Logger/GULSignpostLoggerTests.m | 25 +++++++++++++++++++ 3 files changed, 42 insertions(+), 5 deletions(-) rename GoogleUtilities/Logger/{ => Public/GoogleUtilities}/GULSignpostLogger.h (85%) create mode 100644 GoogleUtilities/Tests/Unit/Logger/GULSignpostLoggerTests.m diff --git a/GoogleUtilities/Logger/GULSignpostLogger.m b/GoogleUtilities/Logger/GULSignpostLogger.m index dc2264f7..486192dd 100644 --- a/GoogleUtilities/Logger/GULSignpostLogger.m +++ b/GoogleUtilities/Logger/GULSignpostLogger.m @@ -5,13 +5,23 @@ // Created by Maksym Malyhin on 2021-07-07. // -#import "GULSignpostLogger.h" +#import + +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h" gul_os_log_t _gul_default_signpost_log(void) { static gul_os_log_t _default_signpost_log; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - _default_signpost_log = os_log_create("com.GoogleUtilities.signpost", "signpost") + _default_signpost_log = os_log_create("com.GoogleUtilities.signpost", "signpost"); }); return _default_signpost_log; } + +void _gul_os_signpost_interval_begin(gul_os_log_t log, gul_os_signpost_id_t interval_id, const char *name, ...) { + if (@available(iOS 12.0, *)) { + os_signpost_interval_begin(log, interval_id, name, "" __VA_ARGS__); + } else { + // Fallback on earlier versions + } +} diff --git a/GoogleUtilities/Logger/GULSignpostLogger.h b/GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h similarity index 85% rename from GoogleUtilities/Logger/GULSignpostLogger.h rename to GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h index c450b591..689f713b 100644 --- a/GoogleUtilities/Logger/GULSignpostLogger.h +++ b/GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h @@ -19,7 +19,7 @@ typedef os_signpost_id_t gul_os_signpost_id_t; // See `os_signpost_interval_begin`. #define gul_os_signpost_interval_begin(log, interval_id, name, ...) \ - os_signpost_interval_begin(log, interval_id, name, ##__VA_ARGS__) + _gul_os_signpost_interval_begin(log, interval_id, name, ##__VA_ARGS__) // See `os_signpost_interval_end`. #define gul_os_signpost_interval_end(log, interval_id, name, ...) \ @@ -31,7 +31,7 @@ typedef os_signpost_id_t gul_os_signpost_id_t; // See `_gul_default_signpost_log`. #define gul_default_signpost_log() \ - _gul_default_signpost_log + _gul_default_signpost_log() #else // __has_include() @@ -42,7 +42,7 @@ typedef void gul_os_signpost_id_t; #define gul_os_signpost_id_generate(log) -#define gul_os_signpost_interval_begin(log, interval_id, name, ...) +//#define gul_os_signpost_interval_begin(log, interval_id, name, ...) #define gul_os_signpost_interval_end(log, interval_id, name, ...) @@ -55,3 +55,5 @@ typedef void gul_os_signpost_id_t; /// Returns a default instance of `gul_os_log_t` to be used for signpost logging when available. /// @return A default instance of `gul_os_log_t`. gul_os_log_t _gul_default_signpost_log(void); + +void _gul_os_signpost_interval_begin(gul_os_log_t log, gul_os_signpost_id_t interval_id, const char *name, ...); diff --git a/GoogleUtilities/Tests/Unit/Logger/GULSignpostLoggerTests.m b/GoogleUtilities/Tests/Unit/Logger/GULSignpostLoggerTests.m new file mode 100644 index 00000000..7b46119c --- /dev/null +++ b/GoogleUtilities/Tests/Unit/Logger/GULSignpostLoggerTests.m @@ -0,0 +1,25 @@ +// +// GULSignpostLoggerTests.m +// GoogleUtilities-Unit-unit +// +// Created by Maksym Malyhin on 2021-07-07. +// + +#import + +#import "GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h" + +@interface GULSignpostLoggerTests : XCTestCase + +@end + +@implementation GULSignpostLoggerTests + +- (void)testSignpostLogs { + gul_os_log_t log = gul_default_signpost_log(); + gul_os_signpost_id_t signpostID = gul_os_signpost_id_generate(log); + gul_os_signpost_interval_begin(log, signpostID, "test begin"); + gul_os_signpost_interval_end(log, signpostID, "test end"); +} + +@end From 6050e2ac8f34e5be90ce5e2f73fdcd7971adf32c Mon Sep 17 00:00:00 2001 From: Maksym Malyhin Date: Tue, 13 Jul 2021 10:24:46 -0400 Subject: [PATCH 3/3] Ues __extension__ to make runtime availability check --- GoogleUtilities/Logger/GULSignpostLogger.m | 10 +++-- .../GoogleUtilities/GULSignpostLogger.h | 39 +++++++++++++------ 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/GoogleUtilities/Logger/GULSignpostLogger.m b/GoogleUtilities/Logger/GULSignpostLogger.m index 486192dd..70fcbc77 100644 --- a/GoogleUtilities/Logger/GULSignpostLogger.m +++ b/GoogleUtilities/Logger/GULSignpostLogger.m @@ -18,10 +18,14 @@ gul_os_log_t _gul_default_signpost_log(void) { return _default_signpost_log; } -void _gul_os_signpost_interval_begin(gul_os_log_t log, gul_os_signpost_id_t interval_id, const char *name, ...) { +gul_os_signpost_id_t gul_os_signpost_id_generate(gul_os_log_t log) { +#if __has_include() if (@available(iOS 12.0, *)) { - os_signpost_interval_begin(log, interval_id, name, "" __VA_ARGS__); + return os_signpost_id_generate(log); } else { - // Fallback on earlier versions + return 0; } +#else // __has_include() + return 0; +#endif // __has_include() } diff --git a/GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h b/GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h index 689f713b..5fbea08f 100644 --- a/GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h +++ b/GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h @@ -13,36 +13,50 @@ typedef os_log_t gul_os_log_t; typedef os_signpost_id_t gul_os_signpost_id_t; -// See `os_signpost_id_generate`. -#define gul_os_signpost_id_generate(log) \ - os_signpost_id_generate(log) - // See `os_signpost_interval_begin`. #define gul_os_signpost_interval_begin(log, interval_id, name, ...) \ - _gul_os_signpost_interval_begin(log, interval_id, name, ##__VA_ARGS__) + __extension__({ \ + if (@available(iOS 12.0, *)) { \ + os_signpost_interval_begin(log, interval_id, name, "" __VA_ARGS__); \ + } \ + }) // See `os_signpost_interval_end`. #define gul_os_signpost_interval_end(log, interval_id, name, ...) \ - os_signpost_interval_end(log, interval_id, name, ##__VA_ARGS__) + __extension__({ \ + if (@available(iOS 12.0, *)) { \ + os_signpost_interval_end(log, interval_id, name, "" __VA_ARGS__); \ + } \ + }) // See `os_signpost_interval_end`. #define gul_os_signpost_interval_emit(log, event_id, name, ...) \ - os_signpost_interval_emit(log, event_id, name, ##__VA_ARGS__) + __extension__({ \ + if (@available(iOS 12.0, *)) { \ + os_signpost_interval_end(log, event_id, name, "" __VA_ARGS__); \ + } \ + }) // See `_gul_default_signpost_log`. #define gul_default_signpost_log() \ _gul_default_signpost_log() + +#define _gul_os_signpost_interval_begin(log, interval_id, name, ...) \ + __extension__({ \ + if (@available(iOS 12.0, *)) { \ + os_signpost_interval_begin(log, interval_id, name, "" __VA_ARGS__); \ + } \ + }) + #else // __has_include() // Placeholders for the signpost API methods and types when it's not available. typedef void gul_os_log_t; -typedef void gul_os_signpost_id_t; - -#define gul_os_signpost_id_generate(log) +typedef uint64_t gul_os_signpost_id_t; -//#define gul_os_signpost_interval_begin(log, interval_id, name, ...) +#define gul_os_signpost_interval_begin(log, interval_id, name, ...) #define gul_os_signpost_interval_end(log, interval_id, name, ...) @@ -56,4 +70,5 @@ typedef void gul_os_signpost_id_t; /// @return A default instance of `gul_os_log_t`. gul_os_log_t _gul_default_signpost_log(void); -void _gul_os_signpost_interval_begin(gul_os_log_t log, gul_os_signpost_id_t interval_id, const char *name, ...); +// See `os_signpost_id_generate`. +gul_os_signpost_id_t gul_os_signpost_id_generate(gul_os_log_t log);