Handle abnormally terminated installer process
[platform/core/appfw/pkgmgr-info.git] / src / server / database / db_handle_provider.cc
index 626a88e..516f3b0 100644 (file)
@@ -126,13 +126,12 @@ DBHandleProvider& DBHandleProvider::GetInst(uid_t uid) {
   return *prov;
 }
 
-bool DBHandleProvider::IsCrashedWriteRequest() {
+std::vector<pid_t> DBHandleProvider::CrashedWriteRequestPIDs() {
   std::unique_lock<std::shared_mutex> u(pid_list_lock_);
 
   if (writer_pid_list_.empty())
-    return false;
+    return {};
 
-  bool ret = true;
   LOG(DEBUG) << "Check process count : " << writer_pid_list_.size();
   std::vector<pid_t> remove_pids;
   for (pid_t pid : writer_pid_list_) {
@@ -143,7 +142,6 @@ bool DBHandleProvider::IsCrashedWriteRequest() {
       LOG(ERROR) << "Process is crashed : " << pid;
       remove_pids.push_back(pid);
     } else {
-      ret = false;
       close(fd);
     }
   }
@@ -151,7 +149,7 @@ bool DBHandleProvider::IsCrashedWriteRequest() {
   for (pid_t pid : remove_pids)
     writer_pid_list_.erase(pid);
 
-  return ret;
+  return remove_pids;
 }
 
 std::vector<std::pair<std::string, uid_t>> DBHandleProvider::GetParserDBPath() {
@@ -425,15 +423,17 @@ bool DBHandleProvider::ErasePID(pid_t pid) {
   return writer_pid_list_.erase(pid) == 1;
 }
 
-void DBHandleProvider::RegisterPendingPackageInfo(package_x* info) {
+void DBHandleProvider::RegisterPendingPackageInfo(package_x* info, pid_t pid) {
   if (!info || !info->package)
     return;
 
-  pending_pkg_.emplace(info->package);
+  InsertPID(pid);
+
+  pending_pkg_[pid].emplace(info->package);
 }
 
 void DBHandleProvider::UpdatePendingPackageInfo(const tizen_base::Database& db,
-    pid_t pid, uid_t uid, const std::string& locale) {
+    const std::vector<pid_t>& pids, uid_t uid, const std::string& locale) {
   pkgmgrinfo_filter_x tmp_filter = { 0, };
   pkgmgrinfo_node_x node = {
     .prop = E_PMINFO_PKGINFO_PROP_PACKAGE_ID
@@ -441,15 +441,19 @@ void DBHandleProvider::UpdatePendingPackageInfo(const tizen_base::Database& db,
   tmp_filter.cache_flag = true;
   tmp_filter.list = g_slist_append(tmp_filter.list, (gpointer)&node);
   std::map<std::string, std::shared_ptr<package_x>> pkgs;
-  for (const auto& pkg : pending_pkg_) {
-    pkg_map_.erase(pkg);
-    for (auto& appid : pkg_app_map_[pkg]) {
-      app_map_.erase(appid);
+  for (const pid_t& pid : pids) {
+    for (const auto& pkg : pending_pkg_[pid]) {
+      pkg_map_.erase(pkg);
+      for (auto& appid : pkg_app_map_[pkg]) {
+        app_map_.erase(appid);
+      }
+
+      pkg_app_map_.erase(pkg);
+      node.value = const_cast<char*>(pkg.c_str());
+      internal::GetPkgInfo(db, &tmp_filter, uid_, locale, pkgs);
     }
 
-    pkg_app_map_.erase(pkg);
-    node.value = const_cast<char*>(pkg.c_str());
-    internal::GetPkgInfo(db, &tmp_filter, uid_, locale, pkgs);
+    pending_pkg_.erase(pid);
   }
 
   for (auto& [key, val] : pkgs)
@@ -469,7 +473,6 @@ void DBHandleProvider::UpdatePendingPackageInfo(const tizen_base::Database& db,
   }
 
   g_slist_free(tmp_filter.list);
-  pending_pkg_.clear();
 }
 
 bool DBHandleProvider::UpdateCachePkg(const tizen_base::Database& db, uid_t uid,