From bf61f55dd306b31d7cb90eab8a493c3d405f2402 Mon Sep 17 00:00:00 2001 From: Michele Caini Date: Mon, 22 Mar 2021 15:18:39 +0100 Subject: [PATCH] loop::walk ignores unmanaged handles (close #239) --- src/uvw/loop.h | 97 +++++++++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 48 deletions(-) diff --git a/src/uvw/loop.h b/src/uvw/loop.h index d366e58d..ee66ca4b 100644 --- a/src/uvw/loop.h +++ b/src/uvw/loop.h @@ -276,55 +276,56 @@ public: void walk(Func callback) { // remember: non-capturing lambdas decay to pointers to functions uv_walk(loop.get(), [](uv_handle_t *handle, void *func) { - auto &cb = *static_cast(func); + if(handle->data) { + auto &cb = *static_cast(func); - switch(Utilities::guessHandle(HandleCategory{handle->type})) { - case HandleType::ASYNC: - cb(*static_cast(handle->data)); - break; - case HandleType::CHECK: - cb(*static_cast(handle->data)); - break; - case HandleType::FS_EVENT: - cb(*static_cast(handle->data)); - break; - case HandleType::FS_POLL: - cb(*static_cast(handle->data)); - break; - case HandleType::IDLE: - cb(*static_cast(handle->data)); - break; - case HandleType::PIPE: - cb(*static_cast(handle->data)); - break; - case HandleType::POLL: - cb(*static_cast(handle->data)); - break; - case HandleType::PREPARE: - cb(*static_cast(handle->data)); - break; - case HandleType::PROCESS: - cb(*static_cast(handle->data)); - break; - case HandleType::SIGNAL: - cb(*static_cast(handle->data)); - break; - case HandleType::TCP: - cb(*static_cast(handle->data)); - break; - case HandleType::TIMER: - cb(*static_cast(handle->data)); - break; - case HandleType::TTY: - cb(*static_cast(handle->data)); - break; - case HandleType::UDP: - cb(*static_cast(handle->data)); - break; - default: - // returns the underlying handle, uvw doesn't manage it properly yet - cb(handle); - break; + switch(Utilities::guessHandle(HandleCategory{handle->type})) { + case HandleType::ASYNC: + cb(*static_cast(handle->data)); + break; + case HandleType::CHECK: + cb(*static_cast(handle->data)); + break; + case HandleType::FS_EVENT: + cb(*static_cast(handle->data)); + break; + case HandleType::FS_POLL: + cb(*static_cast(handle->data)); + break; + case HandleType::IDLE: + cb(*static_cast(handle->data)); + break; + case HandleType::PIPE: + cb(*static_cast(handle->data)); + break; + case HandleType::POLL: + cb(*static_cast(handle->data)); + break; + case HandleType::PREPARE: + cb(*static_cast(handle->data)); + break; + case HandleType::PROCESS: + cb(*static_cast(handle->data)); + break; + case HandleType::SIGNAL: + cb(*static_cast(handle->data)); + break; + case HandleType::TCP: + cb(*static_cast(handle->data)); + break; + case HandleType::TIMER: + cb(*static_cast(handle->data)); + break; + case HandleType::TTY: + cb(*static_cast(handle->data)); + break; + case HandleType::UDP: + cb(*static_cast(handle->data)); + break; + default: + // this handle isn't managed by uvw, let it be... + break; + } } }, &callback); }