Repository: couchdb-couch Updated Branches: refs/heads/2657-fix-cassim-fabric-calls 4d4c69e17 -> 73158bf6e (forced update)
add couch_util:with_proc/4 BugzId: 2657 Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch/repo Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch/commit/73158bf6 Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch/tree/73158bf6 Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch/diff/73158bf6 Branch: refs/heads/2657-fix-cassim-fabric-calls Commit: 73158bf6e4920a74d9468c796fdb094472e8a41d Parents: 42c9047 Author: Russell Branca <[email protected]> Authored: Mon Apr 20 19:57:20 2015 +0000 Committer: Russell Branca <[email protected]> Committed: Mon Apr 20 21:01:14 2015 +0000 ---------------------------------------------------------------------- src/couch_util.erl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/73158bf6/src/couch_util.erl ---------------------------------------------------------------------- diff --git a/src/couch_util.erl b/src/couch_util.erl index 7e16866..69fd53f 100644 --- a/src/couch_util.erl +++ b/src/couch_util.erl @@ -33,6 +33,7 @@ -export([integer_to_boolean/1, boolean_to_integer/1]). -export([find_in_binary/2]). -export([callback_exists/3, validate_callback_exists/3]). +-export([with_proc/4]). -include_lib("couch/include/couch_db.hrl"). @@ -569,3 +570,20 @@ ensure_loaded(Module) when is_atom(Module) -> false end; ensure_loaded(_Module) -> false. + + +%% This is especially useful in gen_servers when you need to call +%% a function that does a receive as it would hijack incoming messages. +with_proc(M, F, A, Timeout) -> + {Pid, Ref} = spawn_monitor(fun() -> + exit(erlang:apply(M, F, A)) + end), + receive + {'DOWN', Ref, process, Pid, Resp} -> + {ok, Resp}; + {'DOWN', Ref, process, Pid, Error} -> + {error, Error} + after Timeout -> + erlang:demonitor(Ref, [flush]), + {error, timeout} + end.
