Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions GoogleUtilities/Logger/GULSignpostLogger.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// GULSignpostLogger.m
// GoogleUtilities
//
// Created by Maksym Malyhin on 2021-07-07.
//

#import <Foundation/Foundation.h>

#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(<os/signpost.h>)
if (@available(iOS 12.0, *)) {
return os_signpost_id_generate(log);
} else {
return 0;
}
#else // __has_include(<os/signpost.h>)
return 0;
#endif // __has_include(<os/signpost.h>)
}
74 changes: 74 additions & 0 deletions GoogleUtilities/Logger/Public/GoogleUtilities/GULSignpostLogger.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
//
// GULSignpostLogger.h
// GoogleUtilities
//
// Created by Maksym Malyhin on 2021-07-07.
//

// Wrapper that allows using signpost (<os/signpost.h>) API when available and do nothing when it's not. It is introduced to reduce availability checks on the client side.

#if __has_include(<os/signpost.h>)
#import <os/signpost.h>

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(<os/signpost.h>)

// 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(<os/signpost.h>)

/// 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);
25 changes: 25 additions & 0 deletions GoogleUtilities/Tests/Unit/Logger/GULSignpostLoggerTests.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// GULSignpostLoggerTests.m
// GoogleUtilities-Unit-unit
//
// Created by Maksym Malyhin on 2021-07-07.
//

#import <XCTest/XCTest.h>

#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