diff options
author | Raimo Niskanen <[email protected]> | 2011-09-19 11:36:35 +0200 |
---|---|---|
committer | Raimo Niskanen <[email protected]> | 2011-09-19 11:36:35 +0200 |
commit | ff371b3b33e435f63962615be06404f6f8af3d5e (patch) | |
tree | 557a78eaf20bb1fe415d95fd01905f1417a85366 /lib/kernel | |
parent | 801ec3847e330b7d67b1e4ae700211380da0d6bd (diff) | |
download | otp-ff371b3b33e435f63962615be06404f6f8af3d5e.tar.gz otp-ff371b3b33e435f63962615be06404f6f8af3d5e.tar.bz2 otp-ff371b3b33e435f63962615be06404f6f8af3d5e.zip |
erts: Fix bug SCTP send can only be called from controlling process
Conflicts:
lib/kernel/test/gen_sctp_SUITE.erl
Diffstat (limited to 'lib/kernel')
-rw-r--r-- | lib/kernel/test/gen_sctp_SUITE.erl | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/lib/kernel/test/gen_sctp_SUITE.erl b/lib/kernel/test/gen_sctp_SUITE.erl index fad8c7398b..da2f533097 100644 --- a/lib/kernel/test/gen_sctp_SUITE.erl +++ b/lib/kernel/test/gen_sctp_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2010. All Rights Reserved. +%% Copyright Ericsson AB 2007-2011. All Rights Reserved. %% %% The contents of this file are subject to the Erlang Public License, %% Version 1.1, (the "License"); you may not use this file except in @@ -172,7 +172,9 @@ xfer_active(Config) when is_list(Config) -> ?line test_server:fail({unexpected,flush()}) end, ?line io:format("SbAssocId=~p~n", [SbAssocId]), - ?line ok = gen_sctp:send(Sa, SaAssocId, 0, Data), + ?line ok = + do_from_other_process( + fun () -> gen_sctp:send(Sa, SaAssocId, 0, Data) end), ?line receive {sctp,Sb,Loopback,Pa, {[#sctp_sndrcvinfo{stream=Stream, @@ -382,3 +384,31 @@ api_connect_init(Config) when is_list(Config) -> ?line ok = gen_sctp:close(Sa), ?line ok = gen_sctp:close(Sb), ok. + + + +do_from_other_process(Fun) -> + Parent = self(), + Ref = make_ref(), + Child = + spawn(fun () -> + try Fun() of + Result -> + Parent ! {Ref,Result} + catch + Class:Reason -> + Stacktrace = erlang:get_stacktrace(), + Parent ! {Ref,Class,Reason,Stacktrace} + end + end), + Mref = erlang:monitor(process, Child), + receive + {Ref,Result} -> + receive {'DOWN',Mref,_,_,_} -> Result end; + {Ref,Class,Reason,Stacktrace} -> + receive {'DOWN',Mref,_,_,_} -> + erlang:raise(Class, Reason, Stacktrace) + end; + {'DOWN',Mref,_,_,Reason} -> + erlang:exit(Reason) + end. |