belozierov / swiftcoroutine Goto Github PK
View Code? Open in Web Editor NEWSwift coroutines for iOS, macOS and Linux.
Home Page: https://belozierov.github.io/SwiftCoroutine
License: MIT License
Swift coroutines for iOS, macOS and Linux.
Home Page: https://belozierov.github.io/SwiftCoroutine
License: MIT License
Is there a reason that CoFuture
is not generic to its Error
result type as well as its Value
? As it is, similarly to Swift's untyped throw
ing functions, I'm always needing a default
clause when I switch over CoFuture
failure cases. I assume there's a good reason for designing it this way....
I was ecstatic when I saw this repo. Unfortunately, I was informed that the basis of the coroutines defined in this project are unsafe:
setjmp and longjmp aren't safe to use in Swift (or ARC ObjC)—retain counts will leak, and weak refs may corrupt memory.
- Joe Groff
Further references:
https://twitter.com/search?q=from%3Ajckarter%20setjmp&src=typed_query
Unless this information is incorrect, there should probably at least be a warning in the README on this.
When running the unit tests of the current master branch I get the following test crash
commit 014ebe763cb08bb9e04dcf112787e585f7dc00f5 (HEAD -> master, origin/master, origin/HEAD)
In file and line: CoFutureAwaitTests.swift:51
xctest(7034,0x700009087000) malloc: *** error for object 0x111abe000: pointer being freed was not allocated
xctest(7034,0x700009087000) malloc: *** set a breakpoint in malloc_error_break to debug
If it's of interest to you I will debug further using your instructions.
Are you considering supporting Swift NIO. An NIO scheduler?
不知道什么操作导致主线程栈溢出,导致出现UI渲染crash了,最后修改下面代码为512解决,想了解有没有什么错误写法导致库的栈不释放,很容易栈溢出
internal static let recommended = Coroutine.StackSize(size: 512 * 1024)
Can CoChannel
be cancelled from different thread than where it has been created? Ie, I create channels on DispatchQueue.global()
, and cancel them later at DispatchQueue.main
, as they become unneeded. But channels seem to continue working until app termination.
For the following code, if I put a breakpoint on line where let a
is in Xcode, LLDB debug server will crash.
If I start the initial coroutine on main queue instead of global, or if I remove the middle CoFuture, no crashes would happen when the breakpoint hits.
import UIKit
import SwiftCoroutine
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.global().startCoroutine {
try CoFuture<Void> {
try DispatchQueue.main.await {
let a = 1 /* SET BREAKPOINT ON THIS LINE*/
}
}.await()
}
}
}
Message from debugger: The LLDB RPC server has crashed. The crash log is located in ~/Library/Logs/DiagnosticReports and has a prefix 'lldb-rpc-server'. Please file a bug and attach the most recent crash log.
Unfortunately, when this crash happens, no actual diagnostic files are actually generated.
Hi,
I developed a feature that I found missing.
The problem is that I want to continue the execution of a coroutine block even if there is an error, for example a loader must disappear after the request whether there is an error or not.
With current framework:
DispatchQueue.main.startCoroutine(in: self.scope) {
isLoading = true
do {
try self.service.getAll().await()
try self.service.getAll().await() // Error occurred go to catch block
try self.service.getAll().await()
isLoading = false
} catch {
// Error occurred
isLoading = false
}
}
With this version as soon as there is an error we do not continue the block we go into the catch block. But the problem is that isLoading = false
is written twice
I know I can also do this which will not stop the block but it is not what I reach, if there is an error I want the block to be stopped
DispatchQueue.main.startCoroutine(in: self.scope) {
isLoading = true
try? self.service.getAll().await()
try? self.service.getAll().await() // Error occurred but I dont want continue to the next request, I want hide the loader
try? self.service.getAll().await()
isLoading = false
}
So my solution is as follows, I wrap the coroutine block to make it clearer, Async / Await. And I added 2 blocks to catch the error, and a finally block which will be executed even if we get an error.
isLoading = true
async {
try self.service.getAll().await()
try self.service.getAll().await() // Error go to catch
try self.service.getAll().await()
}.catch { error in
Log.s("Error occurred: \(error.localizedDescription)")
}.finally {
// This block will be executed at the end of the block even if there is an error
isLoading = false
}
I already wrote this wrapper, if you are interested in integrating it into the framework I can make a pull request. This way will not replace the old way, it will just be a new possibility way
I found no code about armv7 or armv7s in the file CCoroutine.c, will it support this arch?
Do you have any plans to include or create ReactiveKit type Bindings/Extensions for those of us who want to migrate a ReactiveKit style project to Coroutines?
So something like: mySignal.await()
to be able to call within a coroutine function.
Sometimes it works fine. Sometimes app starts crushing at _setjmp(env)
with EXC_BAD_ACCESS
in the following code:
void __suspend(void* env, void** sp, void* ret, int retVal) {
if (_setjmp(env)) return;
char x; *sp = (void*)&x;
_longjmp(ret, retVal);
}
Caused by await
.
I have been experiencing random crashes some of which seem to involve random memory corruption. I have since found a probable cause, but did run across this while I was searching for issues.
I ran address sanitizer on my code and it spit out the following. There is a warning of potential false positives...
==47182==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x00010a1db9e1 at pc 0x000100136a7a bp 0x70000f1b9bb0 sp 0x70000f1b9370
READ of size 5664 at 0x00010a1db9e1 thread T2
#0 0x100136a79 in wrap_memmove+0x169 (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1da79)
#1 0x109ce5d60 in SharedCoroutine.saveStack()+0x830 (goSwiftlyTests:x86_64+0xdad60)
#2 0x109cedc9d in SharedCoroutineQueue.start(dispatcher:scheduler:task:)+0x47d (goSwiftlyTests:x86_64+0xe2c9d)
#3 0x109ceac4a in closure #1 in SharedCoroutineDispatcher.execute(on:task:)+0x22a (goSwiftlyTests:x86_64+0xdfc4a)
#4 0x109cbd932 in thunk for @escaping @callee_guaranteed () -> ()+0x92 (goSwiftlyTests:x86_64+0xb2932)
#5 0x1001613ba in __wrap_dispatch_async_block_invoke+0xca (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x483ba)
#6 0x7fff72cb56c3 in _dispatch_call_block_and_release+0xb (libdispatch.dylib:x86_64+0x16c3)
#7 0x7fff72cb6657 in _dispatch_client_callout+0x7 (libdispatch.dylib:x86_64+0x2657)
#8 0x7fff72cbbc43 in _dispatch_lane_serial_drain+0x254 (libdispatch.dylib:x86_64+0x7c43)
#9 0x7fff72cbc5d5 in _dispatch_lane_invoke+0x16a (libdispatch.dylib:x86_64+0x85d5)
#10 0x7fff72cc5c08 in _dispatch_workloop_worker_thread+0x253 (libdispatch.dylib:x86_64+0x11c08)
#11 0x7fff72f10a3c in _pthread_wqthread+0x121 (libsystem_pthread.dylib:x86_64+0x2a3c)
#12 0x7fff72f0fb76 in start_wqthread+0xe (libsystem_pthread.dylib:x86_64+0x1b76)
0x00010a1db9e1 is located 190945 bytes inside of 200704-byte region [0x00010a1ad000,0x00010a1de000)
allocated by thread T2 here:
#0 0x100162870 in wrap_posix_memalign+0xb0 (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x49870)
#1 0x7fff7262bcd1 in swift_slowAlloc+0x41 (libswiftCore.dylib:x86_64+0x2f2cd1)
#2 0x109cd817b in CoroutineContext.init(stackSize:guardPage:)+0x4fb (goSwiftlyTests:x86_64+0xcd17b)
#3 0x109cd7c68 in CoroutineContext.__allocating_init(stackSize:guardPage:)+0x38 (goSwiftlyTests:x86_64+0xccc68)
#4 0x109ced426 in SharedCoroutineQueue.init(stackSize:)+0x5b6 (goSwiftlyTests:x86_64+0xe2426)
#5 0x109cece58 in SharedCoroutineQueue.__allocating_init(stackSize:)+0x28 (goSwiftlyTests:x86_64+0xe1e58)
#6 0x109ceb158 in SharedCoroutineDispatcher.getFreeQueue()+0x438 (goSwiftlyTests:x86_64+0xe0158)
#7 0x109ceac2f in closure #1 in SharedCoroutineDispatcher.execute(on:task:)+0x20f (goSwiftlyTests:x86_64+0xdfc2f)
#8 0x109cbd932 in thunk for @escaping @callee_guaranteed () -> ()+0x92 (goSwiftlyTests:x86_64+0xb2932)
#9 0x1001613ba in __wrap_dispatch_async_block_invoke+0xca (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x483ba)
#10 0x7fff72cb56c3 in _dispatch_call_block_and_release+0xb (libdispatch.dylib:x86_64+0x16c3)
#11 0x7fff72cb6657 in _dispatch_client_callout+0x7 (libdispatch.dylib:x86_64+0x2657)
#12 0x7fff72cbbc43 in _dispatch_lane_serial_drain+0x254 (libdispatch.dylib:x86_64+0x7c43)
#13 0x7fff72cbc5d5 in _dispatch_lane_invoke+0x16a (libdispatch.dylib:x86_64+0x85d5)
#14 0x7fff72cc5c08 in _dispatch_workloop_worker_thread+0x253 (libdispatch.dylib:x86_64+0x11c08)
#15 0x7fff72f10a3c in _pthread_wqthread+0x121 (libsystem_pthread.dylib:x86_64+0x2a3c)
#16 0x7fff72f0fb76 in start_wqthread+0xe (libsystem_pthread.dylib:x86_64+0x1b76)
Thread T2 created by T1 here:
Thread T1 created by T0 here:
SUMMARY: AddressSanitizer: stack-buffer-overflow (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1da79) in wrap_memmove+0x169
Shadow bytes around the buggy address:
0x10002143b6e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10002143b6f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10002143b700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10002143b710: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10002143b720: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x10002143b730: 00 00 00 00 00 00 00 00 f1 f1 f1 f1[01]f3 f3 f3
0x10002143b740: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10002143b750: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10002143b760: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10002143b770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x10002143b780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
2020-11-06 15:47:39.270045-0700 xctest[47182:2741407] ==47182==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x70000f1bb000; bottom 0x00010a1da000; size: 0x6fff04fe1000 (123141091102720)
2020-11-06 15:47:39.270161-0700 xctest[47182:2741407] False positive error reports may follow
2020-11-06 15:47:39.270244-0700 xctest[47182:2741407] For details see google/sanitizers#189
2020-11-06 15:47:39.270366-0700 xctest[47182:2741407] =================================================================
2020-11-06 15:47:39.270476-0700 xctest[47182:2741407] ==47182==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x00010a1db9e1 at pc 0x000100136a7a bp 0x70000f1b9bb0 sp 0x70000f1b9370
2020-11-06 15:47:39.270527-0700 xctest[47182:2741407] READ of size 5664 at 0x00010a1db9e1 thread T2
2020-11-06 15:47:39.270648-0700 xctest[47182:2741407] #0 0x100136a79 in wrap_memmove+0x169 (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1da79)
2020-11-06 15:47:39.270708-0700 xctest[47182:2741407] #1 0x109ce5d60 in SharedCoroutine.saveStack()+0x830 (goSwiftlyTests:x86_64+0xdad60)
2020-11-06 15:47:39.270798-0700 xctest[47182:2741407] #2 0x109cedc9d in SharedCoroutineQueue.start(dispatcher:scheduler:task:)+0x47d (goSwiftlyTests:x86_64+0xe2c9d)
2020-11-06 15:47:39.270892-0700 xctest[47182:2741407] #3 0x109ceac4a in closure #1 in SharedCoroutineDispatcher.execute(on:task:)+0x22a (goSwiftlyTests:x86_64+0xdfc4a)
2020-11-06 15:47:39.270955-0700 xctest[47182:2741407] #4 0x109cbd932 in thunk for @escaping @callee_guaranteed () -> ()+0x92 (goSwiftlyTests:x86_64+0xb2932)
2020-11-06 15:47:39.271008-0700 xctest[47182:2741407] #5 0x1001613ba in __wrap_dispatch_async_block_invoke+0xca (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x483ba)
2020-11-06 15:47:39.271119-0700 xctest[47182:2741407] #6 0x7fff72cb56c3 in _dispatch_call_block_and_release+0xb (libdispatch.dylib:x86_64+0x16c3)
2020-11-06 15:47:39.271189-0700 xctest[47182:2741407] #7 0x7fff72cb6657 in _dispatch_client_callout+0x7 (libdispatch.dylib:x86_64+0x2657)
2020-11-06 15:47:39.271266-0700 xctest[47182:2741407] #8 0x7fff72cbbc43 in _dispatch_lane_serial_drain+0x254 (libdispatch.dylib:x86_64+0x7c43)
2020-11-06 15:47:39.271346-0700 xctest[47182:2741407] #9 0x7fff72cbc5d5 in _dispatch_lane_invoke+0x16a (libdispatch.dylib:x86_64+0x85d5)
2020-11-06 15:47:39.271396-0700 xctest[47182:2741407] #10 0x7fff72cc5c08 in _dispatch_workloop_worker_thread+0x253 (libdispatch.dylib:x86_64+0x11c08)
2020-11-06 15:47:39.271445-0700 xctest[47182:2741407] #11 0x7fff72f10a3c in _pthread_wqthread+0x121 (libsystem_pthread.dylib:x86_64+0x2a3c)
2020-11-06 15:47:39.271534-0700 xctest[47182:2741407] #12 0x7fff72f0fb76 in start_wqthread+0xe (libsystem_pthread.dylib:x86_64+0x1b76)
2020-11-06 15:47:39.271578-0700 xctest[47182:2741407]
2020-11-06 15:47:39.271621-0700 xctest[47182:2741407] 0x00010a1db9e1 is located 190945 bytes inside of 200704-byte region [0x00010a1ad000,0x00010a1de000)
2020-11-06 15:47:39.271667-0700 xctest[47182:2741407] allocated by thread T2 here:
2020-11-06 15:47:39.271708-0700 xctest[47182:2741407] #0 0x100162870 in wrap_posix_memalign+0xb0 (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x49870)
2020-11-06 15:47:39.271749-0700 xctest[47182:2741407] #1 0x7fff7262bcd1 in swift_slowAlloc+0x41 (libswiftCore.dylib:x86_64+0x2f2cd1)
2020-11-06 15:47:39.271861-0700 xctest[47182:2741407] #2 0x109cd817b in CoroutineContext.init(stackSize:guardPage:)+0x4fb (goSwiftlyTests:x86_64+0xcd17b)
2020-11-06 15:47:39.271926-0700 xctest[47182:2741407] #3 0x109cd7c68 in CoroutineContext.__allocating_init(stackSize:guardPage:)+0x38 (goSwiftlyTests:x86_64+0xccc68)
2020-11-06 15:47:39.272024-0700 xctest[47182:2741407] #4 0x109ced426 in SharedCoroutineQueue.init(stackSize:)+0x5b6 (goSwiftlyTests:x86_64+0xe2426)
2020-11-06 15:47:39.272134-0700 xctest[47182:2741407] #5 0x109cece58 in SharedCoroutineQueue.__allocating_init(stackSize:)+0x28 (goSwiftlyTests:x86_64+0xe1e58)
2020-11-06 15:47:39.272253-0700 xctest[47182:2741407] #6 0x109ceb158 in SharedCoroutineDispatcher.getFreeQueue()+0x438 (goSwiftlyTests:x86_64+0xe0158)
2020-11-06 15:47:39.272323-0700 xctest[47182:2741407] #7 0x109ceac2f in closure #1 in SharedCoroutineDispatcher.execute(on:task:)+0x20f (goSwiftlyTests:x86_64+0xdfc2f)
2020-11-06 15:47:39.272388-0700 xctest[47182:2741407] #8 0x109cbd932 in thunk for @escaping @callee_guaranteed () -> ()+0x92 (goSwiftlyTests:x86_64+0xb2932)
2020-11-06 15:47:39.272434-0700 xctest[47182:2741407] #9 0x1001613ba in __wrap_dispatch_async_block_invoke+0xca (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x483ba)
2020-11-06 15:47:39.272518-0700 xctest[47182:2741407] #10 0x7fff72cb56c3 in _dispatch_call_block_and_release+0xb (libdispatch.dylib:x86_64+0x16c3)
2020-11-06 15:47:39.272628-0700 xctest[47182:2741407] #11 0x7fff72cb6657 in _dispatch_client_callout+0x7 (libdispatch.dylib:x86_64+0x2657)
2020-11-06 15:47:39.272735-0700 xctest[47182:2741407] #12 0x7fff72cbbc43 in _dispatch_lane_serial_drain+0x254 (libdispatch.dylib:x86_64+0x7c43)
2020-11-06 15:47:39.272836-0700 xctest[47182:2741407] #13 0x7fff72cbc5d5 in _dispatch_lane_invoke+0x16a (libdispatch.dylib:x86_64+0x85d5)
2020-11-06 15:47:39.272911-0700 xctest[47182:2741407] #14 0x7fff72cc5c08 in _dispatch_workloop_worker_thread+0x253 (libdispatch.dylib:x86_64+0x11c08)
2020-11-06 15:47:39.273034-0700 xctest[47182:2741407] #15 0x7fff72f10a3c in _pthread_wqthread+0x121 (libsystem_pthread.dylib:x86_64+0x2a3c)
2020-11-06 15:47:39.273105-0700 xctest[47182:2741407] #16 0x7fff72f0fb76 in start_wqthread+0xe (libsystem_pthread.dylib:x86_64+0x1b76)
2020-11-06 15:47:39.273255-0700 xctest[47182:2741407]
2020-11-06 15:47:39.273320-0700 xctest[47182:2741407] Thread T2 created by T1 here:
2020-11-06 15:47:39.273371-0700 xctest[47182:2741407]
2020-11-06 15:47:39.273523-0700 xctest[47182:2741407]
2020-11-06 15:47:39.273596-0700 xctest[47182:2741407] Thread T1 created by T0 here:
2020-11-06 15:47:39.273647-0700 xctest[47182:2741407]
2020-11-06 15:47:39.273745-0700 xctest[47182:2741407]
2020-11-06 15:47:39.273816-0700 xctest[47182:2741407] SUMMARY: AddressSanitizer: stack-buffer-overflow (libclang_rt.asan_osx_dynamic.dylib:x86_64h+0x1da79) in wrap_memmove+0x169
2020-11-06 15:47:39.273872-0700 xctest[47182:2741407] Shadow bytes around the buggy address:
2020-11-06 15:47:39.273990-0700 xctest[47182:2741407] 0x10002143b6e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274067-0700 xctest[47182:2741407] 0x10002143b6f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274157-0700 xctest[47182:2741407] 0x10002143b700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274265-0700 xctest[47182:2741407] 0x10002143b710: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274326-0700 xctest[47182:2741407] 0x10002143b720: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274419-0700 xctest[47182:2741407] =>0x10002143b730: 00 00 00 00 00 00 00 00 f1 f1 f1 f1[01]f3 f3 f3
2020-11-06 15:47:39.274529-0700 xctest[47182:2741407] 0x10002143b740: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274609-0700 xctest[47182:2741407] 0x10002143b750: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274754-0700 xctest[47182:2741407] 0x10002143b760: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274823-0700 xctest[47182:2741407] 0x10002143b770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274904-0700 xctest[47182:2741407] 0x10002143b780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
2020-11-06 15:47:39.274969-0700 xctest[47182:2741407] Shadow byte legend (one shadow byte represents 8 application bytes):
2020-11-06 15:47:39.275105-0700 xctest[47182:2741407] Addressable: 00
2020-11-06 15:47:39.275183-0700 xctest[47182:2741407] Partially addressable: 01 02 03 04 05 06 07
2020-11-06 15:47:39.275238-0700 xctest[47182:2741407] Heap left redzone: fa
2020-11-06 15:47:39.275349-0700 xctest[47182:2741407] Freed heap region: fd
2020-11-06 15:47:39.275440-0700 xctest[47182:2741407] Stack left redzone: f1
2020-11-06 15:47:39.275499-0700 xctest[47182:2741407] Stack mid redzone: f2
2020-11-06 15:47:39.275594-0700 xctest[47182:2741407] Stack right redzone: f3
2020-11-06 15:47:39.275647-0700 xctest[47182:2741407] Stack after return: f5
2020-11-06 15:47:39.275709-0700 xctest[47182:2741407] Stack use after scope: f8
2020-11-06 15:47:39.275749-0700 xctest[47182:2741407] Global redzone: f9
2020-11-06 15:47:39.275838-0700 xctest[47182:2741407] Global init order: f6
2020-11-06 15:47:39.275905-0700 xctest[47182:2741407] Poisoned by user: f7
2020-11-06 15:47:39.275996-0700 xctest[47182:2741407] Container overflow: fc
2020-11-06 15:47:39.276094-0700 xctest[47182:2741407] Array cookie: ac
2020-11-06 15:47:39.276177-0700 xctest[47182:2741407] Intra object redzone: bb
2020-11-06 15:47:39.276229-0700 xctest[47182:2741407] ASan internal: fe
2020-11-06 15:47:39.276335-0700 xctest[47182:2741407] Left alloca redzone: ca
2020-11-06 15:47:39.276429-0700 xctest[47182:2741407] Right alloca redzone: cb
2020-11-06 15:47:39.276583-0700 xctest[47182:2741407] Shadow gap: cc
==47182==ABORTING
Warning: hit breakpoint while running function, skipping commands and conditions to prevent recursion.
AddressSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report.
(lldb) thread info -s
thread #3: tid = 0x29d49f, 0x000000010016ab20 libclang_rt.asan_osx_dynamic.dylib`__asan::AsanDie(), queue = 'GoSwiftly[1]', stop reason = Stack buffer overflow
{
"access_size": 5664,
"access_type": 0,
"address": 4464687585,
"description": "stack-buffer-overflow",
"instrumentation_class": "AddressSanitizer",
"pc": 4296239738,
"stop_type": "fatal_error"
}
(lldb)
Hi!
Wonderful and interesting project!
I was wondering if you're planning to support Cocoapod in future release.
Thank you!
32-bit architecture support required if we want to use SwiftCoroutine in large projects
Looking at the documentation and test codes, it doesn't seem like there is a way to signal the cause of the cancellation of the channel.
I think it would be nice to know why the channel was aborted.
I have two objects that call makeIterator()
on the same instance of a CoChannel
, and only the first caller is receiving values:
class SomeClass {
func observe(channel: CoChannel<SomeData?>) {
scheduler.startCoroutine(in: scope) { [weak self] in
for item in channel.makeIterator() {
self?.item = item
}
}
}
}
let obj1 = SomeClass()
let obj2 = SomeClass()
obj1.observe(channel: someChannel) // this one receives
obj2.observe(channel: someChannel) // this one doesn't
It seems like all the methods on a CoChannel
only allow consuming the value (remove and return), and I'm guessing that may be the reason the second observer never receives anything.
Is it possible to just peek, and therefore allow have multiple observers, like Observable
of Rx or SharedFlow
of Kotlin coroutine?
In Kotlin and C#, there are ways to await several coroutines in a collection at the same time, namely Collection<Deferred<T>>.awaitAll()
and Task.WhenAll(IEnumerable<Task>)
respectively. I now have a list of several CoFuture<Void>
in an array (the amount of futures is dynamic) that I want to await at the same time instead of individually. Can I do this with current API?
Another feature request:
Go has a select
statement that facilitates the use of multiple channels simultaneously for timers, out-of-band control, etc.
Are you planning to add something similar?
Hi, I am experiencing crashes in our code when using intense recursion (lots of recursive calls) inside a coroutine block. I have been able to reproduce it in a test inside the project. This is the code:
func testRecursive() {
let exp = expectation(description: "testRecursive")
exp.expectedFulfillmentCount = 1
DispatchQueue.global().startCoroutine {
try self.recursiveFunction(count: 0)
exp.fulfill()
}
wait(for: [exp], timeout: 3)
}
private func recursiveFunction(count: Int) throws {
let _ = try Coroutine.await { callback in
DispatchQueue.global().async {
callback("random_response")
}
}
print(count)
if count < 10000 {
try recursiveFunction(count: count + 1)
}
}
The number of iterations that made the code crash depends on the size of the returned result in the callback function; a more complex object will make the code crash before.
I've tried using Coroutine.await
as in this sample code, but also using CoFuture
but it'll always crash eventually. Is it a memory issue? Am I doing something conceptually wrong here?
Thank you!
Getting this error when building/resuming my project for previews with SwiftCoroutine whereas normal build is successful.
in file CoPromise.swift, line: 19
extension CoPromise {
@inlinable public convenience init() {
self.init(_result: nil) --> Initializer 'init(_result:)' is internal and cannot be referenced from an '@inlinable' function
}
Javascript Generators allow for both input and output arguments in their yield
:
`[input] = yield [output]`
I have found this incredibly useful in using coroutines that typically either:
Generator<Void, Output>
Generator<Input, Output>
Generator<Input, Void>
Is it possible to extend Generator
in this way?
Let me say, I love the ambition of this project! Having been a swift dev for a few years, I recently jumped into javascript and kotlin, and have found async function generators , coroutines and structured concurrency to be the single most important revolution in language design in a generation. Having to go back to using RxFeedback
with switch yard state-machines fills me with dread.
Some motivating examples:
Notice in the examples below how coroutines allow for much more elegant way to store state and correctly consume a sequence (i.e. a grammar) of events.
An async state machine can also be beautifully coded as a Generator<Event, State>
with events sent to the machine using let newState = stateflow.next(event)
I have a server-side generator that creates websocket events:
async function* videoDownloader({
localVideoFilePath,
videoURL,
videoID
}) {
yield State.Initial
const localFileStream = fs.createWriteStream(localVideoFilePath)
const localFileCompleted = new Promise(resolve => localFileStream.once('close', () => resolve()))
const videoPipe = videoStream
.pipe(localFileStream)
const opened = new Promise(resolve => videoPipe.once('open', () => resolve()))
const closed = new Promise(resolve => videoPipe.once('close', () => resolve({
event: 'close'
})))
const error = new Promise(resolve => videoPipe.once('error', error => resolve({
event: 'close',
error: error
})))
await opened
const result = await Promise.race([closed, error])
switch (result.event) {
case 'closed':
yield State.Complete
break
case 'error':
yield State.Error(result.message)
}
}
with a client-side consumer that monitors so:
function* processDownload() {
var next = yield
expect(next, 'Initial')
next = yield
expect(next, 'ReceivedResponse')
processMonitor.videoMetadata = next['0']
processMonitor.videoMetadata.json = processMonitor.videoMetadataJson
processMonitor.videoDuration = parseInt(processMonitor.videoMetadata.length.slice(0, -2))
next = yield
expect(next, 'Downloading')
do {
const percent = next['0']
downloadProgress.progress('set percent', percent)
downloadProgress.progress('set label', `Downloading ${percent.toFixed(0)}%`)
downloadProgress.progress('set bar label', `${percent.toFixed(0)}%`)
next = yield
} while (next._name === 'Downloading')
expect(next, 'Complete')
downloadProgress.progress('set success', 'Video download complete')
processMonitor.download.isActive = false
processMonitor.download.isCompleted = true
processMonitor.conversion.isActive = true
}
Or for android / kotlin I use a builder function to implement a coroutine-based state machine so:
@ExperimentalCoroutinesApi
@FlowPreview
private val stateFlow = StateFlow<Mode, Event> {
uninitialized@ while (true) {
yield(Mode.Uninitialized) thenRequire Command.Initialize
yield(Mode.Initializing) thenRequire Response.Initialized
when (yield(Mode.Initialized)) {
is Command.Prepare -> {
yield(Mode.Preparing) thenRequire Response.Prepared
}
Command.Uninitialize -> {
yield(Mode.Uninitializing) thenRequire Response.Uninitialized
continue@uninitialized
}
else -> exception()
}
ready@ while (true) {
when (yield(Mode.Ready)) {
Command.Play -> {
when (yield(Mode.Playing)) {
Command.Stop -> {
yield(Mode.Stopping) thenRequire Response.Stopped
continue@ready
}
Response.Stopped -> continue@ready
else -> exception()
}
}
is Command.Prepare -> {
yield(Mode.Preparing) thenRequire Response.Prepared
continue@ready
}
Command.Uninitialize -> {
yield(Mode.Uninitializing) thenRequire Response.Uninitialized
continue@uninitialized
}
else -> exception()
}
}
}
Response.Completed
}
Please note the examples above are chopped down and thus prototype code only.
Hello,
I created a test program that calculates many points for x^2 on 4 threads. However after running in Xcode 13 with 'Thread Sanitizer' on, it keeps alerting me about a race condition on the first line of 'getFreeQueue()'. This is on an iPhone 12 Pro Simulator running iOS 15.
As this is likely just me not understanding how to use the library, any help would be greatly appreciated!
struct Point {
var x: Double
var y: Double
}
class TestingAsyncModel: ObservableObject {
@Published var text: String = ""
func getPoints(min: Double, max: Double, numThreads: Int, function: @escaping (Double) -> Double) -> CoFuture<[Point]> {
func getPoints(min: Double, max: Double) -> CoFuture<[Point]> {
return DispatchQueue.global().coroutineFuture {
return stride(from: min, through: max, by: 0.01).map { x in
return Point(x: x, y: function(x))
}
}
}
let spread = (max - min)/Double(numThreads)
let coroutines = stride(from: min, to: max, by: spread).map { start in
return getPoints(min: start, max: start + spread)
}
return DispatchQueue.global().coroutineFuture {
return try coroutines.flatMap {try $0.await()}
}
}
init() {
DispatchQueue.main.startCoroutine { [weak self] in
self?.text = "start"
let pointsFuture = self?.getPoints(min: -100, max: 100, numThreads: 4) { x in
return x * x
}
guard let points = try pointsFuture?.await() else {
return
}
self?.text = points.count.description
}
}
}
struct TestingAsyncView: View {
@ObservedObject var model: TestingAsyncModel
var body: some View {
Text(model.text)
}
}
Hello dev:
UnitTest CoFutureAwaitTests testNestetAwaits
fail when swift test
for this project on macOS 10.14.6
. Thanks.
> swift test
// …
Test Case '-[SwiftCoroutineTests.CoFutureAwaitTests testConcurrency]' started.
Test Case '-[SwiftCoroutineTests.CoFutureAwaitTests testConcurrency]' passed (1.900 seconds).
Test Case '-[SwiftCoroutineTests.CoFutureAwaitTests testNestetAwaits]' started.
Exited with signal code 11
Calling the below code crashes with
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value: file SwiftCoroutine/SharedCoroutine.swift, line 112
.
The crashing version:
let scheduler = DispatchQueue.main
let repo = SomeRepository()
class SomeRepository {
func getSomethingAsync() throws -> [String] {
return try Coroutine.await { (continuation) in
try! Coroutine.delay(.seconds(2))
continuation(["foo", "bar", "baz",])
}
}
}
func foo() {
scheduler.startCoroutine {
do {
let something = try repo.getSomethingAsync()
print(something)
} catch {
#warning("TODO: handle error")
}
}
}
However, this is fine:
class SomeRepository {
func getSomethingAsync() throws -> [String] {
// getSomethingAsync is guaranteed to be called inside a coroutine
try! Coroutine.delay(.seconds(2))
return ["foo", "bar", "baz",]
}
}
Not sure if this is expected behavior.
If it is, I think it might be a good idea to mention dos and don'ts in the documentation.
I noticed some weird behavior in my projects concerning CoChannel
s, and I wasn't sure if I was using it wrong or there was something buggy going on.
I have a scoped coroutine running and
self
is captured with unowned
.Not sure if I'm explaining the situation correctly, so I have a demo target here.
I also noticed that all the CoScope
s are kepts around when the memory graph debugger is run like so:
The objects that own the CoScope
instances are deallocated as expected.
The slowing down (or rather the skipping values) corresponds to the number of zombie CoScope
instances.
So when there are four CoScope
instances lying around, the log prints like so
9122080394873498997
showInt(_:) 9122080394873498997
4655395568503796474
432049987236061310
1887288328159798314
1946205301628222178
showInt(_:) 1946205301628222178
(I also noticed other weird behavior with my real project like objects captured by the SwiftCoroutine and not deallocating, but I'm not sure if it's in any way related to the issue demonstrated by the sample project. I can provide further information if you're interested.)
Sorry about the haphazard reporting, but it was hard to determine if they all pointed to the same cause or if they were all separate, so I decided to just lay it out.
I tried running the tests on iOS 10 simulator. Some problems came up.
CoFutureAwaitTests.testConcurrency was stuck
It seems the test scale is too large. It passed after reducing the scale.
random EXC_BAD_ACCESS after CoroutineContextTests.testInitWithPageGuard
Comment out the mprotect(stack, .pageSize, PROT_READ)
in CoroutineContext.init, or add mprotect(stack, .pageSize, PROT_READ | PROT_WRITE)
in CoroutineContext.deinit, the test passes. Maybe the granularity of protection changes is as large as an entire region, as the document said.
https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/mprotect.2.html
So I'm curious why the requirement is iOS 11.0+.
I'm not sure if this is where I should bring this up but it'll do for now, I guess. Anyway, is there a recommended way to handle callbacks that return enums like Swift.Result?
This library looks great. I have been trying to integrate it in an XCFramework I have. There is an issue, I am having, because it defines a C module, it turns on "Defines Module" if you turn on "Defines Module" and BUILD_LIBRARIES_FOR_DISTRIBUTION then the SwiftInterface files are not generated for that module. Not sure if this is correct behavior but it is the behavior, none the less.
See this project for an example of the issue (turning off Defines Module lets it generate the swiftinterface files). https://github.com/possen/HostApp. Turning it off, means it won't import in Application because the swiftintface files are missing.
The question becomes is there a way to either not enable "defines module" for the whole project, just that one C module, or do a pure Swift implementation?
When adding SwiftCoroutine to watchOS or tvOS targets, I am getting an error indicating that GNU-style inline assembly is disabled.
StackOverflow thread regarding the availability of inline assembly
Thank you for the work that you put into this project :)
Used memory sanitizer in xcode, and got crash:
Crashed Thread: 13 Dispatch queue: com.apple.root.default-qos
abort() called
CoreSimulator 732.17 - Device: iPhone 8 (88037FF6-637E-4827-B62A-4BD2AD70CCE6) - Runtime: iOS 12.2 (16E226) - DeviceType: iPhone 8
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Application Specific Information:
==49420==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top: 0x700004312000; bottom 0x10013c25e000; size: 0x5ffec80b4000 (105547882512384)
False positive error reports may follow
SUMMARY: AddressSanitizer: stack-buffer-overflow (/Users/admin/Library/Developer/CoreSimulator/Devices/88037FF6-637E-4827-B62A-4BD2AD70CCE6/data/Containers/Bundle/Application/F8151562-99F5-44CC-8239-92715B85CBED/MyApp.app/Frameworks/libclang_rt.asan_iossim_dynamic.dylib:x86_64+0x17e70) in wrap_memcpy+0x3a0
Shadow bytes around the buggy address:
0x020155643f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643f70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643f80: 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1
=>0x020155643f90:[01]f3 f3 f3 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643fa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x020155643fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
==49420==ABORTING
Thread 13 Crashed:: Dispatch queue: com.apple.root.default-qos
0 libsystem_kernel.dylib 0x000000011029b33a __pthread_kill + 10
1 libsystem_pthread.dylib 0x00000001102f8e60 pthread_kill + 430
2 libsystem_c.dylib 0x000000011005e0bc __abort + 144
3 libsystem_c.dylib 0x000000011005e02c abort + 142
4 libclang_rt.asan_iossim_dynamic.dylib 0x0000000104024d06 __sanitizer::Abort() + 70
5 libclang_rt.asan_iossim_dynamic.dylib 0x00000001040246f4 __sanitizer::Die() + 196
6 libclang_rt.asan_iossim_dynamic.dylib 0x000000010400c374 __asan::ScopedInErrorReport::~ScopedInErrorReport() + 420
7 libclang_rt.asan_iossim_dynamic.dylib 0x000000010400bc0e __asan::ReportGenericError(unsigned long, unsigned long, unsigned long, unsigned long, bool, unsigned long, unsigned int, bool) + 1198
8 libclang_rt.asan_iossim_dynamic.dylib 0x0000000103fdbe90 wrap_memcpy + 960
9 org.cocoapods.SwiftCoroutine 0x000000010b657f45 SharedCoroutine.saveStack() + 2053 (SharedCoroutine.swift:78)
10 org.cocoapods.SwiftCoroutine 0x000000010b65fb97 SharedCoroutineQueue.start(dispatcher:scheduler:task:) + 1143 (SharedCoroutineQueue.swift:38)
11 org.cocoapods.SwiftCoroutine 0x000000010b65cba3 closure #1 in SharedCoroutineDispatcher.execute(on:task:) + 579 (SharedCoroutineDispatcher.swift:27)
12 org.cocoapods.SwiftCoroutine 0x000000010b623821 thunk for @escaping @callee_guaranteed () -> () + 145
13 libclang_rt.asan_iossim_dynamic.dylib 0x00000001040049cb __wrap_dispatch_async_block_invoke + 203
14 libdispatch.dylib 0x000000010ff02d7f _dispatch_call_block_and_release + 12
15 libdispatch.dylib 0x000000010ff03db5 _dispatch_client_callout + 8
16 libdispatch.dylib 0x000000010ff067b9 _dispatch_queue_override_invoke + 1022
17 libdispatch.dylib 0x000000010ff14632 _dispatch_root_queue_drain + 351
18 libdispatch.dylib 0x000000010ff14fca _dispatch_worker_thread2 + 130
19 libsystem_pthread.dylib 0x00000001102f59f7 _pthread_wqthread + 220
20 libsystem_pthread.dylib 0x00000001102f4b77 start_wqthread + 15
WARNING: ThreadSanitizer: Swift access race (pid=51212)
Modifying access of Swift variable at 0x7b1000453c18 by thread T19:
#0 $s14SwiftCoroutine8CoFutureC11addCallbackyyys6ResultOyxs5Error_pGcF (SwiftCoroutine:x86_64+0x2bf68)
#1 $s14SwiftCoroutine8CoFutureC12whenCanceledyyyycF (SwiftCoroutine:x86_64+0x33b15)
#2 $s14SwiftCoroutine0B9SchedulerPAAE15coroutineFutureyAA02CoE0Cyqd__Gqd__yKclFyycfU_ (SwiftCoroutine:x86_64+0x4108d)
#3 $s14SwiftCoroutine0B9SchedulerPAAE15coroutineFutureyAA02CoE0Cyqd__Gqd__yKclFyycfU_TA (SwiftCoroutine:x86_64+0x41445)
#4 $s14SwiftCoroutine0B7ContextC12performBlock33_474932A1564BFE56FB9333EE19D4C48CLLSvyF (SwiftCoroutine:x86_64+0x3d172)
#5 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_ (SwiftCoroutine:x86_64+0x3d010)
#6 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_To (SwiftCoroutine:x86_64+0x3d330)
#7 start (SwiftCoroutine:x86_64+0x3ffa)
#8 $s14SwiftCoroutine0B7ContextC5startSbyF (SwiftCoroutine:x86_64+0x3ce5e)
#9 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0 (SwiftCoroutine:x86_64+0x4b17d)
#10 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0_TA (SwiftCoroutine:x86_64+0x4ea9d)
#11 $s14SwiftCoroutine06SharedB0C7perform33_5CCAB8CB89EE233ADAF37DFE55B1ABD1LLyAA0cB5QueueC15CompletionStateOSbyXEF (SwiftCoroutine:x86_64+0x4b21f)
#12 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU (SwiftCoroutine:x86_64+0x4b046)
#13 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_TA (SwiftCoroutine:x86_64+0x4b0ad)
#14 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TR (SwiftCoroutine:x86_64+0x4b4bb)
#15 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TRTA (SwiftCoroutine:x86_64+0x4b52d)
#16 $s14SwiftCoroutine0B8ProtocolPAAE16performAsCurrentyqd__qd__yXElF (SwiftCoroutine:x86_64+0x3eae7)
#17 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyF (SwiftCoroutine:x86_64+0x4af55)
#18 $s14SwiftCoroutine06SharedB5QueueC5start10dispatcher9scheduler4taskyAA0cB10DispatcherC_AA0B9Scheduler_pyyctF (SwiftCoroutine:x86_64+0x510e0)
#19 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_ (SwiftCoroutine:x86_64+0x4f33b)
#20 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_TA (SwiftCoroutine:x86_64+0x4f414)
#21 $sIeg_IeyB_TR (SwiftCoroutine:x86_64+0x2eec3)
#22 __tsan::invoke_and_release_block(void*) (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x70f1b)
#23 _dispatch_client_callout (libdispatch.dylib:x86_64+0x3db4)
Previous read of size 8 at 0x7b1000453c18 by thread T18:
#0 $s14SwiftCoroutine13CallbackStackV6appendySbyxcF (SwiftCoroutine:x86_64+0x1e035)
#1 $s14SwiftCoroutine8CoFutureC11addCallbackyyys6ResultOyxs5Error_pGcF (SwiftCoroutine:x86_64+0x2bfc4)
#2 $s14SwiftCoroutine8CoFutureC5awaitxyKFs6ResultOyxs5Error_pGyKXEfu_yyAHccACyxGcfu0_yyAHccfu1_ (SwiftCoroutine:x86_64+0x2d7a6)
#3 $s14SwiftCoroutine8CoFutureC5awaitxyKFs6ResultOyxs5Error_pGyKXEfu_yyAHccACyxGcfu0_yyAHccfu1_TA (SwiftCoroutine:x86_64+0x2f800)
#4 $ss6ResultOyxs5Error_pGlyxIsegn_Igg_xlyADIsegn_Iegg_lTR (SwiftCoroutine:x86_64+0x2d814)
#5 $ss6ResultOyxs5Error_pGlyxIsegn_Igg_xlyADIsegn_Iegg_lTRTA.1 (SwiftCoroutine:x86_64+0x2f7a6)
#6 $s14SwiftCoroutine06SharedB0C5awaityxyyxcXEKlF (SwiftCoroutine:x86_64+0x4d200)
#7 $s14SwiftCoroutine06SharedB0CAA0B8ProtocolA2aDP5awaityqd__yyqd__cXEKlFTW (SwiftCoroutine:x86_64+0x4e53a)
#8 $s14SwiftCoroutine8CoFutureC5awaitxyKFs6ResultOyxs5Error_pGyKXEfu_ (SwiftCoroutine:x86_64+0x2d4e5)
#9 $s14SwiftCoroutine8CoFutureC5awaitxyKFs6ResultOyxs5Error_pGyKXEfu_TA (SwiftCoroutine:x86_64+0x2d62f)
#10 $s14SwiftCoroutine8CoFutureC5awaitxyKF (SwiftCoroutine:x86_64+0x2d0f9)
#11 $s5MyApp19EntitiesServiceImplC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_y13ViperServices0lC10BootResultOctFyycfU_ (MyApp:x86_64+0x1004a07be)
#12 $s5MyApp19EntitiesServiceImplC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_y13ViperServices0lC10BootResultOctFyycfU_TA (MyApp:x86_64+0x1004a1449)
#13 $s14SwiftCoroutine0B9SchedulerPAAE05startB02in4taskyAA7CoScopeCSg_yyKctFyycfU_ (SwiftCoroutine:x86_64+0x3ffe6)
#14 $s14SwiftCoroutine0B9SchedulerPAAE05startB02in4taskyAA7CoScopeCSg_yyKctFyycfU_TA (SwiftCoroutine:x86_64+0x400f5)
#15 $s14SwiftCoroutine0B7ContextC12performBlock33_474932A1564BFE56FB9333EE19D4C48CLLSvyF (SwiftCoroutine:x86_64+0x3d172)
#16 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_ (SwiftCoroutine:x86_64+0x3d010)
#17 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_To (SwiftCoroutine:x86_64+0x3d330)
#18 start (SwiftCoroutine:x86_64+0x3ffa)
#19 $s14SwiftCoroutine0B7ContextC5startSbyF (SwiftCoroutine:x86_64+0x3ce5e)
#20 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0 (SwiftCoroutine:x86_64+0x4b17d)
#21 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0_TA (SwiftCoroutine:x86_64+0x4ea9d)
#22 $s14SwiftCoroutine06SharedB0C7perform33_5CCAB8CB89EE233ADAF37DFE55B1ABD1LLyAA0cB5QueueC15CompletionStateOSbyXEF (SwiftCoroutine:x86_64+0x4b21f)
#23 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU (SwiftCoroutine:x86_64+0x4b046)
#24 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_TA (SwiftCoroutine:x86_64+0x4b0ad)
#25 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TR (SwiftCoroutine:x86_64+0x4b4bb)
#26 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TRTA (SwiftCoroutine:x86_64+0x4b52d)
#27 $s14SwiftCoroutine0B8ProtocolPAAE16performAsCurrentyqd__qd__yXElF (SwiftCoroutine:x86_64+0x3eae7)
#28 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyF (SwiftCoroutine:x86_64+0x4af55)
#29 $s14SwiftCoroutine06SharedB5QueueC5start10dispatcher9scheduler4taskyAA0cB10DispatcherC_AA0B9Scheduler_pyyctF (SwiftCoroutine:x86_64+0x510e0)
#30 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_ (SwiftCoroutine:x86_64+0x4f33b)
ThreadSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report.
A 0
#31 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_TA (SwiftCoroutine:x86_64+0x4f414)
#32 $sIeg_IeyB_TR (SwiftCoroutine:x86_64+0x2eec3)
#33 __tsan::invoke_and_release_block(void*) (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x70f1b)
#34 _dispatch_client_callout (libdispatch.dylib:x86_64+0x3db4)
Location is heap block of size 64 at 0x7b1000453c00 allocated by thread T18:
#0 malloc (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x4ef1a)
#1 swift_slowAlloc (libswiftCore.dylib:x86_64+0x2ce3c8)
#2 $s14SwiftCoroutine9CoPromiseCACyxGycfC (SwiftCoroutine:x86_64+0x3784f)
#3 $s14SwiftCoroutine0B9SchedulerPAAE15coroutineFutureyAA02CoE0Cyqd__Gqd__yKclF (SwiftCoroutine:x86_64+0x40bb6)
#4 $s5MyApp19EntitiesServiceImplC16loadStoryEffects33_CF1F1424D0659537F27DBA3EFCD861E7LL14SwiftCoroutine8CoFutureCyytGyF (MyApp:x86_64+0x1004d8677)
#5 $s5MyApp19EntitiesServiceImplC4boot13launchOpt[DefaultViperServicesContainer]: Still booting ["StateService", "ApphudService", "AnalyticsService", "ExtensionService", "GdprService", "PremiumService", "SmartNewsService", "PushNotificationsService"]ions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_y13ViperServices0lC10BootResultOctFyycfU_ (MyApp:x86_64+0x1004a0791)
#6 $s5MyApp19EntitiesServiceImplC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_y13ViperServices0lC10BootResultOctFyycfU_TA (MyApp:x86_64+0x1004a1449)
#7 $s14SwiftCoroutine0B9SchedulerPAAE05startB02in4taskyAA7CoScopeCSg_yyKctFyycfU_ (SwiftCoroutine:x86_64+0x3ffe6)
#8 $s14SwiftCoroutine0B9SchedulerPAAE05startB02in4taskyAA7CoScopeCSg_yyKctFyycfU_TA (SwiftCoroutine:x86_64+0x400f5)
#9 $s14SwiftCoroutine0B7ContextC12performBlock33_474932A1564BFE56FB9333EE19D4C48CLLSvyF (SwiftCoroutine:x86_64+0x3d172)
#10 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_ (SwiftCoroutine:x86_64+0x3d010)
#11 $s14SwiftCoroutin
e0B7ContextC5startSbyFySVSgcfU_To (SwiftCoroutine:x86_64+0x3d330)
#12 start (SwiftCoroutine:x86_64+0x3ffa)
#13 $s14SwiftCoroutine0B7ContextC5startSbyF (SwiftCoroutine:x86_64+0x3ce5e)
#14 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0 (SwiftCoroutine:x86_64+0x4b17d)
#15 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0_TA (SwiftCoroutine:x86_64+0x4ea9d)
#16 $s14SwiftCoroutine06SharedB0C7perform33_5CCAB8CB89EE233ADAF37DFE55B1ABD1LLyAA0cB5QueueC15CompletionStateOSbyXEF (SwiftCoroutine:x86_64+0x4b21f)
#17 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU (SwiftCoroutine:x86_64+0x4b046)
#18 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_TA (SwiftCoroutine:x86_64+0x4b0ad)
#19 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TR (SwiftCoroutine:x86_64+0x4b4bb)
#20 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TRTA (SwiftCoroutine:x86_64+0x4b52d)
#21 $s14SwiftCoroutine0B8ProtocolPAAE16performAsCurrentyqd__qd__yXElF (SwiftCoroutine:x86_64+0x3eae7)
#22 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyF (SwiftCoroutine:x86_64+0x4af55)
#23 $s14SwiftCoroutine06SharedB5QueueC5start10dispatcher9scheduler4taskyAA0cB10DispatcherC_AA0B9Scheduler_pyyctF (SwiftCoroutine:x86_64+0x510e0)
#24 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_ (SwiftCoroutine:x86_64+0x4f33b)
#25 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_TA (SwiftCoroutine:x86_64+0x4f414)
#26 $sIeg_IeyB_TR (SwiftCoroutine:x86_64+0x2eec3)
#27 __tsan::invoke_and_release_block(void*) (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x70f1b)
#28 _dispatch_client_callout (libdispatch.dylib:x86_64+0x3db4)
Thread T19 (tid=5147481, running) is a GCD worker thread
Thread T18 (tid=5147475, running) is a GCD worker thread
WARNING: ThreadSanitizer: Swift access race (pid=51212)
Modifying access of Swift variable at 0x7b140011cb70 by thread T18:
#0 $s14SwiftCoroutine06SharedB10DispatcherC4pushyyAA0cB5QueueCF (SwiftCoroutine:x86_64+0x4f912)
#1 $s14SwiftCoroutine06SharedB5QueueC11performNext022_8C5C69B88B6EDEB22EAD6G9DF7AA0AADLL3foryAA0cB10DispatcherC_tF (SwiftCoroutine:x86_64+0x522d2)
#2 $s14SwiftCoroutine06SharedB5QueueC8complete022_8C5C69B88B6EDEB22EAD6F9DF7AA0AADLL4withyAC15CompletionStateO_tF (SwiftCoroutine:x86_64+0x5160c)
#3 $s14SwiftCoroutine06SharedB5QueueC5start10dispatcher9scheduler4taskyAA0cB10DispatcherC_AA0B9Scheduler_pyyctF (SwiftCoroutine:x86_64+0x51109)
#4 $s14SwiftCoroutine0B7ContextC12performBlock33_474932A1564BFE56FB9333EE19D4C48CLLSvyF (SwiftCoroutine:x86_64+0x3d172)
#5 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_ (SwiftCoroutine:x86_64+0x3d010)
#6 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_To (SwiftCoroutine:x86_64+0x3d330)
#7 start (SwiftCoroutine:x86_64+0x3ffa)
#8 $s14SwiftCoroutine0B7ContextC5startSbyF (SwiftCoroutine:x86_64+0x3ce5e)
#9 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0 (SwiftCoroutine:x86_64+0x4b17d)
#10 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0_TA (SwiftCoroutine:x86_64+0x4ea9d)
#11 $s14SwiftCoroutine06SharedB0C7perform33_5CCAB8CB89EE233ADAF37DFE55B1ABD1LLyAA0cB5QueueC15CompletionStateOSbyXEF (SwiftCoroutine:x86_64+0x4b21f)
#12 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU (SwiftCoroutine:x86_64+0x4b046)
#13 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_TA (SwiftCoroutine:x86_64+0x4b0ad)
#14 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TR (SwiftCoroutine:x86_64+0x4b4bb)
#15 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TRTA (SwiftCoroutine:x86_64+0x4b52d)
#16 $s14SwiftCoroutine0B8ProtocolPAAE16performAsCurrentyqd__qd__yXElF (SwiftCoroutine:x86_64+0x3eae7)
#17 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyF (SwiftCoroutine:x86_64+0x4af55)
#18 $s14SwiftCoroutine06SharedB5QueueC5start10dispatcher9scheduler4taskyAA0cB10DispatcherC_AA0B9Scheduler_pyyctF (SwiftCoroutine:x86_64+0x510e0)
#19 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_ (SwiftCoroutine:x86_64+0x4f33b)
#20 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_TA (SwiftCoroutine:x86_64+0x4f414)
#21 $sIeg_IeyB_TR (SwiftCoroutine:x86_64+0x2eec3)
#22 __tsan::invoke_and_release_block(void*) (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x70f1b)
#23 _dispatch_client_callout (libdispatch.dylib:x86_64+0x3db4)
Previous modifying access of Swift variable at 0x7b140011cb70 by thread T19:
#0 $s14SwiftCoroutine9FifoQueueV3popxSgyF (SwiftCoroutine:x86_64+0x474bf)
#1 $s14SwiftCoroutine06SharedB10DispatcherC12getFreeQueue33_1A5FB05E2411224CDC4772F9B26581BDLLAA0cbG0CyF (SwiftCoroutine:x86_64+0x4f50d)
#2 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_ (SwiftCoroutine:x86_64+0x4f31c)
#3 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_TA (SwiftCoroutine:x86_64+0x4f414)
#4 $sIeg_IeyB_TR (SwiftCoroutine:x86_64+0x2eec3)
#5 __tsan::invoke_and_release_block(void*) (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x70f1b)
#6 _dispatch_client_callout (libdispatch.dylib:x86_64+0x3db4)
Location is heap block of size 72 at 0x7b140011cb50 allocated by main thread:
#0 malloc (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x4ef1a)
#1 swift_slowAlloc (libswiftCore.dylib:x86_64+0x2ce3c8)
#2 globalinit_33_1A5FB05E2411224CDC4772F9B26581BD_func0 (SwiftCoroutine:x86_64+0x4eb5b)
#3 dispatch_once (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x71794)
#4 dispatch_once_f (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x71880)
#5 swift_once (libswiftCore.dylib:x86_64+0x2f0578)
#6 $s14SwiftCoroutine0B9SchedulerPAAE06_startB0yyyycF (SwiftCoroutine:x86_64+0x3fb20)
#7 $s14SwiftCoroutine0B9SchedulerPAAE05startB02in4taskyAA7CoScopeCSg_yyKctF (SwiftCoroutine:x86_64+0x3ff2c)
#8 $s5MyApp19EntitiesServiceImplC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_y13ViperServices0lC10BootResultOctF (MyApp:x86_64+0x1004a04ca)
#9 $s5MyApp19EntitiesServiceImplC13ViperServices0eC0AadEP4boot13launchOptions10completionySDySo019UIApplicationLaunchI3KeyaypGSg_yAD0eC10BootResultOctFTW (MyApp:x86_64+0x1004e3e88)
#10 $s13ViperServices07DefaultaB9ContainerC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_yAA0abD10BootResultOctFyyyccfU_0E4NextL_yyFyycfU3_ (ViperServices:x86_64+0xff28)
#11 $s13ViperServices07DefaultaB9ContainerC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_yAA0abD10BootResultOctFyyyccfU_0E4NextL_yyFyycfU3_TA (ViperServices:x86_64+0x1c58c)
#12 $s13ViperServices07DefaultaB9ContainerC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_yAA0abD10BootResultOctFyyyccfU_0E4NextL_yyFyycfU4_ (ViperServices:x86_64+0x112f7)
#13 $s13ViperServices07DefaultaB9ContainerC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_yAA0abD10BootResultOctFyyyccfU_0E4NextL_yyFyycfU4_TA (ViperServices:x86_64+0x1c625)
#14 $sIeg_IeyB_TR (ViperServices:x86_64+0x11393)
#15 __tsan::invoke_and_release_block(void*) (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x70f1b)
#16 _dispatch_client_callout (libdispatch.dylib:x86_64+0x3db4)
#17 start (libdyld.dylib:x86_64+0x1540)
Thread T18 (tid=5147475, running) is a GCD worker thread
Thread T19 (tid=5147481, running) is a GCD worker thread
WARNING: ThreadSanitizer: Swift access race (pid=51212)
Modifying access of Swift variable at 0x7b140011cb80 by thread T18:
#0 $s14SwiftCoroutine9FifoQueueV4pushyyxF (SwiftCoroutine:x86_64+0x45dff)
#1 $s14SwiftCoroutine06SharedB10DispatcherC4pushyyAA0cB5QueueCF (SwiftCoroutine:x86_64+0x4f934)
#2 $s14SwiftCoroutine06SharedB5QueueC11performNext022_8C5C69B88B6EDEB22EAD6G9DF7AA0AADLL3foryAA0cB10DispatcherC_tF (SwiftCoroutine:x86_64+0x522d2)
#3 $s14SwiftCoroutine06SharedB5QueueC8complete022_8C5C69B88B6EDEB22EAD6F9DF7AA0AADLL4withyAC15CompletionStateO_tF (SwiftCoroutine:x86_64+0x5160c)
#4 $s14SwiftCoroutine06SharedB5QueueC5start10dispatcher9scheduler4taskyAA0cB10DispatcherC_AA0B9Scheduler_pyyctF (SwiftCoroutine:x86_64+0x51109)
#5 $s14SwiftCoroutine0B7ContextC12performBlock33_474932A1564BFE56FB9333EE19D4C48CLLSvyF (SwiftCoroutine:x86_64+0x3d172)
#6 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_ (SwiftCoroutine:x86_64+0x3d010)
#7 $s14SwiftCoroutine0B7ContextC5startSbyFySVSgcfU_To (SwiftCoroutine:x86_64+0x3d330)
#8 start (SwiftCoroutine:x86_64+0x3ffa)
#9 $s14SwiftCoroutine0B7ContextC5startSbyF (SwiftCoroutine:x86_64+0x3ce5e)
#10 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0 (SwiftCoroutine:x86_64+0x4b17d)
#11 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_SbycAA0B7ContextCcfu_Sbycfu0_TA (SwiftCoroutine:x86_64+0x4ea9d)
#12 $s14SwiftCoroutine06SharedB0C7perform33_5CCAB8CB89EE233ADAF37DFE55B1ABD1LLyAA0cB5QueueC15CompletionStateOSbyXEF (SwiftCoroutine:x86_64+0x4b21f)
#13 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU (SwiftCoroutine:x86_64+0x4b046)
#14 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyFAHyXEfU_TA (SwiftCoroutine:x86_64+0x4b0ad)
#15 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TR (SwiftCoroutine:x86_64+0x4b4bb)
#16 $s14SwiftCoroutine06SharedB5QueueC15CompletionStateOIgd_AEIegr_TRTA (SwiftCoroutine:x86_64+0x4b52d)
#17 $s14SwiftCoroutine0B8ProtocolPAAE16performAsCurrentyqd__qd__yXElF (SwiftCoroutine:x86_64+0x3eae7)
#18 $s14SwiftCoroutine06SharedB0C5startAA0cB5QueueC15CompletionStateOyF (SwiftCoroutine:x86_64+0x4af55)
#19 $s14SwiftCoroutine06SharedB5QueueC5start10dispatcher9scheduler4taskyAA0cB10DispatcherC_AA0B9Scheduler_pyyctF (SwiftCoroutine:x86_64+0x510e0)
#20 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_ (SwiftCoroutine:x86_64+0x4f33b)
#21 $s14SwiftCoroutine06SharedB10DispatcherC7execute2on4taskyAA0B9Scheduler_p_yyctFyycfU_TA (SwiftCoroutine:x86_64+0x4f414)
#22 $sIeg_IeyB_TR (SwiftCoroutine:x86_64+0x2eec3)
#23 __tsan::invoke_and_release_block(void*) (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x70f1b)
#24 _dispatch_client_callout (libdispatch.dylib:x86_64+0x3db4)
Previous write of size 1 at 0x7b140011cb80 by thread T19:
[failed to restore the stack]
Location is heap block of size 72 at 0x7b140011cb50 allocated by main thread:
#0 malloc (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x4ef1a)
#1 swift_slowAlloc (libswiftCore.dylib:x86_64+0x2ce3c8)
#2 globalinit_33_1A5FB05E2411224CDC4772F9B26581BD_func0 (SwiftCoroutine:x86_64+0x4eb5b)
#3 dispatch_once (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x71794)
#4 dispatch_once_f (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x71880)
#5 swift_once (libswiftCore.dylib:x86_64+0x2f0578)
#6 $s14SwiftCoroutine0B9SchedulerPAAE06_startB0yyyycF (SwiftCoroutine:x86_64+0x3fb20)
#7 $s14SwiftCoroutine0B9SchedulerPAAE05startB02in4taskyAA7CoScopeCSg_yyKctF (SwiftCoroutine:x86_64+0x3ff2c)
#8 $s5MyApp19EntitiesServiceImplC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_y13ViperServices0lC10BootResultOctF (MyApp:x86_64+0x1004a04ca)
#9 $s5MyApp19EntitiesServiceImplC13ViperServices0eC0AadEP4boot13launchOptions10completionySDySo019UIApplicationLaunchI3KeyaypGSg_yAD0eC10BootResultOctFTW (MyApp:x86_64+0x1004e3e88)
#10 $s13ViperServices07DefaultaB9ContainerC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_yAA0abD10BootResultOctFyyyccfU_0E4NextL_yyFyycfU3_ (ViperServices:x86_64+0xff28)
#11 $s13ViperServices07DefaultaB9ContainerC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_yAA0abD10BootResultOctFyyyccfU_0E4NextL_yyFyycfU3_TA (ViperServices:x86_64+0x1c58c)
#12 $s13ViperServices07DefaultaB9ContainerC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_yAA0abD10BootResultOctFyyyccfU_0E4NextL_yyFyycfU4_ (ViperServices:x86_64+0x112f7)
#13 $s13ViperServices07DefaultaB9ContainerC4boot13launchOptions10completionySDySo019UIApplicationLaunchG3KeyaypGSg_yAA0abD10BootResultOctFyyyccfU_0E4NextL_yyFyycfU4_TA (ViperServices:x86_64+0x1c625)
#14 $sIeg_IeyB_TR (ViperServices:x86_64+0x11393)
#15 __tsan::invoke_and_release_block(void*) (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x70f1b)
#16 _dispatch_client_callout (libdispatch.dylib:x86_64+0x3db4)
#17 start (libdyld.dylib:x86_64+0x1540)
Thread T18 (tid=5147475, running) is a GCD worker thread
Thread T19 (tid=5147481, running) is a GCD worker thread
SUMMARY: ThreadSanitizer: Swift access race (/Users/admin/Library/Developer/CoreSimulator/Devices/88037FF6-637E-4827-B62A-4BD2AD70CCE6/data/Containers/Bundle/Application/89A141C1-2DC8-4A6C-B3DB-65CC1E2A08F7/MyApp.app/Frameworks/SwiftCoroutine.framework/SwiftCoroutine:x86_64+0x45dff) in $s14SwiftCoroutine9FifoQueueV4pushyyxF+0x38f
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.