Fix locking the mutex of the Port class 11/264311/1
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 16 Sep 2021 00:19:52 +0000 (09:19 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 16 Sep 2021 00:27:08 +0000 (09:27 +0900)
To reduce the interval of locking the mutex, the mutex lock in the Read() method
ie separated using braces. And, the mutex lock is added to the Disconnect() method.

Change-Id: I60657385bc73cb988de0f53433bb1d22a21dad74
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/port-internal.cc

index 582e6a5..88d7722 100644 (file)
@@ -82,6 +82,7 @@ Port::~Port() {
 void Port::Disconnect() {
   IgnoreIOEvent();
 
+  std::lock_guard<std::recursive_mutex> lock(mutex_);
   if (fd_ > 0) {
     _W("Close fd(%d)", fd_);
     close(fd_);
@@ -118,17 +119,25 @@ int Port::Read(void* buf, unsigned int size) {
   int bytes_read = 0;
   char* buffer = static_cast<char*>(buf);
   int max_timeout = MAX_CNT * MAX_SLEEP; /* 10 sec */
-  std::lock_guard<std::recursive_mutex> lock(mutex_);
+  int fd;
 
-  if (fd_ < 0 || fd_ >= sysconf(_SC_OPEN_MAX)) {
-    _E("Invalid fd(%d)", fd_);
-    return RPC_PORT_ERROR_IO_ERROR;
+  {
+    std::lock_guard<std::recursive_mutex> lock(mutex_);
+    fd = fd_;
+    if (fd < 0 || fd >= sysconf(_SC_OPEN_MAX)) {
+      _E("Invalid fd(%d)", fd);
+      return RPC_PORT_ERROR_IO_ERROR;
+    }
   }
 
   while (left) {
-    nb = read(fd_, buffer, left);
+    {
+      std::lock_guard<std::recursive_mutex> lock(mutex_);
+      nb = read(fd, buffer, left);
+    }
+
     if (nb == 0) {
-      _E("read_socket: ...read EOF, socket closed %d: nb %zd\n", fd_, nb);
+      _E("read_socket: ...read EOF, socket closed %d: nb %zd\n", fd, nb);
       return RPC_PORT_ERROR_IO_ERROR;
     } else if (nb == -1) {
       if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) {
@@ -136,7 +145,7 @@ int Port::Read(void* buf, unsigned int size) {
         nanosleep(&TRY_SLEEP_TIME, 0);
         max_timeout -= (TRY_SLEEP_TIME.tv_nsec / (BASE_SLEEP));
         if (max_timeout <= 0) {
-          _E("read_socket: ...timed out fd %d: errno %d", fd_, errno);
+          _E("read_socket: ...timed out fd %d: errno %d", fd, errno);
           return RPC_PORT_ERROR_IO_ERROR;
         }
         TRY_SLEEP_TIME.tv_nsec *= 2;
@@ -145,7 +154,7 @@ int Port::Read(void* buf, unsigned int size) {
         continue;
       }
 
-      _E("read_socket: ...error fd %d: errno %d\n", fd_, errno);
+      _E("read_socket: ...error fd %d: errno %d\n", fd, errno);
       return RPC_PORT_ERROR_IO_ERROR;
     }