diff --git a/include/uv.h b/include/uv.h index 3b61e28f6..d9acb6acf 100644 --- a/include/uv.h +++ b/include/uv.h @@ -281,6 +281,7 @@ UV_EXTERN void uv_stop(uv_loop_t*); */ UV_EXTERN void uv_ref(uv_handle_t*); UV_EXTERN void uv_unref(uv_handle_t*); +UV_EXTERN int uv_has_ref(const uv_handle_t*); UV_EXTERN void uv_update_time(uv_loop_t*); UV_EXTERN uint64_t uv_now(uv_loop_t*); diff --git a/src/uv-common.c b/src/uv-common.c index c95dfdd3e..fc8831fd9 100644 --- a/src/uv-common.c +++ b/src/uv-common.c @@ -426,6 +426,11 @@ void uv_unref(uv_handle_t* handle) { } +int uv_has_ref(const uv_handle_t* handle) { + return uv__has_ref(handle); +} + + void uv_stop(uv_loop_t* loop) { loop->stop_flag = 1; } diff --git a/src/uv-common.h b/src/uv-common.h index e2d2f4bc1..6a47513be 100644 --- a/src/uv-common.h +++ b/src/uv-common.h @@ -186,6 +186,9 @@ void uv__fs_poll_close(uv_fs_poll_t* handle); } \ while (0) +#define uv__has_ref(h) \ + (((h)->flags & UV__HANDLE_REF) != 0) + #if defined(_WIN32) # define uv__handle_platform_init(h) #else diff --git a/test/test-list.h b/test/test-list.h index 30a2a0a28..601ff4375 100644 --- a/test/test-list.h +++ b/test/test-list.h @@ -128,6 +128,7 @@ TEST_DECLARE (pipe_ref2) TEST_DECLARE (pipe_ref3) TEST_DECLARE (pipe_ref4) TEST_DECLARE (process_ref) +TEST_DECLARE (has_ref) TEST_DECLARE (active) TEST_DECLARE (embed) TEST_DECLARE (async) @@ -377,6 +378,7 @@ TASK_LIST_START TEST_ENTRY (pipe_ref4) TEST_HELPER (pipe_ref4, pipe_echo_server) TEST_ENTRY (process_ref) + TEST_ENTRY (has_ref) TEST_ENTRY (loop_handles) TEST_ENTRY (walk_handles) diff --git a/test/test-ref.c b/test/test-ref.c index 9fc214ab6..37279ac89 100644 --- a/test/test-ref.c +++ b/test/test-ref.c @@ -413,3 +413,15 @@ TEST_IMPL(process_ref) { MAKE_VALGRIND_HAPPY(); return 0; } + + +TEST_IMPL(has_ref) { + uv_idle_t h; + uv_idle_init(uv_default_loop(), &h); + uv_ref((uv_handle_t*)&h); + ASSERT(uv_has_ref((uv_handle_t*)&h) == 1); + uv_unref((uv_handle_t*)&h); + ASSERT(uv_has_ref((uv_handle_t*)&h) == 0); + MAKE_VALGRIND_HAPPY(); + return 0; +}