@@ -106,12 +106,46 @@ internal func _dispatchEnqueueWithDeadline(_ global: CBool,
106
106
internal func _dispatchAssertMainQueue( )
107
107
108
108
@available( SwiftStdlib 6 . 2 , * )
109
- @_silgen_name ( " swift_createDispatchEvent " )
110
- internal func _createDispatchEvent( handler: @convention ( block) @escaping ( ) -> ( ) ) -> OpaquePointer
109
+ @_silgen_name ( " swift_createDispatchEventC " )
110
+ internal func _createDispatchEventC(
111
+ handler: @convention ( c) @escaping ( UnsafeMutableRawPointer ) -> ( ) ,
112
+ context: UnsafeMutableRawPointer
113
+ ) -> OpaquePointer
114
+
115
+ fileprivate class DispatchEventHandlerBox {
116
+ var handler : ( ) -> ( )
117
+ init ( handler: @escaping ( ) - > ( ) ) {
118
+ self . handler = handler
119
+ }
120
+ }
111
121
112
122
@available ( SwiftStdlib 6 . 2 , * )
113
- @_silgen_name ( " swift_destroyDispatchEvent " )
114
- internal func _destroyDispatchEvent( _ event: OpaquePointer )
123
+ internal func _createDispatchEvent( handler: @escaping ( ) -> ( ) ) -> OpaquePointer {
124
+ let boxed = DispatchEventHandlerBox ( handler: handler)
125
+ let opaqueHandlerBox = Unmanaged . passRetained ( boxed) . toOpaque ( )
126
+ return _createDispatchEventC (
127
+ handler: { context in
128
+ let unmanaged = Unmanaged< DispatchEventHandlerBox> . fromOpaque( context)
129
+ unmanaged. takeUnretainedValue ( ) . handler ( )
130
+ } ,
131
+ context: opaqueHandlerBox
132
+ )
133
+ }
134
+
135
+ @available ( SwiftStdlib 6 . 2 , * )
136
+ @_silgen_name ( " swift_destroyDispatchEventC " )
137
+ internal func _destroyDispatchEventC( _ event: OpaquePointer )
138
+
139
+ @available( SwiftStdlib 6 . 2 , * )
140
+ @_silgen_name ( " swift_getDispatchEventContext " )
141
+ internal func _getDispatchEventContext( _ event: OpaquePointer ) -> UnsafeMutableRawPointer
142
+
143
+ @available ( SwiftStdlib 6 . 2 , * )
144
+ internal func _destroyDispatchEvent( _ event: OpaquePointer ) {
145
+ let context = _getDispatchEventContext ( event)
146
+ Unmanaged < DispatchEventHandlerBox > . fromOpaque ( context) . release ( )
147
+ _destroyDispatchEventC ( event)
148
+ }
115
149
116
150
@available ( SwiftStdlib 6 . 2 , * )
117
151
@_silgen_name ( " swift_signalDispatchEvent " )
0 commit comments