Make some APIs thread-safe 38/168738/1
authorJunghoon Park <jh9216.park@samsung.com>
Tue, 30 Jan 2018 11:00:42 +0000 (20:00 +0900)
committerJunghoon Park <jh9216.park@samsung.com>
Tue, 30 Jan 2018 11:00:42 +0000 (20:00 +0900)
Change-Id: I477f16479fcccb18929e687796a83781b84495eb
Signed-off-by: Junghoon Park <jh9216.park@samsung.com>
src/port-internal.h
src/rpc-port-parcel.cc

index 5fd3a1a900791dbb1ee60ea15455e7066a85cc52..67bc1e5cb96a82543dbfdf79ab9c0555a513e3a1 100644 (file)
@@ -40,10 +40,14 @@ class Port {
     return id_;
   }
 
+  std::recursive_mutex& GetMutex() const {
+    return mutex_;
+  }
+
  private:
   int fd_;
   std::string id_;
-  std::recursive_mutex mutex_;
+  mutable std::recursive_mutex mutex_;
 };
 
 }  // namespace internal
index edc88a82d888775e3cd46eaf475314f87c95adb0..d1d161bc9c6c25e069f3159dfaa636d14cb935b0 100755 (executable)
@@ -19,6 +19,7 @@
 #include "rpc-port-parcel.h"
 
 #include "parcel-internal.h"
+#include "port-internal.h"
 
 #undef RPC_API
 #define RPC_API extern "C" __attribute__((visibility("default")))
@@ -37,17 +38,20 @@ RPC_API int rpc_port_parcel_create_from_port(rpc_port_parcel_h* h,
     rpc_port_h port) {
   int len;
   unsigned char* buf;
-  int ret;
 
-  ret = rpc_port_read(port, &len, 4);
-  if (ret != 0)
-    return ret;
-
-  buf = new unsigned char[len];
-  ret = rpc_port_read(port, buf, len);
-  if (ret != 0) {
-    delete[] buf;
-    return ret;
+  internal::Port* pt = static_cast<internal::Port*>(port);
+  {
+    std::lock_guard<std::recursive_mutex> lock(pt->GetMutex());
+    int ret = rpc_port_read(port, &len, 4);
+    if (ret != 0)
+      return ret;
+
+    buf = new unsigned char[len];
+    ret = rpc_port_read(port, buf, len);
+    if (ret != 0) {
+      delete[] buf;
+      return ret;
+    }
   }
 
   Parcel* p = new Parcel(buf, len);
@@ -61,18 +65,21 @@ RPC_API int rpc_port_parcel_create_from_port(rpc_port_parcel_h* h,
 RPC_API int rpc_port_parcel_send(rpc_port_parcel_h h, rpc_port_h port) {
   Parcel* p = static_cast<Parcel*>(h);
   int len = p->GetRaw().size();
-  int ret;
 
   if (len <= 0)
     return -1;
 
-  ret = rpc_port_write(port, &len, 4);
-  if (ret != 0)
-    return ret;
+  internal::Port* pt = static_cast<internal::Port*>(port);
+  {
+    std::lock_guard<std::recursive_mutex> lock(pt->GetMutex());
+    int ret = rpc_port_write(port, &len, 4);
+    if (ret != 0)
+      return ret;
 
-  ret = rpc_port_write(port, &*(p->GetRaw().cbegin()), len);
-  if (ret != 0)
-    return ret;
+    ret = rpc_port_write(port, &*(p->GetRaw().cbegin()), len);
+    if (ret != 0)
+      return ret;
+  }
 
   return 0;
 }