if (pkgid == nullptr)
return -1;
- return amd::app_status::AppStatusManager::GetInst().TerminateAppsByPkgid(
+ return amd::app_status::AppStatusManager::GetInst().TerminateAppsByPkgId(
pkgid, uid);
}
#include "lib/amd_restart_manager.h"
#include "lib/api/amd_api_noti.hh"
+#include "lib/app_status/app_status_manager.hh"
#include "lib/common/log_private.hh"
namespace amd {
}
void AppInfoManager::SetPackageBlocking(uid_t target_uid,
- const std::string& pkgid, const std::string& global) {
+ const std::string& pkgid, const std::string& global, bool do_kill) {
if (target_uid < REGULAR_UID_MIN) {
for (auto const& iter : app_info_chunk_) {
uid_t uid = iter.first;
- SetPackageBlocking(uid, pkgid, global);
+ SetPackageBlocking(uid, pkgid, global, do_kill);
}
return;
}
_D("Terminate apps of package(%s)", pkgid.c_str());
- _app_status_terminate_apps_by_pkgid(pkgid.c_str(), target_uid);
+ if (do_kill) {
+ app_status::AppStatusManager::GetInst().KillAppsByPkgId(pkgid, target_uid);
+ } else {
+ app_status::AppStatusManager::GetInst().TerminateAppsByPkgId(pkgid,
+ target_uid);
+ }
}
void AppInfoManager::UnsetPackageBlocking(uid_t target_uid,
event_name == "move") {
uid_t target_uid = args->GetTargetUid();
const std::string& pkgid = args->GetPkgId();
- SetPackageBlocking(target_uid, pkgid, helper::IsGlobalUser(target_uid));
+ SetPackageBlocking(target_uid, pkgid, helper::IsGlobalUser(target_uid),
+ event_name == "uninstall");
helper::NotiSend(AMD_NOTI_MSG_APPINFO_PACKAGE_UPDATE_START, target_uid,
pkgid);
}
std::shared_ptr<AppInfoChunk> PrepareAppInfoChunk(uid_t uid);
void SetPackageBlocking(uid_t target_uid, const std::string& pkgid,
- const std::string& global);
+ const std::string& global, bool do_kill);
void UnsetPackageBlocking(uid_t target_uid, const std::string& pkgid,
const std::string& global, bool restart);
bool ExistPackageAppInfo(uid_t target_uid, const std::string& pkgid,
return 0;
}
-int AppStatusManager::TerminateAppsByPkgid(const std::string& pkgid,
+int AppStatusManager::TerminateAppsByPkgId(const std::string& pkgid,
uid_t uid) {
for (auto& app : app_status_list_) {
if (app->GetUID() == uid && app->GetStatus() != STATUS_DYING &&
return 0;
}
+int AppStatusManager::KillAppsByPkgId(const std::string& pkgid, uid_t uid) {
+ for (auto& app : app_status_list_) {
+ if (app->GetUID() == uid && app->GetPackageID() == pkgid) {
+ int ret = _launch_send_sigkill(app->GetPID(), app->GetUID());
+ if (ret < 0) {
+ _E("Failed to send sigkill. app(%s), pid(%d)",
+ app->GetAppID().c_str(), app->GetPID());
+ }
+
+ Update(app, STATUS_DYING, false, true);
+ DeleteSocketPath(app->GetPID(), app->GetUID());
+ }
+ }
+
+ return 0;
+}
+
int AppStatusManager::PublishStatus(int pid, int context_status) {
static const std::string APP_STATUS_EVENT = "app_status_event";
auto app = Find(pid);
int SendRunningAppinfo(int fd, int cmd, uid_t uid);
int ForeachRunningAppinfo(ForeachCb callback, void* data);
int TerminateApps(const std::string& appid, uid_t uid);
- int TerminateAppsByPkgid(const std::string& pkgid, uid_t uid);
+ int TerminateAppsByPkgId(const std::string& pkgid, uid_t uid);
int TerminateAppsByResPackageID(const std::string& pkgid, uid_t uid);
+ int KillAppsByPkgId(const std::string& pkgid, uid_t uid);
int PublishStatus(int pid, int context_status);
void CleanUp(AppStatusPtr app);