@@ -39,20 +39,56 @@ import WASILibc
39
39
/// logger.info("Hello World!")
40
40
/// ```
41
41
public struct Logger {
42
+ /// Storage class to hold the label and log handler
42
43
@usableFromInline
43
- var handler : LogHandler
44
+ internal final class Storage : @unchecked /* and not actually */ Sendable /* but safe if only used with CoW */ {
45
+ @usableFromInline
46
+ var label : String
44
47
45
- /// An identifier of the creator of this `Logger`.
46
- public let label : String
48
+ @usableFromInline
49
+ var handler : LogHandler
50
+
51
+ @inlinable
52
+ init ( label: String , handler: LogHandler ) {
53
+ self . label = label
54
+ self . handler = handler
55
+ }
56
+
57
+ @inlinable
58
+ func copy( ) -> Storage {
59
+ return Storage ( label: self . label, handler: self . handler)
60
+ }
61
+ }
62
+
63
+ @usableFromInline
64
+ internal var _storage : Storage
65
+ public var label : String {
66
+ return self . _storage. label
67
+ }
68
+
69
+ /// A computed property to access the `LogHandler`.
70
+ @inlinable
71
+ public var handler : LogHandler {
72
+ get {
73
+ return self . _storage. handler
74
+ }
75
+ set {
76
+ if !isKnownUniquelyReferenced( & self . _storage) {
77
+ self . _storage = self . _storage. copy ( )
78
+ }
79
+ self . _storage. handler = newValue
80
+ }
81
+ }
47
82
48
83
/// The metadata provider this logger was created with.
84
+ @inlinable
49
85
public var metadataProvider : Logger . MetadataProvider ? {
50
86
return self . handler. metadataProvider
51
87
}
52
88
89
+ @usableFromInline
53
90
internal init ( label: String , _ handler: LogHandler ) {
54
- self . label = label
55
- self . handler = handler
91
+ self . _storage = Storage ( label: label, handler: handler)
56
92
}
57
93
}
58
94
0 commit comments