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