Handle abnormally terminated installer process
[platform/core/appfw/pkgmgr-info.git] / src / server / worker_thread.cc
index a80bb6d..129ff1d 100644 (file)
@@ -26,6 +26,7 @@
 #include "cynara_checker.hh"
 #include "request_handler_factory.hh"
 #include "server/database/db_handle_provider.hh"
+#include "server/database/remove_cache_db_handler.hh"
 #include "utils/logging.hh"
 
 #include "pkgmgrinfo_debug.h"
@@ -133,7 +134,7 @@ void WorkerThread::Run() {
 
     auto type = req->GetRequestType();
     LOG(WARNING) << "Request type: " << pkgmgr_common::ReqTypeToString(type)
-                 << " pid: " << req->GetSenderPID();
+        << " pid: " << req->GetSenderPID() << " tid: " << req->GetSenderTID();
     auto handler = factory.GetRequestHandler(type);
     if (handler == nullptr)
       continue;
@@ -142,15 +143,15 @@ void WorkerThread::Run() {
       handler->PreExec();
       handler->SetUID(ConvertUID(req->GetSenderUID()));
       handler->SetPID(req->GetSenderPID());
-      if (!handler->HandleRequest(req->GetData(), req->GetSize(),
+      if (!handler->HandleRequest(req->DetachData(), req->GetSize(),
           locale_.GetObject()))
         LOG(ERROR) << "Failed to handle request";
 
-      std::vector<uint8_t> result_data = handler->ExtractResult();
-      if (req->SendData(result_data.data(), result_data.size()) == false)
+      if (req->SendData(handler->ExtractResult()) == false)
         LOG(ERROR) << "Failed to send response pid: " << req->GetSenderPID();
       else
-        LOG(WARNING) << "Success response pid: " << req->GetSenderPID();
+        LOG(WARNING) << "Success response pid: " << req->GetSenderPID()
+            << " tid: " << req->GetSenderTID();
     } catch (const std::exception& err) {
       LOG(ERROR) << "Exception occurred: " << err.what()
                  << ", pid: " << req->GetSenderPID();
@@ -181,8 +182,13 @@ gboolean WorkerThread::TrimMemory(void* data) {
     h->timer_ = 0;
   }
 
-  if (database::DBHandleProvider::IsCrashedWriteRequest())
-    database::DBHandleProvider::GetInst(getuid()).UnsetMemoryMode(getpid());
+  auto crashed_writer_pids =
+      database::DBHandleProvider::CrashedWriteRequestPIDs();
+  if (!crashed_writer_pids.empty()) {
+    database::RemoveCacheDBHandler db(getuid(), std::move(crashed_writer_pids));
+    db.SetLocale(h->locale_.GetObject());
+    db.Execute();
+  }
 
   sqlite3_release_memory(-1);
   malloc_trim(0);
@@ -200,8 +206,7 @@ void WorkerThread::SendError(const std::shared_ptr<PkgRequest>& req) {
       0, pkgmgr_common::parcel::ParcelableType::Unknown, PMINFO_R_ERROR);
   tizen_base::Parcel p;
   p.WriteParcelable(parcelable);
-  std::vector<uint8_t> raw = p.GetRaw();
-  req->SendData(&raw[0], raw.size());
+  req->SendData(p);
 }
 
 }  // namespace pkgmgr_server