aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Svensson <[email protected]>2016-03-10 18:38:53 +0100
committerAnders Svensson <[email protected]>2016-03-13 07:10:11 +0100
commit9298872b8771dff87e732237e36fddc81bfbcbde (patch)
treeae3a655cf04e1047b5d4596fea632b163bb08978
parent993d540a3ad0f2fc932fdfb0aabba06cb03f320c (diff)
downloadotp-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.erl32
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),