aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel/test/socket_server.erl
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2018-09-20 15:37:37 +0200
committerMicael Karlberg <[email protected]>2018-09-20 16:29:05 +0200
commit13d10bc60a41f98647d802524ea8ef8fa9af6b39 (patch)
tree2a56b2fa3b0d63c05c49aea93427a343e149835f /lib/kernel/test/socket_server.erl
parente01a856c993b55c3fbc76fd429783d4aad5bfc80 (diff)
downloadotp-13d10bc60a41f98647d802524ea8ef8fa9af6b39.tar.gz
otp-13d10bc60a41f98647d802524ea8ef8fa9af6b39.tar.bz2
otp-13d10bc60a41f98647d802524ea8ef8fa9af6b39.zip
[socket-nif] Add proper send timeout handling
Added proper send timeout handling. Made use of the enif_select(mode = cancel) feature. Each time a timeout expires, the "active" send (the surrent write select) has to be cancelled. OTP-14831
Diffstat (limited to 'lib/kernel/test/socket_server.erl')
-rw-r--r--lib/kernel/test/socket_server.erl24
1 files changed, 14 insertions, 10 deletions
diff --git a/lib/kernel/test/socket_server.erl b/lib/kernel/test/socket_server.erl
index 3e5c4e5d95..9142942428 100644
--- a/lib/kernel/test/socket_server.erl
+++ b/lib/kernel/test/socket_server.erl
@@ -34,8 +34,10 @@
-define(LIB, socket_lib).
-record(manager, {socket, msg, peek, acceptors, handler_id, handlers}).
--record(acceptor, {id, socket, manager, atimeout = 5000}).
--record(handler, {socket, peek, msg, type, manager}).
+-record(acceptor, {id, socket, manager,
+ atimeout = 5000}).
+-record(handler, {socket, peek, msg, type, manager,
+ stimeout = 5000, rtimeout = 5000}).
-define(NUM_ACCEPTORS, 5).
@@ -904,28 +906,30 @@ peek_recvfrom(Sock, BufSz) ->
end.
-send(#handler{socket = Sock, msg = true, type = stream}, Msg, _) ->
+send(#handler{socket = Sock, msg = true, type = stream, stimeout = Timeout},
+ Msg, _) ->
CMsgHdr = #{level => ip, type => tos, data => reliability},
CMsgHdrs = [CMsgHdr],
MsgHdr = #{iov => [Msg], ctrl => CMsgHdrs},
%% socket:setopt(Sock, otp, debug, true),
- Res = socket:sendmsg(Sock, MsgHdr),
+ Res = socket:sendmsg(Sock, MsgHdr, Timeout),
%% socket:setopt(Sock, otp, debug, false),
Res;
-send(#handler{socket = Sock, type = stream}, Msg, _) ->
- socket:send(Sock, Msg);
-send(#handler{socket = Sock, msg = true, type = dgram}, Msg, Dest) ->
+send(#handler{socket = Sock, type = stream, stimeout = Timeout}, Msg, _) ->
+ socket:send(Sock, Msg, Timeout);
+send(#handler{socket = Sock, msg = true, type = dgram, stimeout = Timeout},
+ Msg, Dest) ->
CMsgHdr = #{level => ip, type => tos, data => reliability},
CMsgHdrs = [CMsgHdr],
MsgHdr = #{addr => Dest,
iov => [Msg],
ctrl => CMsgHdrs},
%% ok = socket:setopt(Sock, otp, debug, true),
- Res = socket:sendmsg(Sock, MsgHdr),
+ Res = socket:sendmsg(Sock, MsgHdr, Timeout),
%% ok = socket:setopt(Sock, otp, debug, false),
Res;
-send(#handler{socket = Sock, type = dgram}, Msg, Dest) ->
- socket:sendto(Sock, Msg, Dest).
+send(#handler{socket = Sock, type = dgram, stimeout = Timeout}, Msg, Dest) ->
+ socket:sendto(Sock, Msg, Dest, Timeout).
%% filler() ->
%% list_to_binary(lists:duplicate(2048, " FILLER ")).