Files
swift-mirror/stdlib/public/Darwin/os/os_signpost.swift
Saleem Abdulrasool 41d9c2cc59 stdlib: restructure for OS family layout of SDK overlay
The SDK directory is now confusing as the Windows target also has a SDK
overlay.  In order to make this more uniform, move the SDK directory to
Darwin which covers the fact that this covers the XNU family of OSes.
The Windows directory contains the SDK overlay for the Windows target.
2018-12-06 11:32:05 -08:00

134 lines
4.3 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
@_exported import os
@_exported import os.signpost
import _SwiftOSOverlayShims
import os.log
@available(macOS 10.14, iOS 12.0, watchOS 5.0, tvOS 12.0, *)
public func os_signpost(
_ type: OSSignpostType,
dso: UnsafeRawPointer = #dsohandle,
log: OSLog,
name: StaticString,
signpostID: OSSignpostID = .exclusive
) {
let hasValidID = signpostID != .invalid && signpostID != .null
guard log.signpostsEnabled && hasValidID else { return }
let ra = _swift_os_log_return_address()
name.withUTF8Buffer { (nameBuf: UnsafeBufferPointer<UInt8>) in
// Since dladdr is in libc, it is safe to unsafeBitCast
// the cstring argument type.
nameBuf.baseAddress!.withMemoryRebound(
to: CChar.self, capacity: nameBuf.count
) { nameStr in
_swift_os_signpost(dso, ra, log, type, nameStr, signpostID.rawValue)
}
}
}
@available(macOS 10.14, iOS 12.0, watchOS 5.0, tvOS 12.0, *)
public func os_signpost(
_ type: OSSignpostType,
dso: UnsafeRawPointer = #dsohandle,
log: OSLog,
name: StaticString,
signpostID: OSSignpostID = .exclusive,
_ format: StaticString,
_ arguments: CVarArg...
) {
let hasValidID = signpostID != .invalid && signpostID != .null
guard log.signpostsEnabled && hasValidID else { return }
let ra = _swift_os_log_return_address()
name.withUTF8Buffer { (nameBuf: UnsafeBufferPointer<UInt8>) in
// Since dladdr is in libc, it is safe to unsafeBitCast
// the cstring argument type.
nameBuf.baseAddress!.withMemoryRebound(
to: CChar.self, capacity: nameBuf.count
) { nameStr in
format.withUTF8Buffer { (formatBuf: UnsafeBufferPointer<UInt8>) in
// Since dladdr is in libc, it is safe to unsafeBitCast
// the cstring argument type.
formatBuf.baseAddress!.withMemoryRebound(
to: CChar.self, capacity: formatBuf.count
) { formatStr in
withVaList(arguments) { valist in
_swift_os_signpost_with_format(dso, ra, log, type,
nameStr, signpostID.rawValue, formatStr, valist)
}
}
}
}
}
}
@available(macOS 10.14, iOS 12.0, watchOS 5.0, tvOS 12.0, *)
extension OSSignpostType {
public static let event = __OS_SIGNPOST_EVENT
public static let begin = __OS_SIGNPOST_INTERVAL_BEGIN
public static let end = __OS_SIGNPOST_INTERVAL_END
}
@available(macOS 10.14, iOS 12.0, watchOS 5.0, tvOS 12.0, *)
public struct OSSignpostID {
public let rawValue: os_signpost_id_t
public static let exclusive = OSSignpostID(_swift_os_signpost_id_exclusive())
public static let invalid = OSSignpostID(_swift_os_signpost_id_invalid())
public static let null = OSSignpostID(_swift_os_signpost_id_null())
public init(log: OSLog) {
self.rawValue = __os_signpost_id_generate(log)
}
public init(log: OSLog, object: AnyObject) {
self.rawValue = __os_signpost_id_make_with_pointer(log,
UnsafeRawPointer(Unmanaged.passUnretained(object).toOpaque()))
}
public init(_ value: UInt64) {
self.rawValue = value
}
}
@available(macOS 10.14, iOS 12.0, watchOS 5.0, tvOS 12.0, *)
extension OSSignpostID : Comparable {
public static func < (a: OSSignpostID, b: OSSignpostID) -> Bool {
return a.rawValue < b.rawValue
}
public static func == (a: OSSignpostID, b: OSSignpostID) -> Bool {
return a.rawValue == b.rawValue
}
}
@available(macOS 10.14, iOS 12.0, watchOS 5.0, tvOS 12.0, *)
extension OSLog {
public struct Category {
public let rawValue: String
public static let pointsOfInterest =
Category(string: String(cString: _swift_os_signpost_points_of_interest()))
private init(string: String) {
self.rawValue = string
}
}
public convenience init(subsystem: String, category: Category) {
self.init(__subsystem: subsystem, category: category.rawValue)
}
public var signpostsEnabled: Bool {
return __os_signpost_enabled(self)
}
}