/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2021 - 2022 Samsung Electronics Co., Ltd All Rights Reserved
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "create_cache_request.hh"
#include "cynara_checker.hh"
#include "pkg_request.hh"
+#include "remove_all_cache_request.hh"
#include "runner.hh"
#include "utils/logging.hh"
SetCPUInheritance();
auto condition = static_cast<GIOCondition>(G_IO_IN);
sid_ = g_unix_fd_add(server_->GetFd(), condition, OnReceiveRequest, this);
+ default_uid_ = tzplatform_getuid(TZ_SYS_DEFAULT_USER);
pkgmgr_common::SystemLocale::GetInst().RegisterEvent(this);
+ pkgmgr_common::DbChangeObserver::GetInst().Listen();
+ pkgmgr_common::DbChangeObserver::GetInst().RegisterEvent(this);
thread_pool_->SetLocale(pkgmgr_common::SystemLocale::GetInst().Get());
- if (CacheFlag::SetPreparing()) {
- QueueRequest(
- std::make_shared<CreateCacheRequest>(
- tzplatform_getuid(TZ_SYS_DEFAULT_USER)));
- }
+ if (CacheFlag::SetPreparing())
+ QueueRequest(std::make_shared<CreateCacheRequest>(default_uid_, this));
+
LOGI("Start Runner");
}
Runner::~Runner() {
g_source_remove(sid_);
+ if (timer_ > 0)
+ g_source_remove(timer_);
CynaraChecker::GetInst().Fini();
pkgmgr_common::SystemLocale::GetInst().UnRegisterEvent();
+ pkgmgr_common::DbChangeObserver::GetInst().UnRegisterEvent();
}
int Runner::OnReceiveRequest(int fd, GIOCondition cond, void* user_data) {
if (CacheFlag::SetPreparing()) {
runner->QueueRequest(
- std::make_shared<CreateCacheRequest>(req->GetSenderUID()));
+ std::make_shared<CreateCacheRequest>(runner->default_uid_, runner));
}
runner->QueueRequest(std::move(req));
void Runner::OnChanged(const std::string& locale) {
thread_pool_->SetLocale(locale);
+ QueueRequest(std::make_shared<RemoveAllCacheRequest>(default_uid_));
+}
+
+void Runner::OnDbChanged() {
+ QueueRequest(std::make_shared<RemoveAllCacheRequest>(default_uid_));
+ SetCreateCacheTimer();
}
bool Runner::QueueRequest(std::shared_ptr<PkgRequest> req) {
return true;
}
+void Runner::OnCreateCacheDone(bool success) {
+ static bool ready = false;
+ if (ready)
+ return;
+
+ if (success) {
+ ready = true;
+ LOG(WARNING) << "pkginfo-server is ready";
+ g_idle_add(
+ [](gpointer data) -> gboolean {
+ int fd = creat("/run/.pkginfo_server_ready",
+ S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
+ if (fd != -1)
+ close(fd);
+
+ return G_SOURCE_REMOVE;
+ },
+ nullptr);
+ } else {
+ LOG(WARNING) << "Fail to create cache";
+ SetCreateCacheTimer();
+ }
+}
+
void Runner::SetCPUInheritance() {
int ret;
resource_pid_t resource_st = { 0, };
LOG(ERROR) << "Fail to register cpu inheritance destination ret : " << ret;
}
+void Runner::SetCreateCacheTimer() {
+ if (timer_ > 0)
+ g_source_remove(timer_);
+
+ timer_ = g_timeout_add_seconds_full(G_PRIORITY_LOW, 10,
+ RetryCreateCache, this, NULL);
+}
+
+gboolean Runner::RetryCreateCache(void* data) {
+ LOG(WARNING) << "Retry to create cache";
+ auto* runner = static_cast<Runner*>(data);
+ runner->timer_ = 0;
+
+ pkgmgr_common::DbChangeObserver::GetInst().SetChanged(false);
+ pkgmgr_common::DbChangeObserver::GetInst().Listen();
+
+ if (CacheFlag::SetPreparing()) {
+ runner->QueueRequest(
+ std::make_shared<CreateCacheRequest>(runner->default_uid_, runner));
+ }
+ return G_SOURCE_REMOVE;
+}
+
} // namespace pkgmgr_server