Modify local execution mode of C++ generator 99/298599/1
authorHwankyu Jhun <h.jhun@samsung.com>
Mon, 11 Sep 2023 08:04:03 +0000 (17:04 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Mon, 11 Sep 2023 08:04:03 +0000 (17:04 +0900)
In the previous implementation, the local execution mode only supports
the asynchronous connection request. After this patch is applied,
the synchronous connection request is supported.

Change-Id: I3ad1831bdce99426e5a393b4633d1566a8812c36
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
idlc/gen/version2/cpp_proxy_body_generator_cb.hh
idlc/gen/version2/cpp_proxy_header_generator_cb.hh
idlc/gen/version2/cpp_stub_body_generator_cb.hh
idlc/gen/version2/cpp_stub_header_generator_cb.hh

index 6074dbfb38dc8c422cff82f6c82536e69e0fbb0d..c3b73e1ec3545359dbfd2147174b875511c29a9f 100644 (file)
@@ -142,7 +142,7 @@ R"__cpp_cb(
 
 void <CLS_NAME>::Connect(bool sync) {
   if (local_execution_.get() != nullptr && local_execution_->LoadSymbols()) {
-    if (local_execution_->Connect())
+    if (local_execution_->Connect(sync))
       return;
   }
 
@@ -506,9 +506,9 @@ LocalExecution::~LocalExecution() {
   }
 }
 
-bool LocalExecution::Connect() {
+bool LocalExecution::Connect(bool sync) {
   if (connect_func_) {
-    if (connect_func_(this, GetAppId().c_str(), instance_.c_str()) != RPC_PORT_ERROR_NONE)
+    if (connect_func_(this, GetAppId().c_str(), instance_.c_str(), sync) != RPC_PORT_ERROR_NONE)
       return false;
   }
 
@@ -543,12 +543,14 @@ int LocalExecution::Send(rpc_port_parcel_h request, rpc_port_parcel_h* result) {
 }
 
 void LocalExecution::OnConnected() {
+  std::lock_guard<std::recursive_mutex> lock(mutex_);
   connected_ = true;
   if (listener_ != nullptr)
     listener_->OnLocalConnected();
 }
 
 void LocalExecution::OnDisconnected() {
+  std::lock_guard<std::recursive_mutex> lock(mutex_);
   connected_ = false;
   if (listener_ != nullptr)
     listener_->OnLocalDisconnected();
@@ -631,8 +633,13 @@ rpc_port_parcel_h LocalExecution::RequestQueuePop() {
  */
 constexpr const char CB_LEM_API[] =
 R"__cpp_cb(
-EXPORT_API int rpc_port_proxy_<INPUT_FILE>_lem_<CLS_NAME>_connect(void* h) {
+EXPORT_API int rpc_port_proxy_<INPUT_FILE>_lem_<CLS_NAME>_connect(void* h, bool sync) {
   auto* handle = static_cast<rpc_port::<FILE_NAMESPACE>::LocalExecution*>(h);
+  if (sync) {
+    handle->OnConnected();
+    return RPC_PORT_ERROR_NONE;
+  }
+
   auto* ptr = new std::weak_ptr<rpc_port::<FILE_NAMESPACE>::LocalExecution>(handle->shared_from_this());
   g_idle_add([](gpointer user_data) {
         auto* wp = static_cast<std::weak_ptr<rpc_port::<FILE_NAMESPACE>::LocalExecution>*>(user_data);
index c02b01387001fed45a21fd38f7d15a79fd6d07a0..a6f7886950fe584c71fd9681153eeb2184056462 100644 (file)
@@ -196,7 +196,7 @@ class LocalExecution : public std::enable_shared_from_this<LocalExecution> {
   LocalExecution(std::string port_name, IEvent* listener);
   virtual ~LocalExecution();
 
-  bool Connect();
+  bool Connect(bool sync);
   void Disconnect();
   int Send(rpc_port_parcel_h request, rpc_port_parcel_h* result);
 
@@ -217,7 +217,7 @@ class LocalExecution : public std::enable_shared_from_this<LocalExecution> {
 
 
  private:
-  using StubConnectFunc = int (*)(void*, const char*, const char*);
+  using StubConnectFunc = int (*)(void*, const char*, const char*, bool);
   using StubDisconnectFunc = void (*)(void*, const char*, const char*);
   using StubSendFunc = int (*)(void*, rpc_port_parcel_h);
 
index 7571959deef2723d79b5a42e1713b7d73eb3c021..c1e6f593053ba2c462194b4cafb81503ad2b6a65 100644 (file)
@@ -376,12 +376,12 @@ int <CLS_NAME>::OnReceivedCb(const char* sender, const char* instance, rpc_port_
   return ret;
 }
 
-void <CLS_NAME>::OnLocalConnected(void* context, const std::string& sender, const std::string& instance) {
+void <CLS_NAME>::OnLocalConnected(void* context, const std::string& sender, const std::string& instance, bool sync) {
   auto service = service_factory_->CreateService(sender, instance);
   service->SetContext(context);
   service->OnCreate();
   services_.emplace_back(std::move(service));
-  <CLS_NAME>_context_->Connect(context);
+  <CLS_NAME>_context_->Connect(context, sync);
 }
 
 void <CLS_NAME>::OnLocalDisconnected(void* context, const std::string& sender, const std::string& instance) {
@@ -597,9 +597,9 @@ LocalExecution::LocalExecution(std::string port_name, LocalExecution::IEvent* li
   LoadSymbols();
 }
 
-void LocalExecution::Connect(void* context) {
+void LocalExecution::Connect(void* context, bool sync) {
   if (connect_func_ != nullptr)
-    connect_func_(context);
+    connect_func_(context, sync);
 }
 
 void LocalExecution::Disconnect(void* context) {
@@ -617,9 +617,9 @@ void LocalExecution::InvokeCallback(void* context, rpc_port_parcel_h parcel) {
     invoke_callback_func_(context, parcel);
 }
 
-void LocalExecution::OnConnected(void* context, const std::string& sender, const std::string& instance) {
+void LocalExecution::OnConnected(void* context, const std::string& sender, const std::string& instance, bool sync) {
   if (listener_ != nullptr)
-    listener_->OnLocalConnected(context, sender, instance);
+    listener_->OnLocalConnected(context, sender, instance, sync);
 }
 
 void LocalExecution::OnDisconnected(void* context, const std::string& sender, const std::string& instance) {
@@ -683,13 +683,13 @@ bool LocalExecution::IsListening() const {
  */
 constexpr const char CB_LEM_API[] =
 R"__cpp_cb(
-EXPORT_API int rpc_port_stub_<INPUT_FILE>_lem_<CLS_NAME>_connect(void* context, const char* sender, const char* instance) {
+EXPORT_API int rpc_port_stub_<INPUT_FILE>_lem_<CLS_NAME>_connect(void* context, const char* sender, const char* instance, bool sync) {
   if (<CLS_NAME>_context_.get() == nullptr || !<CLS_NAME>_context_->IsListening()) {
     _E("Server is not ready");
     return RPC_PORT_ERROR_IO_ERROR;
   }
 
-  <CLS_NAME>_context_->OnConnected(context, sender, instance);
+  <CLS_NAME>_context_->OnConnected(context, sender, instance, sync);
   return RPC_PORT_ERROR_NONE;
 }
 
index 51db84f81269782f758614d94eea8168f5602697..562491a8e9c4d1126b0dd9ad0f4b16e0bd178e01 100644 (file)
@@ -361,7 +361,7 @@ class <CLS_NAME> : public LocalExecution::IEvent {
   static void OnDisconnectedCb(const char* sender, const char* instance, void* user_data);
   static int OnReceivedCb(const char* sender, const char* instance, rpc_port_h port, void* user_data);
 
-  void OnLocalConnected(void* context, const std::string& sender, const std::string& instance) override;
+  void OnLocalConnected(void* context, const std::string& sender, const std::string& instance, bool sync) override;
   void OnLocalDisconnected(void* context, const std::string& sender, const std::string& instance) override;
   void OnLocalReceived(void* context, rpc_port_parcel_h parcel) override;
 
@@ -402,7 +402,7 @@ class LocalExecution {
   class IEvent {
    public:
     virtual ~IEvent() = default;
-    virtual void OnLocalConnected(void* context, const std::string& sender, const std::string& instance) = 0;
+    virtual void OnLocalConnected(void* context, const std::string& sender, const std::string& instance, bool sync) = 0;
     virtual void OnLocalDisconnected(void* context, const std::string& sender, const std::string& instance) = 0;
     virtual void OnLocalReceived(void* context, rpc_port_parcel_h parcel) = 0;
   };
@@ -410,12 +410,12 @@ class LocalExecution {
   LocalExecution(std::string port_name, IEvent* listener);
   virtual ~LocalExecution() = default;
 
-  void Connect(void* context);
+  void Connect(void* context, bool sync);
   void Disconnect(void* context);
   void SendResult(void* context, rpc_port_parcel_h parcel);
   void InvokeCallback(void* context, rpc_port_parcel_h parcel);
 
-  void OnConnected(void* context, const std::string& sender, const std::string& instance);
+  void OnConnected(void* context, const std::string& sender, const std::string& instance, bool sync);
   void OnDisconnected(void* context, const std::string& sender, const std::string& instance);
   void OnReceived(void* context, rpc_port_parcel_h parcel);
 
@@ -425,7 +425,7 @@ class LocalExecution {
   bool LoadSymbols();
 
  private:
-  using ProxyConnectFunc = int (*)(void*);
+  using ProxyConnectFunc = int (*)(void*, bool);
   using ProxyDisconnectFunc = int (*)(void*);
   using ProxySendResultFunc = int (*)(void*, rpc_port_parcel_h);
   using ProxyInvokeCallbackFunc = int (*)(void*, rpc_port_parcel_h);