rpc-port: Modify stub preparation handler 80/309780/2
authorHwankyu Jhun <h.jhun@samsung.com>
Wed, 17 Apr 2024 01:23:54 +0000 (10:23 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Wed, 17 Apr 2024 01:46:44 +0000 (10:46 +0900)
If the request is pended, amd sends the result to the caller immediately.

Change-Id: I0307a428ddc3b075a3f59d260f1bb3efc96c84ff
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/lib/amd_request.cc
src/lib/amd_request.h
src/lib/api/amd_api_request.cc
src/lib/api/amd_api_request.h
src/lib/request/request.cc
src/lib/request/request.hh
src/modules/rpc-port/amd_rpc_port.cc

index c56b40e15976a97ca9ecc1c03fb99494ab4f167c..c42348d2dcc8a066f7be74dab40f44c7e026147a 100644 (file)
@@ -249,3 +249,22 @@ void _request_fini(void) {
 unsigned int _request_generate_id(void) {
   return amd::Request::GenerateRequestID();
 }
+
+int _request_check_status(request_h req) {
+  if (req == nullptr) return -1;
+
+  auto req_ptr = static_cast<amd::Request*>(req)->GetSharedPtr();
+  return static_cast<int>(amd::RequestManager::GetInst().CheckStatus(req_ptr));
+}
+
+void _request_set_option(request_h req, int opt) {
+  if (req == nullptr) return;
+
+  static_cast<amd::Request*>(req)->SetOption(opt);
+}
+
+int _request_get_option(request_h req) {
+  if (req == nullptr) return 0;
+
+  return static_cast<amd::Request*>(req)->GetOption();
+}
index 5bb524633a26cfb480d91342087bb39884b2d7d9..573ac52e57e21a10163853a46a110e49e20e0019 100644 (file)
@@ -98,6 +98,12 @@ unsigned int _request_get_timeout(request_h req);
 
 unsigned int _request_generate_id(void);
 
+int _request_check_status(request_h req);
+
+void _request_set_option(request_h req, int opt);
+
+int _request_get_option(request_h req);
+
 #ifdef __cplusplus
 }
 #endif
index d2837c6f0f4ccaabcf34c2d41f4cb8c12911276b..2e7281dd1ac7f89b8f888efc72a6321e27cd19a8 100644 (file)
@@ -119,3 +119,15 @@ extern "C" EXPORT_API const char* amd_request_get_request_type(
     amd_request_h req) {
   return _request_get_request_type(req);
 }
+
+extern "C" EXPORT_API int amd_request_check_status(amd_request_h req) {
+  return _request_check_status(req);
+}
+
+extern "C" EXPORT_API void amd_request_set_option(amd_request_h req, int opt) {
+  _request_set_option(req, opt);
+}
+
+extern "C" EXPORT_API int amd_request_get_option(amd_request_h req) {
+  return _request_get_option(req);
+}
index dbfb7631fbef0ac9686d96a5dc14c311e5d1d55e..b86900856629cd84cc6a486ecd740b1dcbafde72 100644 (file)
@@ -38,6 +38,12 @@ typedef struct _amd_request_cmd_dispatch {
 
 typedef void *amd_request_reply_h;
 
+typedef enum {
+       AMD_REQUEST_STATUS_INVALID = -1,
+       AMD_REQUEST_STATUS_NORMAL = 0,
+       AMD_REQUEST_STATUS_PENDING = 1,
+} amd_request_status_e;
+
 int amd_request_send_result(amd_request_h req, int res);
 
 int amd_request_send_raw(amd_request_h req, int cmd, unsigned char *data,
@@ -87,6 +93,12 @@ int amd_request_set_request_type(amd_request_h req, const char *req_type);
 
 const char *amd_request_get_request_type(amd_request_h req);
 
+int amd_request_check_status(amd_request_h req);
+
+void amd_request_set_option(amd_request_h req, int opt);
+
+int amd_request_get_option(amd_request_h req);
+
 #ifdef __cplusplus
 }
 #endif
index 9d52c74cf5b82fd4426e82d7e816675dd72b2a1c..3fc18f7654d29d49748f6d7fc37ff29fd0546f96 100644 (file)
@@ -274,6 +274,8 @@ void Request::SetRequestType(const std::string& type) {
   b_->Add(AUL_K_REQUEST_TYPE, type);
 }
 
+void Request::SetOption(int opt) { opt_ = opt; }
+
 int Request::GetOption() const {
   return opt_;
 }
index a7c3de0313591ca07e2f427a7db249795bb79d4d..bc5925aecc2549a41c936e5aedc8c8de568eae5b 100644 (file)
@@ -103,6 +103,7 @@ class Request : public std::enable_shared_from_this<Request> {
   bool CheckCritical() const;
   std::string GetRequestType() const;
   void SetRequestType(const std::string& type);
+  void SetOption(int opt);
   int GetOption() const;
   unsigned int GetTimeout() const;
 
index 04401ee212a9754ebd264138720ac8cc02672c9c..8bc3a23efb7a56ecb6a241082f7145c651248d1b 100644 (file)
@@ -243,6 +243,18 @@ static int DispatchRpcPortPrepareStub(amd_request_h req) {
 
   amd_request_set_request_type(req, "rpc-port");
   amd_request_set_cmd(req, APP_START_ASYNC);
+  int opt = amd_request_get_option(req);
+  amd_request_set_option(req, opt | AUL_SOCK_QUEUE);
+
+  if (amd_request_check_status(req) == AMD_REQUEST_STATUS_PENDING) {
+    request_ids.insert(amd_request_get_id(req));
+    _E("request(%u) is pending", amd_request_get_id(req));
+    auto app_status = amd_app_status_find_by_appid(app_id.c_str(), target_uid);
+    if (app_status && amd_app_status_get_status(app_status) != STATUS_DYING)
+      amd_request_send_result(req, amd_app_status_get_pid(app_status));
+
+    return 0;
+  }
 
   bool pending = false;
   bool dummy_bg_launch = false;
@@ -257,7 +269,7 @@ static int DispatchRpcPortPrepareStub(amd_request_h req) {
 
   if (pending) {
     request_ids.insert(amd_request_get_id(req));
-    _D("Pending request: %u",amd_request_get_id(req));
+    _D("Pending request: %u", amd_request_get_id(req));
     return 0;
   }
 
@@ -434,7 +446,7 @@ static int ForeachMetadataCb(const char* value, void* user_data) {
   char* token = strtok_r(str, "|", &saveptr);
   while (token) {
     if (info->Match(token))
-      return -1; // To break metadata iteration
+      return -1;  // To break metadata iteration
 
     token = strtok_r(nullptr, "|", &saveptr);
   }