diff --git a/GoogleUtilities/Logger/GULSignpostLogger.m b/GoogleUtilities/Logger/GULSignpostLogger.m new file mode 100644 index 00000000..70fcbc77 --- /dev/null +++ b/GoogleUtilities/Logger/GULSignpostLogger.m @@ -0,0 +1,31 @@ +// +// GULSignpostLogger.m +// GoogleUtilities +// +// Created by Maksym Malyhin on 2021-07-07. +// + +#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"); + }); + return _default_signpost_log; +} + +gul_os_signpost_id_t gul_os_signpost_id_generate(gul_os_log_t log) { +#if __has_include() + if (@available(iOS 12.0, *)) { + return os_signpost_id_generate(log); + } else { + 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 new file mode 100644 index 00000000..5fbea08f --- /dev/null +++ b/GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h @@ -0,0 +1,74 @@ +// +// 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_interval_begin`. +#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__); \ + } \ + }) + +// See `os_signpost_interval_end`. +#define gul_os_signpost_interval_end(log, interval_id, name, ...) \ + __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, ...) \ + __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 uint64_t gul_os_signpost_id_t; + +#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); + +// See `os_signpost_id_generate`. +gul_os_signpost_id_t gul_os_signpost_id_generate(gul_os_log_t log); 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