summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-11-06 20:00:28 (GMT)
committerBrad King <brad.king@kitware.com>2023-11-17 13:51:25 (GMT)
commit70d88a536135067bff693de5d6c96d866dc5b00e (patch)
treed786813f7b135ee56f76e9ad7a05f7af44b15390
parent17690558c3ef6e6db850aa9f2993ea07467fe536 (diff)
downloadCMake-70d88a536135067bff693de5d6c96d866dc5b00e.zip
CMake-70d88a536135067bff693de5d6c96d866dc5b00e.tar.gz
CMake-70d88a536135067bff693de5d6c96d866dc5b00e.tar.bz2
cmUVHandlePtr: Add uv_idle_ptr
Wrap a `uv_idle_t` handle.
-rw-r--r--Source/cmUVHandlePtr.cxx8
-rw-r--r--Source/cmUVHandlePtr.h9
-rw-r--r--Tests/CMakeLib/testUVRAII.cxx26
3 files changed, 43 insertions, 0 deletions
diff --git a/Source/cmUVHandlePtr.cxx b/Source/cmUVHandlePtr.cxx
index 0e169df..951ef3b 100644
--- a/Source/cmUVHandlePtr.cxx
+++ b/Source/cmUVHandlePtr.cxx
@@ -254,12 +254,20 @@ int uv_tty_ptr::init(uv_loop_t& loop, int fd, int readable, void* data)
}
#endif
+int uv_idle_ptr::init(uv_loop_t& loop, void* data)
+{
+ this->allocate(data);
+ return uv_idle_init(&loop, *this);
+}
+
template class uv_handle_ptr_base_<uv_handle_t>;
#define UV_HANDLE_PTR_INSTANTIATE_EXPLICIT(NAME) \
template class uv_handle_ptr_base_<uv_##NAME##_t>; \
template class uv_handle_ptr_<uv_##NAME##_t>;
+UV_HANDLE_PTR_INSTANTIATE_EXPLICIT(idle)
+
UV_HANDLE_PTR_INSTANTIATE_EXPLICIT(signal)
UV_HANDLE_PTR_INSTANTIATE_EXPLICIT(pipe)
diff --git a/Source/cmUVHandlePtr.h b/Source/cmUVHandlePtr.h
index f5e2097..e1bf0d0 100644
--- a/Source/cmUVHandlePtr.h
+++ b/Source/cmUVHandlePtr.h
@@ -196,6 +196,13 @@ public:
void send();
};
+struct uv_idle_ptr : public uv_handle_ptr_<uv_idle_t>
+{
+ CM_INHERIT_CTOR(uv_idle_ptr, uv_handle_ptr_, <uv_idle_t>);
+
+ int init(uv_loop_t& loop, void* data = nullptr);
+};
+
struct uv_signal_ptr : public uv_handle_ptr_<uv_signal_t>
{
CM_INHERIT_CTOR(uv_signal_ptr, uv_handle_ptr_, <uv_signal_t>);
@@ -255,6 +262,8 @@ extern template class uv_handle_ptr_base_<uv_handle_t>;
UV_HANDLE_PTR_INSTANTIATE_EXTERN(async)
+UV_HANDLE_PTR_INSTANTIATE_EXTERN(idle)
+
UV_HANDLE_PTR_INSTANTIATE_EXTERN(signal)
UV_HANDLE_PTR_INSTANTIATE_EXTERN(pipe)
diff --git a/Tests/CMakeLib/testUVRAII.cxx b/Tests/CMakeLib/testUVRAII.cxx
index ce11761..1b08778 100644
--- a/Tests/CMakeLib/testUVRAII.cxx
+++ b/Tests/CMakeLib/testUVRAII.cxx
@@ -162,6 +162,7 @@ static bool testAllMoves()
uv_async_ptr _13;
uv_signal_ptr _14;
uv_handle_ptr _15;
+ uv_idle_ptr _16;
};
allTypes a;
@@ -218,6 +219,30 @@ static bool testLoopDestructor()
return true;
}
+static bool testIdle()
+{
+ bool idled = false;
+
+ cm::uv_loop_ptr loop;
+ loop.init();
+
+ cm::uv_idle_ptr idle;
+ idle.init(*loop, &idled);
+ uv_idle_start(idle, [](uv_idle_t* handle) {
+ auto idledPtr = static_cast<bool*>(handle->data);
+ *idledPtr = true;
+ uv_idle_stop(handle);
+ });
+ uv_run(loop, UV_RUN_DEFAULT);
+
+ if (!idled) {
+ std::cerr << "uv_idle_ptr did not trigger callback" << std::endl;
+ return false;
+ }
+
+ return true;
+}
+
int testUVRAII(int, char** const)
{
if (!testAsyncShutdown()) {
@@ -230,5 +255,6 @@ int testUVRAII(int, char** const)
passed = testAllMoves() && passed;
passed = testLoopReset() && passed;
passed = testLoopDestructor() && passed;
+ passed = testIdle() && passed;
return passed ? 0 : -1;
}