diff options
author | Anders Svensson <[email protected]> | 2016-03-10 18:38:53 +0100 |
---|---|---|
committer | Anders Svensson <[email protected]> | 2016-03-13 07:10:11 +0100 |
commit | 9298872b8771dff87e732237e36fddc81bfbcbde (patch) | |
tree | ae3a655cf04e1047b5d4596fea632b163bb08978 | |
parent | 993d540a3ad0f2fc932fdfb0aabba06cb03f320c (diff) | |
download | otp-9298872b8771dff87e732237e36fddc81bfbcbde.tar.gz otp-9298872b8771dff87e732237e36fddc81bfbcbde.tar.bz2 otp-9298872b8771dff87e732237e36fddc81bfbcbde.zip |
Let a throttling callback answer a received message
As discussed in the parent commit. This is easier said than done in
practice, but there's no harm in allowing it.
-rw-r--r-- | lib/diameter/src/transport/diameter_tcp.erl | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/lib/diameter/src/transport/diameter_tcp.erl b/lib/diameter/src/transport/diameter_tcp.erl index b68a16b521..d22b0ff320 100644 --- a/lib/diameter/src/transport/diameter_tcp.erl +++ b/lib/diameter/src/transport/diameter_tcp.erl @@ -599,14 +599,8 @@ transition({E, Sock, _Reason} = T, #transport{socket = Sock, ?ERROR({T,S}); %% Outgoing message. -transition({diameter, {send, Bin}}, #transport{socket = Sock, - module = M}) -> - case send(M, Sock, Bin) of - ok -> - ok; - {error, Reason} -> - {stop, {send, Reason}} - end; +transition({diameter, {send, Bin}}, S) -> + send(Bin, S); %% Request to close the transport connection. transition({diameter, {close, Pid}}, #transport{parent = Pid, @@ -817,6 +811,17 @@ accept(Mod, LSock) -> connect(Mod, Host, Port, Opts) -> Mod:connect(Host, Port, Opts). +%% send/2 + +send(Bin, #transport{socket = Sock, + module = M}) -> + case send(M, Sock, Bin) of + ok -> + ok; + {error, Reason} -> + x({send, Reason}) + end. + %% send/3 send(gen_tcp, Sock, Bin) -> @@ -901,6 +906,17 @@ throttle({discard = T, F}, #transport{throttled = Msg} = S) when is_binary(Msg) -> throttle(T, S#transport{throttle_cb = F}); +%% Callback to accept a received message says to answer it with the +%% supplied binary. +throttle(Bin, #transport{throttled = Msg} = S) + when is_binary(Bin), is_binary(Msg) -> + send(Bin, S), + throttle(S#transport{throttled = true}); + +throttle({Bin, F}, #transport{throttled = Msg} = S) + when is_binary(Bin), is_binary(Msg) -> + throttle(Bin, S#transport{throttle_cb = F}); + %% Callback says to ask again in the specified number of milliseconds. throttle({timeout, Tmo}, #transport{} = S) -> erlang:send_after(Tmo, self(), throttle), |