summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-11-19 16:50:06 (GMT)
committerKitware Robot <kwrobot@kitware.com>2023-11-19 16:50:16 (GMT)
commitf33810b567ff403e3a37735e3ed6d8d40fd86360 (patch)
treec3caa88e33ec6a708321d1ce71340bb75c24dc49
parent21a7c1b86ac33a08c19880bc5f388678fa04b379 (diff)
parent70d88a536135067bff693de5d6c96d866dc5b00e (diff)
downloadCMake-f33810b567ff403e3a37735e3ed6d8d40fd86360.zip
CMake-f33810b567ff403e3a37735e3ed6d8d40fd86360.tar.gz
CMake-f33810b567ff403e3a37735e3ed6d8d40fd86360.tar.bz2
Merge topic 'uv-idle-ptr'
70d88a5361 cmUVHandlePtr: Add uv_idle_ptr 17690558c3 cmUVHandlePtr: Add explicit conversion to bool cd2894a089 cmUVHandlePtr: Conversions to raw pointers are const Acked-by: Kitware Robot <kwrobot@kitware.com> Acked-by: buildbot <buildbot@kitware.com> Merge-request: !8980
-rw-r--r--Source/cmUVHandlePtr.cxx18
-rw-r--r--Source/cmUVHandlePtr.h15
-rw-r--r--Tests/CMakeLib/testUVRAII.cxx32
3 files changed, 58 insertions, 7 deletions
diff --git a/Source/cmUVHandlePtr.cxx b/Source/cmUVHandlePtr.cxx
index 34e6a70..951ef3b 100644
--- a/Source/cmUVHandlePtr.cxx
+++ b/Source/cmUVHandlePtr.cxx
@@ -44,7 +44,7 @@ void uv_loop_ptr::reset()
this->loop.reset();
}
-uv_loop_ptr::operator uv_loop_t*()
+uv_loop_ptr::operator uv_loop_t*() const
{
return this->loop.get();
}
@@ -97,13 +97,19 @@ void uv_handle_ptr_base_<T>::allocate(void* data)
}
template <typename T>
+uv_handle_ptr_base_<T>::operator bool() const
+{
+ return this->handle.get();
+}
+
+template <typename T>
void uv_handle_ptr_base_<T>::reset()
{
this->handle.reset();
}
template <typename T>
-uv_handle_ptr_base_<T>::operator uv_handle_t*()
+uv_handle_ptr_base_<T>::operator uv_handle_t*() const
{
return reinterpret_cast<uv_handle_t*>(this->handle.get());
}
@@ -248,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 027d690..e1bf0d0 100644
--- a/Source/cmUVHandlePtr.h
+++ b/Source/cmUVHandlePtr.h
@@ -61,7 +61,7 @@ public:
* Allow less verbose calling of uv_loop_* functions
* @return reinterpreted handle
*/
- operator uv_loop_t*();
+ operator uv_loop_t*() const;
uv_loop_t* get() const;
uv_loop_t* operator->() const noexcept;
@@ -130,6 +130,8 @@ public:
uv_handle_ptr_base_(std::nullptr_t) {}
~uv_handle_ptr_base_() { this->reset(); }
+ explicit operator bool() const;
+
/**
* Properly close the handle if needed and sets the inner handle to nullptr
*/
@@ -139,7 +141,7 @@ public:
* Allow less verbose calling of uv_handle_* functions
* @return reinterpreted handle
*/
- operator uv_handle_t*();
+ operator uv_handle_t*() const;
T* get() const;
T* operator->() const noexcept;
@@ -194,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>);
@@ -253,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 0bdd44c..1b08778 100644
--- a/Tests/CMakeLib/testUVRAII.cxx
+++ b/Tests/CMakeLib/testUVRAII.cxx
@@ -37,7 +37,7 @@ static bool testAsyncShutdown()
return false;
}
- if (signal.get()) {
+ if (signal) {
std::cerr << "Loop exited with signal not being cleaned up" << std::endl;
return false;
}
@@ -125,13 +125,13 @@ static bool testCrossAssignment()
pipe.init(Loop, 0);
cm::uv_stream_ptr stream = std::move(pipe);
- if (pipe.get()) {
+ if (pipe) {
std::cerr << "Move should be sure to invalidate the previous ptr"
<< std::endl;
return false;
}
cm::uv_handle_ptr handle = std::move(stream);
- if (stream.get()) {
+ if (stream) {
std::cerr << "Move should be sure to invalidate the previous ptr"
<< std::endl;
return false;
@@ -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;
}