diff --git a/src/network/manager.c b/src/network/manager.c index 4b0f0c3d427..62b857ed5cf 100644 --- a/src/network/manager.c +++ b/src/network/manager.c @@ -564,19 +564,26 @@ int swManager_wait_other_worker(swProcessPool *pool, pid_t pid, int status) swServer *serv = SwooleG.serv; swWorker *exit_worker; - exit_worker = swHashMap_find_int(serv->gs->task_workers.map, pid); - if (exit_worker) + if (serv->gs->task_workers.map) { - swManager_check_exit_status(serv, exit_worker->id, pid, status); - return swManager_spawn_task_worker(serv, exit_worker); + exit_worker = swHashMap_find_int(serv->gs->task_workers.map, pid); + if (exit_worker) + { + swManager_check_exit_status(serv, exit_worker->id, pid, status); + return swManager_spawn_task_worker(serv, exit_worker); + } } - exit_worker = swHashMap_find_int(serv->user_worker_map, pid); - if (exit_worker != NULL) + if (serv->user_worker_map) { - swManager_check_exit_status(serv, exit_worker->id, pid, status); - return swManager_spawn_user_worker(serv, exit_worker); + exit_worker = swHashMap_find_int(serv->user_worker_map, pid); + if (exit_worker != NULL) + { + swManager_check_exit_status(serv, exit_worker->id, pid, status); + return swManager_spawn_user_worker(serv, exit_worker); + } } + return SW_ERR; } diff --git a/swoole_coroutine.cc b/swoole_coroutine.cc index 37eec7b7983..4ab16212581 100644 --- a/swoole_coroutine.cc +++ b/swoole_coroutine.cc @@ -433,8 +433,8 @@ void sw_coro_close() { coro_task *task = (coro_task *) php_coro_get_current_task(); #ifdef SW_LOG_TRACE_OPEN - long cid = task->co->get_cid(); - long origin_cid = task->origin_task->co->get_cid(); + long cid = coroutine_get_cid(task->co); + long origin_cid = coroutine_get_cid(task->origin_task->co); #endif if (SwooleG.hooks[SW_GLOBAL_HOOK_ON_CORO_STOP]) diff --git a/tests/swoole_server/kill_user_process_01.phpt b/tests/swoole_server/kill_user_process_01.phpt new file mode 100644 index 00000000000..6979306b839 --- /dev/null +++ b/tests/swoole_server/kill_user_process_01.phpt @@ -0,0 +1,52 @@ +--TEST-- +swoole_server: kill user process [SWOOLE_PROCESS] +--SKIPIF-- + +--FILE-- +parentFunc = function ($pid) use ($pm) { + for ($i = 0; $i < 1; $i++) + { + //杀死进程 + shell_exec("ps aux | grep \"" . WORKER_PROC_NAME . "\" |grep -v grep| awk '{ print $2}' | xargs kill"); + usleep(10000); + //判断进程是否存在 + assert(intval(shell_exec("ps aux | grep \"" . WORKER_PROC_NAME . "\" |grep -v grep| awk '{ print $2}'")) > 0); + } + $pm->kill(); +}; + +$pm->childFunc = function () use ($pm) +{ + $serv = new \swoole_server('127.0.0.1', $pm->getFreePort(), SWOOLE_PROCESS); +// $serv->set( +// ['log_file' => TEST_LOG_FILE,] +// ); + $process2 = new swoole_process(function ($worker) use ($serv) { + global $argv; + swoole_set_process_name(WORKER_PROC_NAME); + swoole_timer_after(200000, function ($interval) use ($worker, $serv) { + echo "OK\n"; + }); + }, false); + $serv->addProcess($process2); + $serv->set(["worker_num" => 2, 'log_file' => '/dev/null',]); + $serv->on("WorkerStart", function (\swoole_server $serv, $worker_id) use ($pm) { + + }); + $serv->on("Receive", function (\swoole_server $serv, $fd, $reactorId, $data) + { + }); + $serv->start(); +}; + +$pm->childFirst(); +$pm->run(); + +?> +--EXPECT-- diff --git a/tests/swoole_server/kill_user_process_02.phpt b/tests/swoole_server/kill_user_process_02.phpt new file mode 100644 index 00000000000..f68e970b88c --- /dev/null +++ b/tests/swoole_server/kill_user_process_02.phpt @@ -0,0 +1,52 @@ +--TEST-- +swoole_server: kill user process [SWOOLE_BASE] +--SKIPIF-- + +--FILE-- +parentFunc = function ($pid) use ($pm) { + for ($i = 0; $i < 1; $i++) + { + //杀死进程 + shell_exec("ps aux | grep \"" . WORKER_PROC_NAME . "\" |grep -v grep| awk '{ print $2}' | xargs kill"); + usleep(10000); + //判断进程是否存在 + assert(intval(shell_exec("ps aux | grep \"" . WORKER_PROC_NAME . "\" |grep -v grep| awk '{ print $2}'")) > 0); + } + $pm->kill(); +}; + +$pm->childFunc = function () use ($pm) +{ + $serv = new \swoole_server('127.0.0.1', $pm->getFreePort(), SWOOLE_BASE); +// $serv->set( +// ['log_file' => TEST_LOG_FILE,] +// ); + $process2 = new swoole_process(function ($worker) use ($serv) { + global $argv; + swoole_set_process_name(WORKER_PROC_NAME); + swoole_timer_after(200000, function ($interval) use ($worker, $serv) { + echo "OK\n"; + }); + }, false); + $serv->addProcess($process2); + $serv->set(["worker_num" => 2, 'log_file' => '/dev/null',]); + $serv->on("WorkerStart", function (\swoole_server $serv, $worker_id) use ($pm) { + + }); + $serv->on("Receive", function (\swoole_server $serv, $fd, $reactorId, $data) + { + }); + $serv->start(); +}; + +$pm->childFirst(); +$pm->run(); + +?> +--EXPECT-- diff --git a/tests/swoole_server/kill_worker_01.phpt b/tests/swoole_server/kill_worker_01.phpt index 7ea60390f0d..ed1f6cc9644 100644 --- a/tests/swoole_server/kill_worker_01.phpt +++ b/tests/swoole_server/kill_worker_01.phpt @@ -1,6 +1,5 @@ --TEST-- swoole_server: kill worker [SWOOLE_BASE] - --SKIPIF-- --FILE-- @@ -11,7 +10,7 @@ const WORKER_PROC_NAME = 'swoole_unittest_server_event_worker'; $pm = new ProcessManager; $pm->parentFunc = function ($pid) use ($pm) { - for ($i = 0; $i < 1; $i++) + for ($i = 0; $i < 5; $i++) { //杀死进程 shell_exec("ps aux | grep \"" . WORKER_PROC_NAME . "\" |grep -v grep| awk '{ print $2}' | xargs kill");