@@ -6,6 +6,8 @@ import com.apollographql.apollo.api.http.HttpRequest
66import com.apollographql.apollo.api.http.HttpResponse
77import com.apollographql.apollo.exception.ApolloNetworkException
88import com.apollographql.apollo.network.toNSData
9+ import kotlinx.atomicfu.locks.reentrantLock
10+ import kotlinx.atomicfu.locks.withLock
911import kotlinx.cinterop.alloc
1012import kotlinx.cinterop.nativeHeap
1113import kotlinx.cinterop.ptr
@@ -207,6 +209,8 @@ private class StreamingDataDelegate : NSObject(), NSURLSessionDataDelegateProtoc
207209 fun onComplete (error : NSError ? )
208210 }
209211
212+ private val lock = reentrantLock()
213+
210214 private val handlers = mutableMapOf<NSURLSessionTask , Handler >()
211215
212216 override fun URLSession (
@@ -215,7 +219,9 @@ private class StreamingDataDelegate : NSObject(), NSURLSessionDataDelegateProtoc
215219 didReceiveResponse : NSURLResponse ,
216220 completionHandler : (NSURLSessionResponseDisposition ) -> Unit ,
217221 ) {
218- handlers[dataTask]?.onResponse(didReceiveResponse as NSHTTPURLResponse )
222+ lock.withLock {
223+ handlers[dataTask]
224+ }?.onResponse(didReceiveResponse as NSHTTPURLResponse )
219225 completionHandler(NSURLSessionResponseAllow )
220226 }
221227
@@ -224,18 +230,22 @@ private class StreamingDataDelegate : NSObject(), NSURLSessionDataDelegateProtoc
224230 dataTask : NSURLSessionDataTask ,
225231 didReceiveData : NSData ,
226232 ) {
227- handlers[dataTask]?.onData(didReceiveData)
233+ lock.withLock {
234+ handlers[dataTask]
235+ }?.onData(didReceiveData)
228236 }
229237
230238 override fun URLSession (
231239 session : NSURLSession ,
232240 task : NSURLSessionTask ,
233241 didCompleteWithError : NSError ? ,
234242 ) {
235- handlers[task]?.onComplete(didCompleteWithError)
236-
237- // Cleanup
238- handlers.remove(task)
243+ lock.withLock {
244+ handlers[task].also {
245+ // Cleanup
246+ handlers.remove(task)
247+ }
248+ }?.onComplete(didCompleteWithError)
239249 }
240250
241251 override fun URLSession (
@@ -244,16 +254,20 @@ private class StreamingDataDelegate : NSObject(), NSURLSessionDataDelegateProtoc
244254 willCacheResponse : NSCachedURLResponse ,
245255 completionHandler : (NSCachedURLResponse ? ) -> Unit ,
246256 ) {
247- handlers[dataTask]?.onComplete(null )
248-
249- // Cleanup
250- handlers.remove(dataTask)
257+ lock.withLock {
258+ handlers[dataTask].also {
259+ // Cleanup
260+ handlers.remove(dataTask)
261+ }
262+ }?.onComplete(null )
251263
252264 completionHandler(willCacheResponse)
253265 }
254266
255267 fun registerHandlerForTask (task : NSURLSessionTask , handler : Handler ) {
256- handlers[task] = handler
268+ lock.withLock {
269+ handlers[task] = handler
270+ }
257271 }
258272}
259273
0 commit comments