diff options
author | Zandra <[email protected]> | 2016-04-22 15:37:50 +0200 |
---|---|---|
committer | Zandra <[email protected]> | 2016-05-02 14:43:32 +0200 |
commit | fe1fe6b2ca2ebefd0b7e82b6651e35f6388a06d0 (patch) | |
tree | 8a6dbb09c47642aa040e2b980d9472ad178d97b3 | |
parent | 42a1166b47721cd444dbe8c70a04125d842a27c9 (diff) | |
download | otp-fe1fe6b2ca2ebefd0b7e82b6651e35f6388a06d0.tar.gz otp-fe1fe6b2ca2ebefd0b7e82b6651e35f6388a06d0.tar.bz2 otp-fe1fe6b2ca2ebefd0b7e82b6651e35f6388a06d0.zip |
let the spawned processes handle rpc replies
This decreases the load on the rex server.
-rw-r--r-- | lib/kernel/src/rpc.erl | 25 | ||||
-rw-r--r-- | lib/runtime_tools/test/dbg_SUITE.erl | 4 |
2 files changed, 7 insertions, 22 deletions
diff --git a/lib/kernel/src/rpc.erl b/lib/kernel/src/rpc.erl index 6f9ce17c0c..ee71d39253 100644 --- a/lib/kernel/src/rpc.erl +++ b/lib/kernel/src/rpc.erl @@ -130,30 +130,16 @@ handle_cast(_, S) -> -spec handle_info(term(), state()) -> {'noreply', state()}. +handle_info({'DOWN', _, process, Caller, normal}, S) -> + {noreply, gb_trees:delete(Caller, S)}; handle_info({'DOWN', _, process, Caller, Reason}, S) -> case gb_trees:lookup(Caller, S) of - {value, To} -> - receive - {Caller, {reply, Reply}} -> - gen_server:reply(To, Reply) - after 0 -> - gen_server:reply(To, {badrpc, {'EXIT', Reason}}) - end, + {value, To} -> + gen_server:reply(To, {badrpc, {'EXIT', Reason}}), {noreply, gb_trees:delete(Caller, S)}; none -> {noreply, S} end; -handle_info({Caller, {reply, Reply}}, S) -> - case gb_trees:lookup(Caller, S) of - {value, To} -> - receive - {'DOWN', _, process, Caller, _} -> - gen_server:reply(To, Reply), - {noreply, gb_trees:delete(Caller, S)} - end; - none -> - {noreply, S} - end; handle_info({From, {sbcast, Name, Msg}}, S) -> _ = case catch Name ! Msg of %% use catch to get the printout {'EXIT', _} -> @@ -190,7 +176,6 @@ code_change(_, S, _) -> %% Auxiliary function to avoid a false dialyzer warning -- do not inline %% handle_call_call(Mod, Fun, Args, Gleader, To, S) -> - RpcServer = self(), %% Spawn not to block the rpc server. {Caller,_} = erlang:spawn_monitor( @@ -205,7 +190,7 @@ handle_call_call(Mod, Fun, Args, Gleader, To, S) -> Result -> Result end, - RpcServer ! {self(), {reply, Reply}} + gen_server:reply(To, Reply) end), {noreply, gb_trees:insert(Caller, To, S)}. diff --git a/lib/runtime_tools/test/dbg_SUITE.erl b/lib/runtime_tools/test/dbg_SUITE.erl index 17c04c0ed4..04430263b4 100644 --- a/lib/runtime_tools/test/dbg_SUITE.erl +++ b/lib/runtime_tools/test/dbg_SUITE.erl @@ -202,8 +202,8 @@ distributed(Config) when is_list(Config) -> ?line {value, {matched, Node, 1}} = lists:keysearch(Node, 2, Z), ?line dbg:cn(Node), ?line dbg:tp(dbg,ln,[]), - ?line ok = rpc:call(Node, dbg, ltp, []), - ?line ok = rpc:call(Node, dbg, ln, []), + ?line ok = rpc:block_call(Node, dbg, ltp, []), + ?line ok = rpc:block_call(Node, dbg, ln, []), ?line ok = dbg:ln(), ?line S = self(), ?line {TraceSend, TraceCall} = |