kevin.cianfarini
12/30/2022, 3:24 PMstatic inline void io_uring_prep_rw(int op, struct io_uring_sqe *sqe, int fd,
const void *addr, unsigned len,
__u64 offset)
{
fprintf(stdout, "SQE pointer %p", sqe);
For the life of me I cannot get this to be printed to stdout and I don't know why. Calls to Kotlin's println
are working fine so I suspect there's something funky going on in kotlin native modules. Does anyone have any idea why this might be happening?mbonnin
12/30/2022, 3:29 PMmbonnin
12/30/2022, 3:29 PMSystem.out.flush()
mbonnin
12/30/2022, 3:30 PMmbonnin
12/30/2022, 3:30 PMmbonnin
12/30/2022, 3:31 PMfflush(stdout)
kevin.cianfarini
12/30/2022, 3:31 PMkevin.cianfarini
12/30/2022, 3:31 PMkevin.cianfarini
12/30/2022, 3:31 PMWhen printing (e.g.), the output is put into a buffer and may not be written to the console until a newline character is displayed.printf
Landry Norris
12/30/2022, 3:31 PMkevin.cianfarini
12/30/2022, 3:31 PMkevin.cianfarini
12/30/2022, 3:31 PMkevin.cianfarini
12/30/2022, 3:32 PMlinuxX64
mbonnin
12/30/2022, 3:32 PMmbonnin
12/30/2022, 3:32 PMkevin.cianfarini
12/30/2022, 3:32 PMLandry Norris
12/30/2022, 3:33 PMkevin.cianfarini
12/30/2022, 3:33 PMrunInterruptible
should be a think on posix native with signals 😬kevin.cianfarini
12/30/2022, 3:35 PMkevin.cianfarini
12/30/2022, 3:36 PMlaunch
something with a reference to that pointer my C code segfaultskevin.cianfarini
12/30/2022, 3:36 PMLandry Norris
12/30/2022, 3:38 PMkevin.cianfarini
12/30/2022, 3:38 PMmbonnin
12/30/2022, 3:39 PMLandry Norris
12/30/2022, 3:40 PMkevin.cianfarini
12/30/2022, 3:53 PM$ ./build/bin/linuxX64/debugExecutable/kotlin-io-uring.kexe
Kotlin: Got SQE: SubmissionQueueEntry(pointer=CPointer(raw=0x7f7871fdc000)).
Kotlin: Prepping nop with SubmissionQueueEntry(pointer=CPointer(raw=0x7f7871fdc000)).
C: Prepping nop.
C: SQE pointer 0x7f7871fdc000
C: Setting SQE opcode to 0
Segmentation fault (core dumped)
kevin.cianfarini
12/30/2022, 3:55 PMLandry Norris
12/30/2022, 3:55 PMkevin.cianfarini
12/30/2022, 3:56 PMkevin.cianfarini
12/30/2022, 3:56 PMLandry Norris
12/30/2022, 3:56 PMkevin.cianfarini
12/30/2022, 3:56 PMrunBlocking
kevin.cianfarini
12/30/2022, 3:56 PMkevin.cianfarini
12/30/2022, 3:59 PMpublic fun main(): Unit = runBlocking {
URing(QueueDepth(2u), 0u, this).use { ring ->
val sqe = ring.getSubmissionQueueEntry()!!
println("Kotlin: Got SQE: $sqe.")
launch { ring.noOp(sqe) }
}
}
Works:
public fun main(): Unit = runBlocking {
URing(QueueDepth(2u), 0u, this).use { ring ->
val sqe = ring.getSubmissionQueueEntry()!!
println("Kotlin: Got SQE: $sqe.")
ring.noOp(sqe)
}
}
kevin.cianfarini
12/30/2022, 4:00 PMring.noOp
is a suspend function that looks like this.
public suspend fun noOp(entry: SubmissionQueueEntry) {
return suspendCancellableCoroutine { cont ->
val ref = StableRef.create(cont)
println("Kotlin: Prepping nop with $entry.")
io_uring_prep_nop(entry.pointer)
io_uring_sqe_set_data64(entry.pointer, ref.userData)
cont.registerIOUringCancellation(ring, entry, ref)
io_uring_submit(ring.ptr)
}
}
kevin.cianfarini
12/30/2022, 4:00 PMio_uring_prep_nop
only when launched.kevin.cianfarini
12/30/2022, 4:01 PMLandry Norris
12/30/2022, 4:02 PMkevin.cianfarini
12/30/2022, 4:03 PMkevin.cianfarini
12/30/2022, 4:03 PMmbonnin
12/30/2022, 4:03 PMpublic fun main(): Unit = runBlocking {
URing(QueueDepth(2u), 0u, this).use { ring ->
val sqe = ring.getSubmissionQueueEntry()!!
println("Kotlin: Got SQE: $sqe.")
launch { ring.noOp(sqe) }
}
}
Your noOp
here might be executed after use()
kevin.cianfarini
12/30/2022, 4:03 PMLandry Norris
12/30/2022, 4:03 PMmbonnin
12/30/2022, 4:03 PMuse
as the JVM one, it's most likely closing your ringkevin.cianfarini
12/30/2022, 4:04 PMkevin.cianfarini
12/30/2022, 4:04 PMkevin.cianfarini
12/30/2022, 4:04 PMkevin.cianfarini
12/30/2022, 4:04 PMkevin.cianfarini
12/30/2022, 4:05 PMLandry Norris
12/30/2022, 4:05 PMkevin.cianfarini
12/30/2022, 4:05 PMkevin.cianfarini
12/30/2022, 4:06 PMkevin.cianfarini
12/30/2022, 4:06 PMkevin.cianfarini
12/30/2022, 4:07 PMgit reset --hard
kevin.cianfarini
12/30/2022, 4:11 PMsuspend fun withIOUring(block: suspend CoroutineScope.(URing) -> Unit)
kevin.cianfarini
12/30/2022, 4:11 PM