Skip to content

Commit

Permalink
fix #2145
Browse files Browse the repository at this point in the history
  • Loading branch information
matyhtf committed Nov 24, 2018
1 parent 8e59e8f commit c45cd42
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 12 deletions.
23 changes: 15 additions & 8 deletions src/network/manager.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
4 changes: 2 additions & 2 deletions swoole_coroutine.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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])
Expand Down
52 changes: 52 additions & 0 deletions tests/swoole_server/kill_user_process_01.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
--TEST--
swoole_server: kill user process [SWOOLE_PROCESS]
--SKIPIF--
<?php require __DIR__ . "/../include/skipif.inc"; ?>
--FILE--
<?php
require __DIR__ . "/../include/bootstrap.php";

const WORKER_PROC_NAME = 'swoole_unittest_server_user_process';
$pm = new ProcessManager;

$pm->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--
52 changes: 52 additions & 0 deletions tests/swoole_server/kill_user_process_02.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
--TEST--
swoole_server: kill user process [SWOOLE_BASE]
--SKIPIF--
<?php require __DIR__ . "/../include/skipif.inc"; ?>
--FILE--
<?php
require __DIR__ . "/../include/bootstrap.php";

const WORKER_PROC_NAME = 'swoole_unittest_server_user_process';
$pm = new ProcessManager;

$pm->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--
3 changes: 1 addition & 2 deletions tests/swoole_server/kill_worker_01.phpt
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
--TEST--
swoole_server: kill worker [SWOOLE_BASE]

--SKIPIF--
<?php require __DIR__ . "/../include/skipif.inc"; ?>
--FILE--
Expand All @@ -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");
Expand Down

0 comments on commit c45cd42

Please sign in to comment.