[K/N] Worker API improvements ^KT-52429
Merge-request: KT-MR-6898 Merged-by: Alexander Shabalin <Alexander.Shabalin@jetbrains.com>
This commit is contained in:
committed by
Space
parent
6e2202ad5a
commit
6f844f15e0
@@ -0,0 +1,31 @@
|
||||
#include "workerSignals.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <pthread.h>
|
||||
#include <signal.h>
|
||||
|
||||
namespace {
|
||||
|
||||
int pendingValue = 0;
|
||||
thread_local int value = 0;
|
||||
|
||||
void signalHandler(int signal) {
|
||||
value = pendingValue;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
extern "C" void setupSignalHandler(void) {
|
||||
signal(SIGUSR1, &signalHandler);
|
||||
}
|
||||
|
||||
extern "C" void signalThread(uint64_t thread, int value) {
|
||||
pendingValue = value;
|
||||
auto t = reinterpret_cast<pthread_t>(thread);
|
||||
auto result = pthread_kill(t, SIGUSR1);
|
||||
assert(result == 0);
|
||||
}
|
||||
|
||||
extern "C" int getValue(void) {
|
||||
return value;
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
language = C
|
||||
headerFilter = **/workerSignals.h
|
||||
@@ -0,0 +1,13 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
void setupSignalHandler(void);
|
||||
void signalThread(uint64_t thread, int value);
|
||||
int getValue(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,27 @@
|
||||
@file:OptIn(kotlin.ExperimentalStdlibApi::class)
|
||||
|
||||
import kotlin.native.concurrent.*
|
||||
import kotlin.test.*
|
||||
import workerSignals.*
|
||||
|
||||
const val defaultValue = 0
|
||||
const val newValue = 42
|
||||
|
||||
fun main() {
|
||||
setupSignalHandler()
|
||||
|
||||
withWorker {
|
||||
val before = execute(TransferMode.SAFE, {}) {
|
||||
getValue()
|
||||
}.result
|
||||
assertEquals(defaultValue, getValue())
|
||||
assertEquals(defaultValue, before)
|
||||
|
||||
signalThread(platformThreadId, newValue)
|
||||
val after = execute(TransferMode.SAFE, {}) {
|
||||
getValue()
|
||||
}.result
|
||||
assertEquals(defaultValue, getValue())
|
||||
assertEquals(newValue, after)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user