From ca6815c6010988036c990b49175540a5d2334599 Mon Sep 17 00:00:00 2001 From: zhangyi Date: Mon, 1 Apr 2019 18:07:15 +0800 Subject: [PATCH] adjust interface for connect --- include/ipc.h | 10 +++++----- src/ipc.cpp | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/include/ipc.h b/include/ipc.h index dca60cc..49b1800 100644 --- a/include/ipc.h +++ b/include/ipc.h @@ -15,7 +15,7 @@ using buff_t = buffer; template struct IPC_EXPORT chan_impl { - static handle_t connect (char const * name); + static handle_t connect (char const * name, bool start); static void disconnect(handle_t h); static std::size_t recv_count(handle_t h); @@ -39,8 +39,8 @@ private: public: chan_wrapper() = default; - explicit chan_wrapper(char const * name) { - this->connect(name); + explicit chan_wrapper(char const * name, bool start = false) { + this->connect(name, start); } chan_wrapper(chan_wrapper&& rhs) { @@ -77,10 +77,10 @@ public: return chan_wrapper { name() }; } - bool connect(char const * name) { + bool connect(char const * name, bool start = true) { if (name == nullptr || name[0] == '\0') return false; this->disconnect(); - h_ = detail_t::connect((n_ = name).c_str()); + h_ = detail_t::connect((n_ = name).c_str(), start); return valid(); } diff --git a/src/ipc.cpp b/src/ipc.cpp index 47ca491..2ba44e5 100755 --- a/src/ipc.cpp +++ b/src/ipc.cpp @@ -157,8 +157,18 @@ static auto& recv_cache() { /* API implementations */ -static ipc::handle_t connect(char const * name) { - return mem::alloc(name); +static ipc::handle_t connect(char const * name, bool start) { + auto h = mem::alloc(name); + auto que = queue_of(h); + if (que == nullptr) { + return nullptr; + } + if (start) { + if (que->connect()) { // wouldn't connect twice + info_of(h)->cc_waiter_.broadcast(); + } + } + return h; } static void disconnect(ipc::handle_t h) { @@ -336,8 +346,8 @@ using policy_t = policy::choose; namespace ipc { template -ipc::handle_t chan_impl::connect(char const * name) { - return detail_impl>::connect(name); +ipc::handle_t chan_impl::connect(char const * name, bool start) { + return detail_impl>::connect(name, start); } template