[K/N][tests] Migrate interopTest tests ^KT-61259

This commit is contained in:
Alexander Shabalin
2024-03-13 23:33:31 +01:00
committed by Space Team
parent c227e60150
commit bbcc5c9aed
17 changed files with 206 additions and 251 deletions
@@ -1,29 +0,0 @@
@file:OptIn(kotlin.experimental.ExperimentalNativeApi::class, kotlin.native.runtime.NativeRuntimeApi::class)
import leakMemory.*
import kotlin.concurrent.AtomicInt
import kotlin.native.concurrent.*
import kotlin.native.Platform
import kotlin.test.*
import kotlinx.cinterop.*
val global = AtomicInt(0)
fun ensureInititalized() {
// Only needed with the legacy MM. TODO: Remove when legacy MM is gone.
kotlin.native.initRuntimeIfNeeded()
// Leak memory
StableRef.create(Any())
global.value = 1
}
fun main() {
Platform.isMemoryLeakCheckerActive = true
kotlin.native.runtime.Debugging.forceCheckedShutdown = true
assertTrue(global.value == 0)
// Created a thread, made sure Kotlin is initialized there.
test_RunInNewThread(staticCFunction(::ensureInititalized))
assertTrue(global.value == 1)
// Now exiting. With checked shutdown we will fail, complaining there're
// unfinished threads with runtimes.
}
@@ -1,15 +0,0 @@
#include "leakMemory.h"
#include <atomic>
#include <thread>
extern "C" void test_RunInNewThread(void (*f)()) {
std::atomic<bool> haveRun(false);
std::thread t([f, &haveRun]() {
f();
haveRun = true;
while (true) {}
});
t.detach();
while (!haveRun) {}
}
@@ -1,5 +0,0 @@
package leakMemory
---
void test_RunInNewThread(void (*)());
@@ -1,9 +0,0 @@
#ifdef __cplusplus
extern "C" {
#endif
void test_RunInNewThread(void (*)());
#ifdef __cplusplus
}
#endif
@@ -1,33 +0,0 @@
#include "workerSignals.h"
#include <cassert>
#include <cstring>
#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;
pthread_t t = {};
memcpy(&t, &thread, sizeof(pthread_t));
auto result = pthread_kill(t, SIGUSR1);
assert(result == 0);
}
extern "C" int getValue(void) {
return value;
}
@@ -1,2 +0,0 @@
language = C
headerFilter = **/workerSignals.h
@@ -1,13 +0,0 @@
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
void setupSignalHandler(void);
void signalThread(uint64_t thread, int value);
int getValue(void);
#ifdef __cplusplus
}
#endif
@@ -1,27 +0,0 @@
@file:OptIn(kotlin.ExperimentalStdlibApi::class, ObsoleteWorkersApi::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)
}
}