mirror of
https://gitee.com/openharmony/startup_appspawn
synced 2024-11-23 15:10:44 +00:00
!914 fix the issue of killing process in same group when native process exits
Merge pull request !914 from nianyuu/master
This commit is contained in:
commit
9e663eb792
@ -85,13 +85,14 @@ static void AppInfoHashNodeFree(const HashNode *node, void *context)
|
|||||||
free(testNode);
|
free(testNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
APPSPAWN_STATIC void AddAppInfo(pid_t pid, const char *processName)
|
APPSPAWN_STATIC void AddAppInfo(pid_t pid, const char *processName, AppOperateType code)
|
||||||
{
|
{
|
||||||
size_t len = strlen(processName) + 1;
|
size_t len = strlen(processName) + 1;
|
||||||
AppInfo *node = (AppInfo *)malloc(sizeof(AppInfo) + len + 1);
|
AppInfo *node = (AppInfo *)malloc(sizeof(AppInfo) + len + 1);
|
||||||
APPSPAWN_CHECK(node != NULL, return, "Failed to malloc for appinfo");
|
APPSPAWN_CHECK(node != NULL, return, "Failed to malloc for appinfo");
|
||||||
|
|
||||||
node->pid = pid;
|
node->pid = pid;
|
||||||
|
node->code = code;
|
||||||
int ret = strcpy_s(node->name, len, processName);
|
int ret = strcpy_s(node->name, len, processName);
|
||||||
APPSPAWN_CHECK(ret == 0, free(node);
|
APPSPAWN_CHECK(ret == 0, free(node);
|
||||||
return, "Failed to strcpy process name");
|
return, "Failed to strcpy process name");
|
||||||
@ -99,12 +100,12 @@ APPSPAWN_STATIC void AddAppInfo(pid_t pid, const char *processName)
|
|||||||
ret = OH_HashMapAdd(g_appSpawnContent->appMap, &node->node);
|
ret = OH_HashMapAdd(g_appSpawnContent->appMap, &node->node);
|
||||||
APPSPAWN_CHECK(ret == 0, free(node);
|
APPSPAWN_CHECK(ret == 0, free(node);
|
||||||
return, "Failed to add appinfo to hash");
|
return, "Failed to add appinfo to hash");
|
||||||
APPSPAWN_LOGI("Add %{public}s, pid=%{public}d success", processName, pid);
|
APPSPAWN_LOGI("Add %{public}s, pid = %{public}d code = %{public}d success", processName, pid, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddNwebInfo(pid_t pid, const char *processName)
|
void AddNwebInfo(pid_t pid, const char *processName)
|
||||||
{
|
{
|
||||||
AddAppInfo(pid, processName);
|
AddAppInfo(pid, processName, DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
static AppInfo *GetAppInfo(pid_t pid)
|
static AppInfo *GetAppInfo(pid_t pid)
|
||||||
@ -310,8 +311,10 @@ static void MountAppEl2Dir(const AppSpawnClient* client)
|
|||||||
static void HandleDiedPid(pid_t pid, uid_t uid, int status)
|
static void HandleDiedPid(pid_t pid, uid_t uid, int status)
|
||||||
{
|
{
|
||||||
AppInfo *appInfo = GetAppInfo(pid);
|
AppInfo *appInfo = GetAppInfo(pid);
|
||||||
KillProcessesByCGroup(uid, appInfo);
|
|
||||||
APPSPAWN_CHECK(appInfo != NULL, return, "Can not find app info for %{public}d", pid);
|
APPSPAWN_CHECK(appInfo != NULL, return, "Can not find app info for %{public}d", pid);
|
||||||
|
if (appInfo->code != SPAWN_NATIVE_PROCESS) {
|
||||||
|
KillProcessesByCGroup(uid, appInfo);
|
||||||
|
}
|
||||||
if (WIFSIGNALED(status)) {
|
if (WIFSIGNALED(status)) {
|
||||||
APPSPAWN_LOGW("%{public}s with pid %{public}d exit with signal:%{public}d",
|
APPSPAWN_LOGW("%{public}s with pid %{public}d exit with signal:%{public}d",
|
||||||
appInfo->name, pid, WTERMSIG(status));
|
appInfo->name, pid, WTERMSIG(status));
|
||||||
@ -579,7 +582,7 @@ static int HandleMessage(AppSpawnClientExt *appProperty)
|
|||||||
APPSPAWN_LOGI("child process %{public}s %{public}s pid %{public}d",
|
APPSPAWN_LOGI("child process %{public}s %{public}s pid %{public}d",
|
||||||
appProperty->property.processName, (result == 0) ? "success" : "fail", appProperty->pid);
|
appProperty->property.processName, (result == 0) ? "success" : "fail", appProperty->pid);
|
||||||
if (result == 0) {
|
if (result == 0) {
|
||||||
AddAppInfo(appProperty->pid, appProperty->property.processName);
|
AddAppInfo(appProperty->pid, appProperty->property.processName, appProperty->property.code);
|
||||||
SendResponse(appProperty, (char *)&appProperty->pid, sizeof(appProperty->pid));
|
SendResponse(appProperty, (char *)&appProperty->pid, sizeof(appProperty->pid));
|
||||||
} else {
|
} else {
|
||||||
SendResponse(appProperty, (char *)&result, sizeof(result));
|
SendResponse(appProperty, (char *)&result, sizeof(result));
|
||||||
|
@ -57,6 +57,7 @@ typedef struct {
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
HashNode node;
|
HashNode node;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
AppOperateType code;
|
||||||
char name[0];
|
char name[0];
|
||||||
} AppInfo;
|
} AppInfo;
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ using nlohmann::json;
|
|||||||
TaskHandle AcceptClient(const LoopHandle loopHandle, const TaskHandle server, uint32_t flags);
|
TaskHandle AcceptClient(const LoopHandle loopHandle, const TaskHandle server, uint32_t flags);
|
||||||
bool ReceiveRequestData(const TaskHandle taskHandle, AppSpawnClientExt *appProperty,
|
bool ReceiveRequestData(const TaskHandle taskHandle, AppSpawnClientExt *appProperty,
|
||||||
const uint8_t *buffer, uint32_t buffLen);
|
const uint8_t *buffer, uint32_t buffLen);
|
||||||
void AddAppInfo(pid_t pid, const char *processName);
|
void AddAppInfo(pid_t pid, const char *processName, AppOperateType code);
|
||||||
void SignalHandler(const struct signalfd_siginfo *siginfo);
|
void SignalHandler(const struct signalfd_siginfo *siginfo);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
@ -707,9 +707,9 @@ HWTEST(AppSpawnStandardTest, App_Spawn_Standard_07, TestSize.Level0)
|
|||||||
GTEST_LOG_(INFO) << "App_Spawn_Standard_07 start";
|
GTEST_LOG_(INFO) << "App_Spawn_Standard_07 start";
|
||||||
AppSpawnContentExt *content = TestClient(0, DEFAULT, "ohos.test.testapp", "test007");
|
AppSpawnContentExt *content = TestClient(0, DEFAULT, "ohos.test.testapp", "test007");
|
||||||
EXPECT_TRUE(content != nullptr);
|
EXPECT_TRUE(content != nullptr);
|
||||||
AddAppInfo(111, "111");
|
AddAppInfo(111, "111", DEFAULT);
|
||||||
AddAppInfo(65, "112");
|
AddAppInfo(65, "112", DEFAULT);
|
||||||
AddAppInfo(97, "113");
|
AddAppInfo(97, "113", DEFAULT);
|
||||||
|
|
||||||
struct signalfd_siginfo siginfo = {};
|
struct signalfd_siginfo siginfo = {};
|
||||||
siginfo.ssi_signo = SIGCHLD;
|
siginfo.ssi_signo = SIGCHLD;
|
||||||
|
Loading…
Reference in New Issue
Block a user