2017-07-15 16 views
0

私はプロセスを持っており、go()の状態の一部としてboardpidを作成します。gen_serverサブプロセスの停止不良の停止

私は、テーブルを終了することもボードを終了することをテストしています。しかし、理事会は期待通りに止まっていない。

私のテスト:table.erl

kills_board_test() -> 
    {ok, Table} = table:go(), 
    {BoardPid, _ ,_ } = s:s(Table, info), 
    gen_server:stop(Table), 
    undefined = process_info(BoardPid). 

私は実装しています

handle_call(stop, _From, State = {Board, _, _}) -> 
    gen_server:stop(Board), 
    {stop, normal, shutdown_ok, State}; 

私の結果は次のとおりです。

> 6>table_test:test(). table_test: kills_board_test (module 
> 'table_test')...*failed* in function table_test:kills_board_test/0 
> (table_test.erl, line 8) 
> **error:{badmatch,[{current_function,{gen_server,loop,6}}, 
>   {initial_call,{proc_lib,init_p,5}}, 
>   {status,waiting}, 
>   {message_queue_len,0}, 
>   {messages,[]}, 
>   {links,[]}, 
>   {dictionary,[{'$initial_call',{board,init,1}}, 
>       {'$ancestors',[<0.351.0>,<0.349.0>]}]}, 
>   {trap_exit,false}, 
>   {error_handler,error_handler}, 
>   {priority,normal}, 
>   {group_leader,<0.350.0>}, 
>   {total_heap_size,233}, 
>   {heap_size,233}, 
>   {stack_size,9}, 
>   {reductions,152}, 
>   {garbage_collection,...}, 
>   {...}]} output:<<"Table Terminating.{<0.352.0>, 
>     #{current_player => x,result => playing}, 
>     #{o => {<0.355.0>,<0.356.0>},x => {<0.353.0>,<0.354.0>}}} ">> 
> 
> ======================================================= Failed: 1. Skipped: 0. Passed: 0. error 

EDIT:

私はテキスト "終了" を参照してください。しかし、私は理解したその停止は、終了する前に完了するのを待つでしょう。

+2

'gen_server:stop(Table)'の代わりに 'gen_server:call(Table、stop)'を実行したのですか? – Dogbert

+0

* doh *、はい、ありがとう! (再び、あなたは英雄です) – quantumpotato

答えて

1

あなたのカスタム停止行動はhandle_call(stop, ...)ですが、そのコードを呼び出さないgen_server:stop/1を呼び出しています。あなたはおそらく代わりにgen_server:call(Table, stop)を行うことを意味しました。 、今

terminate(_Reason, _State = {Board, _, _}) -> 
    gen_server:stop(Board) 

:あなたはgen_server:stop(あなたがhandle_callでこの動作を実装する理由がない限り)によって自動的に呼び出さである、Module:terminate/2にこの停止動作を移動したいかもしれません、と述べた

gen_server:stop(Table)がこのコールバックを呼び出し、Boardを自動的に停止します。

関連する問題