From: Hwankyu Jhun Date: Fri, 19 Feb 2021 04:09:02 +0000 (+0900) Subject: Fix Write() implemenation X-Git-Tag: submit/tizen/20210222.030137~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f95b3ee52e74bf9b5631f71a5fafa66b6b1e52f8;p=platform%2Fcore%2Fappfw%2Frpc-port.git Fix Write() implemenation After queuing the message, rpc-port checks whether writing is now possible or not. Change-Id: I765a9b02f67755c2838fe81149d71817aa7f9763 Signed-off-by: Hwankyu Jhun --- diff --git a/src/port-internal.cc b/src/port-internal.cc index 0b61a27..1c939da 100644 --- a/src/port-internal.cc +++ b/src/port-internal.cc @@ -158,6 +158,21 @@ int Port::Read(void* buf, unsigned int size) { return RPC_PORT_ERROR_NONE; } +bool Port::CanWrite() { + struct pollfd fds[1]; + fds[0].fd = fd_; + fds[0].events = POLLOUT; + fds[0].revents = 0; + int ret = poll(fds, 1, 100); + if (ret == 0 || ret < 0) { + _W("poll() is failed. fd(%d), error(%s)", + fd_, ret == 0 ? "timed out" : std::to_string(-errno).c_str()); + return false; + } + + return true; +} + int Port::Write(const void* buf, unsigned int size) { int sent_bytes = 0; int ret; @@ -180,6 +195,19 @@ int Port::Write(const void* buf, unsigned int size) { ret = PushDelayedMessage( std::make_shared(static_cast(buf), sent_bytes, size)); + + if (CanWrite()) { + while (!queue_.empty()) { + int port_status = PopDelayedMessage(); + if (port_status != PORT_STATUS_ERROR_NONE) { + if (port_status == PORT_STATUS_ERROR_IO_ERROR) + return RPC_PORT_ERROR_IO_ERROR; + + break; + } + } + } + return ret; } @@ -257,14 +285,13 @@ void Port::ClearQueue() { int Port::PopDelayedMessage() { int sent_bytes = 0; - int ret; std::lock_guard lock(mutex_); auto dm = queue_.front(); - ret = Write(dm->GetMessage(), dm->GetSize(), &sent_bytes); + int ret = Write(dm->GetMessage(), dm->GetSize(), &sent_bytes); if (ret == PORT_STATUS_ERROR_RESOURCE_UNAVAILABLE) { dm->SetIndex(sent_bytes); - } else if(ret == PORT_STATUS_ERROR_IO_ERROR) { + } else if (ret == PORT_STATUS_ERROR_IO_ERROR) { ClearQueue(); } else { delayed_message_size_ -= dm->GetOriginalSize(); diff --git a/src/port-internal.hh b/src/port-internal.hh index 96c31a5..0286304 100644 --- a/src/port-internal.hh +++ b/src/port-internal.hh @@ -65,6 +65,8 @@ class Port { } private: + bool CanWrite(); + class DelayMessage { public: DelayMessage(const char* msg, int start_index, int size);