#include <aul.h>
#include <aul_cmd.h>
+#include <aul_sock.h>
#include <amd.h>
+#include <bundle_cpp.h>
#include <sys/types.h>
#include <unistd.h>
#include <string>
#include <utility>
-#include "log_private.hh"
+#include "proc-group/log_private.hh"
#undef EXPORT
#define EXPORT __attribute__ ((visibility("default")))
return pid_;
}
+ bool Contains(pid_t pid) const {
+ return std::find(childs_.begin(), childs_.end(), pid) != childs_.end();
+ }
+
+ std::list<int>::const_iterator begin() const {
+ return childs_.cbegin();
+ }
+
+ std::list<int>::const_iterator end() const {
+ return childs_.cend();
+ }
+
private:
pid_t pid_;
std::list<int> childs_;
return inst;
}
- void AddProcGroup(pid_t pid) {
- if (map_.find(pid) != map_.end())
- return;
+ std::shared_ptr<ProcGroup> AddProcGroup(pid_t pid) {
+ auto group = FindProcGroup(pid);
+ if (group != nullptr)
+ return group;
- map_[pid] = std::make_shared<ProcGroup>(pid);
+ group = std::make_shared<ProcGroup>(pid);
+ map_[pid] = group;
+ return group;
}
void RemoveProcGroup(pid_t pid) {
auto found = map_.find(pid);
- if (found == map_.end())
+ if (found == map_.end()) {
+ for (auto& iter : map_) {
+ auto& group = iter.second;
+ if (group->Contains(pid)) {
+ group->Remove(pid);
+ break;
+ }
+ }
+
return;
+ }
map_.erase(found);
}
std::shared_ptr<ProcGroup> FindProcGroup(pid_t pid) {
auto found = map_.find(pid);
- if (found == map_.end())
+ if (found == map_.end()) {
+ for (auto& iter : map_) {
+ auto& group = iter.second;
+ if (group->Contains(pid))
+ return group;
+ }
+
return nullptr;
+ }
return found->second;
}
map_.clear();
}
+ const std::unordered_map<pid_t, std::shared_ptr<ProcGroup>>& GetMap() const {
+ return map_;
+ }
+
private:
std::unordered_map<pid_t, std::shared_ptr<ProcGroup>> map_;
};
}
auto& inst = ProcGroupManager::GetInst();
- inst.AddProcGroup(pgid);
+ auto group = inst.AddProcGroup(pgid);
if (pid != pgid) {
- auto group = inst.FindProcGroup(pgid);
if (group->Add(pid) == 0) {
const char* pkgid = amd_app_status_get_pkgid(app_status);
amd_signal_send_app_group_signal(pgid, pid, pkgid);
}
amd_request_send_result(req, 0);
- _W("[PROC_DEREGISTER] pgid(%d), pid(%d)", pgid, pid);
+ _W("[PROC_GROUP_REMOVE] pgid(%d), pid(%d)", pgid, pid);
+ return 0;
+}
+
+static int DispatchProcGroupForeach(amd_request_h req) {
+ auto& inst = ProcGroupManager::GetInst();
+ int index = 0;
+ tizen_base::Bundle b;
+ b.Add("__K_LENGTH", std::to_string(inst.GetMap().size()));
+ for (auto& iter : inst.GetMap()) {
+ std::vector<std::string> pids;
+ auto group = iter.second;
+ pids.push_back(std::to_string(iter.first));
+ for (auto& pid : *group)
+ pids.push_back(std::to_string(pid));
+
+ b.Add(std::to_string(index++), pids);
+ }
+
+ aul_sock_send_bundle_with_fd(amd_request_remove_fd(req), APP_GET_INFO_OK,
+ b.GetHandle(), AUL_SOCK_NOREPLY);
+ _W("[PROC_GROUP_FOREACH]");
+ return 0;
+}
+
+static int DispatchProcGroupGet(amd_request_h req) {
+ pid_t pid = GetPidFromBundle(amd_request_get_bundle(req));
+ if (pid < 1) {
+ amd_request_send_result(req, -EINVAL);
+ return -1;
+ }
+
+ auto& inst = ProcGroupManager::GetInst();
+ auto group = inst.FindProcGroup(pid);
+ std::vector<std::string> pids;
+ pids.push_back(std::to_string(group->GetPid()));
+ for (auto& p : *group)
+ pids.push_back(std::to_string(p));
+
+ tizen_base::Bundle b;
+ b.Add("__K_GROUP_INFO", pids);
+ aul_sock_send_bundle_with_fd(amd_request_remove_fd(req), APP_GET_INFO_OK,
+ b.GetHandle(), AUL_SOCK_NOREPLY);
+ _W("[PROC_GROUP_GET]");
return 0;
}
return AMD_CYNARA_RET_ALLOWED;
}
+static int OnAppGroupSet(const char* msg, int arg1, int arg2, void* arg3,
+ bundle* arg4) {
+ pid_t leader_pid = static_cast<pid_t>(arg1);
+ pid_t sub_pid = static_cast<pid_t>(arg2);
+ auto& inst = ProcGroupManager::GetInst();
+ auto group = inst.AddProcGroup(leader_pid);
+ if (!group->Contains(sub_pid))
+ group->Add(sub_pid);
+
+ return AMD_NOTI_CONTINUE;
+}
+
static int OnLaunchMainAppDead(const char* msg, int arg1, int arg2, void* arg3,
bundle* arg4) {
ProcGroupManager::GetInst().RemoveProcGroup(arg1);
.cmd = PROC_GROUP_REMOVE,
.callback = DispatchProcGroupRemove
},
+ {
+ .cmd = PROC_GROUP_FOREACH,
+ .callback = DispatchProcGroupForeach
+ },
+ {
+ .cmd = PROC_GROUP_GET,
+ .callback = DispatchProcGroupGet
+ },
};
static amd_cynara_checker cynara_checkers[] = {
{
.data = nullptr,
.priority = 10
},
+ {
+ .cmd = PROC_GROUP_FOREACH,
+ .checker = amd_cynara_simple_checker,
+ .data = static_cast<void*>(const_cast<char*>(PRIVILEGE_PLATFORM)),
+ .priority = 10
+ },
+ {
+ .cmd = PROC_GROUP_GET,
+ .checker = amd_cynara_simple_checker,
+ .data = static_cast<void*>(const_cast<char*>(PRIVILEGE_PLATFORM)),
+ .priority = 10
+ },
};
int ret = amd_request_register_cmds(dispatch_table,
return -1;
amd_noti_listen(AMD_NOTI_MSG_LAUNCH_MAIN_APP_DEAD, OnLaunchMainAppDead);
+ amd_noti_listen(AMD_NOTI_MSG_UTIL_APP_SET_PROCESS_GROUP, OnAppGroupSet);
+ amd_noti_listen(AMD_NOTI_MSG_APP_GROUP_SET, OnAppGroupSet);
return 0;
}