Modify handling pending requests
authorHwankyu Jhun <h.jhun@samsung.com>
Fri, 4 Aug 2023 02:22:33 +0000 (11:22 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Tue, 8 Aug 2023 23:29:01 +0000 (08:29 +0900)
The SetTimer() method is added to the Request class. The method sets
a timer using the interval that is calculated with the timeout variable.
And, the log is added for debugging.

Change-Id: Ibb0636f8f3fc174948ae57e9b987c9ad13d4f6e1
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/lib/request/pending_item.cc
src/lib/request/pending_item.hh
src/lib/request/request.cc
src/lib/request/request.hh
src/lib/request/request_manager.cc
src/lib/request/request_manager.hh

index 5486a796592852beb4266d050a1b6e2e02ebcfd3..d9cc456d77865bc4fac1e0f13a0e13ebd8a05ce5 100644 (file)
@@ -17,7 +17,9 @@
 #include "lib/request/pending_item.hh"
 
 #include <aul_cmd.h>
+
 #include <ctime>
+#include <utility>
 
 #include "lib/amd_socket.h"
 #include "lib/amd_util.h"
@@ -58,6 +60,12 @@ pid_t PendingItem::GetPid() const {
 }
 
 bool PendingItem::AddRequestSimple(RequestPtr req) {
+  req->SetTimer();
+
+  _W("request(%s[%d]:%d:%u:%d) is added on pending list",
+      aul_cmd_convert_to_string(req->GetCmd()),
+      req->GetCmd(), req->GetPID(), req->GetTargetUID(), req->GetID());
+
   requests_.push_back(std::move(req));
   return true;
 }
@@ -70,10 +78,7 @@ bool PendingItem::AddRequest(RequestPtr req) {
 
   req->SetTargetPID(getpid());
   if (req->GetUID() >= REGULAR_UID_MIN || req->IsIndirectRequest()) {
-    timespec end{};
-    clock_gettime(CLOCK_MONOTONIC, &end);
-    auto interval = GetPendingInterval(req->GetStartTime(), end);
-    req->SetTimer(interval);
+    req->SetTimer();
   } else {
     req->SendResult(0);
     req->SetTimer(kSystemRequestTimeout);
@@ -87,6 +92,13 @@ bool PendingItem::AddRequest(RequestPtr req) {
   return true;
 }
 
+bool PendingItem::Contains(unsigned int req_id) const {
+  return std::find_if(std::begin(requests_), std::end(requests_),
+      [req_id](const auto& request) -> bool {
+        return request->GetID() == static_cast<int>(req_id & INT_MAX);
+      }) != std::end(requests_);
+}
+
 bool PendingItem::AddReplyInfo(ReplyInfoPtr info) {
   reply_infos_.push_back(std::move(info));
   return true;
index 084ef3108be26a14719030bf53bd279d37e64c88..f552e8554ec2b1caa084946cce71b163872b9383 100644 (file)
@@ -54,11 +54,10 @@ class PendingItem {
   bool AddReplyInfo(ReplyInfoPtr info);
   bool RemoveRequest(const RequestPtr& req);
   bool RemoveReplyInfo(const ReplyInfoPtr& info);
-  void FlushRequests();
-  void FlushReplyInfos(bool is_dead);
   void ResetTimer(Request* req, unsigned int timeout);
   void SetTimer(unsigned int timeout);
   void UnsetTimer();
+  bool Contains(unsigned int req_id) const;
 
   std::list<std::shared_ptr<Request>>& GetRequests();
   std::list<std::shared_ptr<ReplyInfo>>& GetReplyInfos();
index e794c9bc25018885e8c36c867df0dc69ac24cead..2500bd8b0e4ec76e5a30cea499de6c1f237f7d06 100644 (file)
@@ -219,6 +219,13 @@ timespec& Request::GetStartTime() {
   return start_;
 }
 
+void Request::SetTimer() {
+  timespec end{};
+  clock_gettime(CLOCK_MONOTONIC, &end);
+  auto interval = GetPendingInterval(GetStartTime(), end);
+  SetTimer(interval);
+}
+
 void Request::SetTimer(unsigned int timeout) {
   if (timer_ != 0) {
     _W("Already registered timeout event");
index 125f9fa473834aa7335ddacf28990792d22d3789..b7bc626e9dcf169aa7416bb62aa499c1e07f1293 100644 (file)
@@ -92,6 +92,7 @@ class Request : public std::enable_shared_from_this<Request> {
   unsigned char* GetRaw() const;
   const std::shared_ptr<tizen_base::Bundle>& GetBundle() const;
   void SetBundle(std::shared_ptr<tizen_base::Bundle> b);
+  void SetTimer();
   void SetTimer(unsigned int timeout);
   void UnsetTimer();
   void SetCritical();
index acfdc1ca285390d9a87cdfee4962fe602aa7570c..59e274e4d67b5b11c5cbe4ce2c9a8e91dc5fb10d 100644 (file)
@@ -154,6 +154,17 @@ std::shared_ptr<PendingItem> RequestManager::FindPendingItem(pid_t pid) {
   return nullptr;
 }
 
+std::shared_ptr<PendingItem> RequestManager::FindPendingItem(
+    unsigned int req_id) {
+  for (const auto& iter : pending_items_) {
+    auto& item = iter.second;
+    if (item->Contains(req_id))
+      return item;
+  }
+
+  return nullptr;
+}
+
 std::shared_ptr<PendingItem> RequestManager::CreatePendingItem(
     unsigned int req_id, const std::string& appid, pid_t caller_pid,
     pid_t pid) {
@@ -214,17 +225,23 @@ void RequestManager::OnRequestTimeout(Request* request) {
   if (request == nullptr)
     return;
 
+  _E("Timed out. request(%s[%d]:%d:%u:%d)",
+      aul_cmd_convert_to_string(request->GetCmd()),
+      request->GetCmd(), request->GetPID(), request->GetTargetUID(),
+      request->GetID());
+
   auto req = request->GetSharedPtr();
-  auto pending_item = FindPendingItem(req->GetTargetPID());
-  if (pending_item != nullptr)
+  auto pending_item = FindPendingItem(static_cast<unsigned int>(req->GetID()));
+  if (pending_item != nullptr) {
     pending_item->RemoveRequest(req);
 
-  if (req->GetClientFD() > -1)
-    req->SendResult(-EAGAIN);
+    if (req->GetClientFD() > -1)
+      req->SendResult(-EAGAIN);
 
-  if (req->CheckCritical()) {
-    _E("App(%d) is not responding. req_id(%d)", req->GetTargetPID(),
-        req->GetID());
+    if (req->CheckCritical()) {
+      _E("App(%d) is not responding. req_id(%d)", req->GetTargetPID(),
+          req->GetID());
+    }
   }
 }
 
@@ -357,7 +374,7 @@ Request::Status RequestManager::CheckStatus(const RequestPtr& req) {
       _W("%s is waiting to be started. request_id: %u",
           appid.c_str(), app_status ? app_status->GetRequestID() : 0);
       req->SetCritical();
-      req->SetTimer(kPendingRequestTimeout);
+      req->SetTimer();
     }
   }
 
index 668a0ab133b3b53b399aaf881e86af142317543b..d3de2a957617c2550b41136080d967ce8b92d87a 100644 (file)
@@ -80,6 +80,7 @@ class RequestManager : public Request::IEvent,
       const ucred& cr);
   std::shared_ptr<PendingItem> GetPendingItem(const RequestPtr& req,
       const std::string& appid);
+  std::shared_ptr<PendingItem> FindPendingItem(unsigned int req_id);
 
   static gboolean ProcessRequest(gpointer data);
   static void DispatchRequest(const RequestPtr& req);