std::sort(pkgs.begin(), pkgs.end());
std::sort(apps.begin(), apps.end());
+ if (!pkg_writer_.Init()) {
+ LOG(ERROR) << "pkg_writer init fail";
+ return PMINFO_R_ERROR;
+ }
+
+ if (!app_writer_.Init()) {
+ LOG(ERROR) << "pkg_writer init fail";
+ return PMINFO_R_ERROR;
+ }
+
+ auto p_lock = pkg_writer_.GetLock();
+ auto a_lock = app_writer_.GetLock();
+
if (!pkg_writer_.CreateSharedMemory(pkgs)) {
LOG(ERROR) << "Failed to create pkg shared memory";
return PMINFO_R_ERROR;
return PMINFO_R_ERROR;
}
+ pkg_app_map_.clear();
+ for (const auto& pkg : pkgs)
+ pkg_app_map_[pkg.GetPackage()];
+
+ for (const auto& app : apps)
+ pkg_app_map_[app.GetPackage()].emplace(app.GetAppId());
+
released_ = false;
return PMINFO_R_OK;
void ShmManager::InsertWriterPID(pid_t pid) {
std::unique_lock<std::shared_mutex> u(pid_list_lock_);
+ LOGD("InsertWriterPID %d", pid);
writer_pid_list_.insert(pid);
}
bool ShmManager::EraseWriterPID(pid_t pid) {
std::unique_lock<std::shared_mutex> u(pid_list_lock_);
+ LOGD("EraseWriterPID %d", pid);
return writer_pid_list_.erase(pid) == 1;
}
const tizen_base::Database& db, package_x* info,
pid_t pid, uid_t uid, const std::string& locale,
pkgmgr_common::PkgWriteType write_type) {
+ LOGD("register pending package info : %s", info->package);
if (!info || !info->package)
return;
tmp_filter.cache_flag = true;
tmp_filter.list = g_slist_append(tmp_filter.list, (gpointer)&node);
+ auto p_lock = pkg_writer_.GetLock();
+ auto a_lock = app_writer_.GetLock();
+
for (const auto& pkgid : pkgids) {
auto pkg_it = pending_pkg_.find(pkgid);
if (pkg_it == pending_pkg_.end())
}
void ShmManager::TrimCache() {
+ LOGD("TrimCache");
if (!released_)
ReleaseCache();
}
void ShmManager::ReleaseCache() {
+ LOGD("ReleaseCache");
pending_pkg_.clear();
released_ = true;
const tizen_base::Database& db,
uid_t uid, const std::string& locale,
const std::unordered_set<pid_t>& pids) {
+ LOGD("UpdateCrashedWriterPackageInfo");
std::vector<std::string> pkgids;
for (const auto& [pkgid, pid] : pending_pkg_) {
if (pids.find(pid) == pids.end())
tmp_filter.list = g_slist_append(tmp_filter.list, (gpointer)&node);
std::vector<pkgmgr_common::PkgInfoHandle> pkgs;
internal::GetPkgInfo(db, &tmp_filter, uid_, locale, pkgs);
+ auto p_lock = pkg_writer_.GetLock();
+ auto a_lock = app_writer_.GetLock();
for (const auto& pkg : pkgs) {
std::string pkgid = pkg.GetPackage();
if (!pkg_writer_.Erase(pkgid))
tmp_filter.list = g_slist_append(tmp_filter.list, (gpointer)&node);
std::vector<pkgmgr_common::AppInfoHandle> app_list;
- if (!app_writer_.Erase(appid))
- return false;
internal::GetAppInfo(db, &tmp_filter, uid_, uid, locale, app_list);
g_slist_free(tmp_filter.list);
+ auto a_lock = app_writer_.GetLock();
+ if (!app_writer_.Erase(appid))
+ return false;
+
for (const auto& app : app_list)
if (!AddApp(app))
return false;
std::vector<pkgmgr_common::AppInfoHandle> app_list;
internal::GetAppInfo(db, &tmp_filter, uid_, uid, locale, app_list);
+ auto a_lock = app_writer_.GetLock();
for (const auto& appid : pkg_app_map_[pkgid])
if (!app_writer_.Erase(appid))
return false;
namespace ps = pkgmgr_common::shared_memory;
template<typename T>
-bool ShmWriter<T>::CreateSharedMemory(const std::vector<T>& handles) {
+bool ShmWriter<T>::Init() {
if (!config_handler_.Create()) {
LOGE("Failed to create config handler");
return false;
}
- int ret = config_handler_.GetWriteLock();
- if (ret != 0) {
- LOGE("GetWriteLock fail, %d", ret);
- return false;
- }
+ return true;
+}
+template<typename T>
+bool ShmWriter<T>::CreateSharedMemory(const std::vector<T>& handles) {
WriteHandles(handles);
config_handler_.SetMemSize(handle_mapper_.GetSize());
return index_mapper_.GetSize() / sizeof(ps::HandleMappingData);
}
+template<typename T>
+LockGuard ShmWriter<T>::GetLock() {
+ return LockGuard(config_handler_);
+}
+
} // namespace shared_memory
} // namespace pkgmgr_server