Kavan
01/09/2020, 4:18 PMdispatch("Hello") {
println("Printing $it from Thread Started \n")
}
and not with this ?
dispatch("Hello") {
println(it)
println("Printing from Thread Started \n")
}
Code:
fun <P, T> dispatch(param: P, block: (P) -> T) {
val ref = StableRef.create(param to block)
pthread_create(nativeHeap.alloc<pthread_tVar>().ptr, null, staticCFunction { data: COpaquePointer? ->
data?.asStableRef<Pair<P, (P) -> T>>()?.get()?.let { it.second.invoke(it.first.freeze()) }
NULL
}.reinterpret(), ref.asCPointer())
ref.dispose()
}
Kris Wong
01/09/2020, 4:21 PMKavan
01/09/2020, 4:30 PMKris Wong
01/09/2020, 4:31 PMKavan
01/09/2020, 4:33 PMkpgalligan
01/09/2020, 4:36 PMparam
nor block
are frozen. block
is frozen at it.first.freeze()
, but you’re already in another thread, which means you already have a race conditionKris Wong
01/09/2020, 4:39 PMkpgalligan
01/09/2020, 4:40 PMKris Wong
01/09/2020, 4:41 PMkpgalligan
01/09/2020, 4:41 PMKavan
01/09/2020, 4:41 PMfun <P, T> dispatch(param: P, block: (P) -> T) {
val ref = StableRef.create(param to block)
pthread_create(nativeHeap.alloc<pthread_tVar>().ptr, null, staticCFunction { data: COpaquePointer? ->
data?.asStableRef<Pair<P, (P) -> T>>()?.get()?.let { it.second.invoke(it.first.freeze()) }
NULL
}.reinterpret(), ref.asCPointer())
sleep(6)
ref.dispose()
}
Kris Wong
01/09/2020, 4:42 PMKavan
01/09/2020, 4:42 PMkpgalligan
01/09/2020, 4:43 PMKavan
01/09/2020, 4:43 PMkpgalligan
01/09/2020, 4:43 PMKris Wong
01/09/2020, 4:44 PMkpgalligan
01/09/2020, 4:45 PMKris Wong
01/09/2020, 4:46 PMkpgalligan
01/09/2020, 4:46 PMKavan
01/09/2020, 4:47 PMKavan
01/09/2020, 4:47 PMKavan
01/09/2020, 4:50 PMKavan
01/09/2020, 4:51 PMkpgalligan
01/09/2020, 4:51 PMKavan
01/09/2020, 4:52 PMKavan
01/09/2020, 4:52 PMkpgalligan
01/09/2020, 4:53 PMkpgalligan
01/09/2020, 4:53 PMprintln("a")
...
println("b")
Kavan
01/09/2020, 4:54 PMKavan
01/09/2020, 4:55 PMkpgalligan
01/09/2020, 4:55 PMkpgalligan
01/09/2020, 4:55 PMkpgalligan
01/09/2020, 4:56 PMdata?.asStableRef<Pair<P, (P) -> T>>()?.get()?.let { it.second.invoke(it.first.freeze())
kpgalligan
01/09/2020, 4:56 PMprintln
between each so you can see where it actually crashes.Kavan
01/09/2020, 4:59 PMkpgalligan
01/09/2020, 5:00 PMKavan
01/09/2020, 5:00 PMkpgalligan
01/09/2020, 5:01 PMKavan
01/09/2020, 5:01 PMkpgalligan
01/09/2020, 5:01 PMkpgalligan
01/09/2020, 5:02 PMKavan
01/09/2020, 5:02 PMdispatch("Hello") {
println("Printing $it from Thread Started \n")
}
Kavan
01/09/2020, 5:03 PMKavan
01/09/2020, 5:04 PMKavan
01/09/2020, 5:04 PMKavan
01/09/2020, 5:04 PMkpgalligan
01/09/2020, 5:06 PMkpgalligan
01/09/2020, 5:07 PMKavan
01/09/2020, 5:10 PMKavan
01/09/2020, 5:11 PMkpgalligan
01/09/2020, 5:26 PMkpgalligan
01/09/2020, 5:27 PMprintln("a")
it.second(it.first)
println("b")
kpgalligan
01/09/2020, 5:27 PMkpgalligan
01/09/2020, 5:28 PMkpgalligan
01/09/2020, 5:29 PMKavan
01/09/2020, 5:31 PMKavan
01/09/2020, 5:33 PMKavan
01/09/2020, 5:34 PMKavan
01/09/2020, 5:35 PMkpgalligan
01/09/2020, 5:36 PMKavan
01/09/2020, 5:37 PMKavan
01/09/2020, 5:40 PMKavan
01/09/2020, 5:43 PMKavan
01/09/2020, 5:44 PMKavan
01/09/2020, 5:44 PMKavan
01/09/2020, 5:51 PMkpgalligan
01/09/2020, 5:52 PMinitRuntimeIfNeeded
fixes things, tbh. Would need to digKavan
01/09/2020, 5:54 PMkpgalligan
01/09/2020, 5:54 PMKavan
01/09/2020, 6:01 PM