uv::Async, uv::AsyncFunction: allow calling from within loop

This commit is contained in:
Peter Johnson
2018-10-06 09:14:55 -07:00
parent 172e438cd6
commit 7c1a7332e1
2 changed files with 20 additions and 4 deletions

View File

@@ -11,6 +11,7 @@
#include <uv.h>
#include <memory>
#include <thread>
#include <tuple>
#include <utility>
#include <vector>
@@ -83,16 +84,23 @@ class Async final : public HandleImpl<Async<T...>, uv_async_t> {
/**
* Wakeup the event loop and emit the event.
*
* Its safe to call this function from any thread EXCEPT the loop thread.
* Its safe to call this function from any thread including the loop thread.
* An async event will be emitted on the loop thread.
*/
template <typename... U>
void Send(U&&... u) {
auto loop = m_loop.lock();
if (loop && loop->GetThreadId() == std::this_thread::get_id()) {
// called from within the loop, just call the function directly
wakeup(std::forward<U>(u)...);
return;
}
{
std::lock_guard<wpi::mutex> lock(m_mutex);
m_data.emplace_back(std::forward_as_tuple(std::forward<U>(u)...));
}
if (auto loop = m_loop.lock()) this->Invoke(&uv_async_send, this->GetRaw());
if (loop) this->Invoke(&uv_async_send, this->GetRaw());
}
/**