mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 18:38:55 +00:00
160 lines
4.3 KiB
C
160 lines
4.3 KiB
C
#include <node_api.h>
|
|
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <uv.h>
|
|
|
|
// Test mutex initialization and destruction
|
|
static napi_value test_mutex_init_destroy(napi_env env,
|
|
napi_callback_info info) {
|
|
uv_mutex_t mutex;
|
|
int result = uv_mutex_init(&mutex);
|
|
if (result != 0) {
|
|
napi_throw_error(env, NULL, "Failed to initialize mutex");
|
|
return NULL;
|
|
}
|
|
|
|
uv_mutex_destroy(&mutex);
|
|
|
|
napi_value ret;
|
|
napi_get_boolean(env, true, &ret);
|
|
return ret;
|
|
}
|
|
|
|
// Test recursive mutex
|
|
static napi_value test_mutex_recursive(napi_env env, napi_callback_info info) {
|
|
uv_mutex_t mutex;
|
|
int result = uv_mutex_init_recursive(&mutex);
|
|
if (result != 0) {
|
|
napi_throw_error(env, NULL, "Failed to initialize recursive mutex");
|
|
return NULL;
|
|
}
|
|
|
|
// Try locking multiple times
|
|
uv_mutex_lock(&mutex);
|
|
uv_mutex_lock(&mutex);
|
|
|
|
// Unlock the same number of times
|
|
uv_mutex_unlock(&mutex);
|
|
uv_mutex_unlock(&mutex);
|
|
|
|
uv_mutex_destroy(&mutex);
|
|
|
|
napi_value ret;
|
|
napi_get_boolean(env, true, &ret);
|
|
return ret;
|
|
}
|
|
|
|
// Test mutex trylock
|
|
static napi_value test_mutex_trylock(napi_env env, napi_callback_info info) {
|
|
uv_mutex_t mutex;
|
|
uv_mutex_init(&mutex);
|
|
|
|
int result = uv_mutex_trylock(&mutex);
|
|
if (result != 0) {
|
|
uv_mutex_destroy(&mutex);
|
|
napi_throw_error(env, NULL, "Failed to trylock mutex");
|
|
return NULL;
|
|
}
|
|
|
|
uv_mutex_unlock(&mutex);
|
|
uv_mutex_destroy(&mutex);
|
|
|
|
napi_value ret;
|
|
napi_get_boolean(env, true, &ret);
|
|
return ret;
|
|
}
|
|
|
|
// Test getpid and getppid
|
|
static napi_value test_process_ids(napi_env env, napi_callback_info info) {
|
|
uv_pid_t pid = uv_os_getpid();
|
|
uv_pid_t ppid = uv_os_getppid();
|
|
|
|
// Create return object with pid and ppid
|
|
napi_value obj;
|
|
napi_create_object(env, &obj);
|
|
|
|
napi_value pid_value, ppid_value;
|
|
napi_create_int32(env, pid, &pid_value);
|
|
napi_create_int32(env, ppid, &ppid_value);
|
|
|
|
napi_set_named_property(env, obj, "pid", pid_value);
|
|
napi_set_named_property(env, obj, "ppid", ppid_value);
|
|
|
|
return obj;
|
|
}
|
|
|
|
int count = 0;
|
|
// Test uv_once
|
|
static void once_callback(void) {
|
|
// Just a dummy callback
|
|
count++;
|
|
}
|
|
uv_once_t guard = UV_ONCE_INIT;
|
|
|
|
static napi_value test_uv_once(napi_env env, napi_callback_info info) {
|
|
uv_once(&guard, once_callback);
|
|
|
|
napi_value ret;
|
|
napi_create_int32(env, count, &ret);
|
|
return ret;
|
|
}
|
|
|
|
// Test uv_hrtime
|
|
static napi_value test_hrtime(napi_env env, napi_callback_info info) {
|
|
uint64_t time1 = uv_hrtime();
|
|
|
|
// Sleep for a tiny bit to ensure time passes
|
|
usleep(1000); // Sleep for 1ms
|
|
|
|
uint64_t time2 = uv_hrtime();
|
|
|
|
// Create return object with both timestamps
|
|
napi_value obj;
|
|
napi_create_object(env, &obj);
|
|
|
|
// Convert uint64_t to two int32 values (high and low bits)
|
|
// because JavaScript numbers can't safely handle 64-bit integers
|
|
napi_value time1_low, time1_high, time2_low, time2_high;
|
|
napi_create_int32(env, (int32_t)(time1 & 0xFFFFFFFF), &time1_low);
|
|
napi_create_int32(env, (int32_t)(time1 >> 32), &time1_high);
|
|
napi_create_int32(env, (int32_t)(time2 & 0xFFFFFFFF), &time2_low);
|
|
napi_create_int32(env, (int32_t)(time2 >> 32), &time2_high);
|
|
|
|
napi_set_named_property(env, obj, "time1Low", time1_low);
|
|
napi_set_named_property(env, obj, "time1High", time1_high);
|
|
napi_set_named_property(env, obj, "time2Low", time2_low);
|
|
napi_set_named_property(env, obj, "time2High", time2_high);
|
|
|
|
return obj;
|
|
}
|
|
|
|
napi_value Init(napi_env env, napi_value exports) {
|
|
// Register all test functions
|
|
napi_value fn;
|
|
|
|
napi_create_function(env, NULL, 0, test_mutex_init_destroy, NULL, &fn);
|
|
napi_set_named_property(env, exports, "testMutexInitDestroy", fn);
|
|
|
|
napi_create_function(env, NULL, 0, test_mutex_recursive, NULL, &fn);
|
|
napi_set_named_property(env, exports, "testMutexRecursive", fn);
|
|
|
|
napi_create_function(env, NULL, 0, test_mutex_trylock, NULL, &fn);
|
|
napi_set_named_property(env, exports, "testMutexTrylock", fn);
|
|
|
|
napi_create_function(env, NULL, 0, test_process_ids, NULL, &fn);
|
|
napi_set_named_property(env, exports, "testProcessIds", fn);
|
|
|
|
napi_create_function(env, NULL, 0, test_uv_once, NULL, &fn);
|
|
napi_set_named_property(env, exports, "testUvOnce", fn);
|
|
|
|
napi_create_function(env, NULL, 0, test_hrtime, NULL, &fn);
|
|
napi_set_named_property(env, exports, "testHrtime", fn);
|
|
|
|
return exports;
|
|
}
|
|
|
|
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
|