#include #include #include #include #include #include // 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)