aboutsummaryrefslogtreecommitdiffstats
path: root/erts/preloaded/src/socket.erl
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2019-04-12 16:02:36 +0200
committerMicael Karlberg <[email protected]>2019-05-29 14:07:39 +0200
commit6ef2e9e290ffb378ff5a18b9c278d1a2ce15cf55 (patch)
treed9306da83600ce4d5fc06ab00fbe842e165e72e8 /erts/preloaded/src/socket.erl
parent9b3796b912fb1410a983e9ace5d892cdeda72926 (diff)
downloadotp-6ef2e9e290ffb378ff5a18b9c278d1a2ce15cf55.tar.gz
otp-6ef2e9e290ffb378ff5a18b9c278d1a2ce15cf55.tar.bz2
otp-6ef2e9e290ffb378ff5a18b9c278d1a2ce15cf55.zip
[socket] Update recvfrom to handle Timeout = nowait
Update function recvfrom and its spec(s) to handle the Timeout value of nowait. Also replaced timestamp method with erlang:monotonic_time(milli_seconds).
Diffstat (limited to 'erts/preloaded/src/socket.erl')
-rw-r--r--erts/preloaded/src/socket.erl69
1 files changed, 55 insertions, 14 deletions
diff --git a/erts/preloaded/src/socket.erl b/erts/preloaded/src/socket.erl
index 1d651f99ed..3bd268403a 100644
--- a/erts/preloaded/src/socket.erl
+++ b/erts/preloaded/src/socket.erl
@@ -1906,8 +1906,20 @@ recvfrom(Socket, BufSz) ->
?SOCKET_RECV_FLAGS_DEFAULT,
?SOCKET_RECV_TIMEOUT_DEFAULT).
--spec recvfrom(Socket, Flags, Timeout) ->
- {ok, {Source, Data}} | {error, Reason} when
+-spec recvfrom(Socket, Flags, nowait) ->
+ {ok, {Source, Data}} |
+ {ok, SelInfo} |
+ {error, Reason} when
+ Socket :: socket(),
+ Flags :: recv_flags(),
+ Source :: sockaddr() | undefined,
+ Data :: binary(),
+ SelInfo :: {select, RecvRef},
+ RecvRef :: reference(),
+ Reason :: term()
+ ; (Socket, Flags, Timeout) ->
+ {ok, {Source, Data}} |
+ {error, Reason} when
Socket :: socket(),
Flags :: recv_flags(),
Timeout :: timeout(),
@@ -1922,6 +1934,17 @@ recvfrom(Socket, BufSz) ->
Source :: sockaddr() | undefined,
Data :: binary(),
Reason :: term()
+ ; (Socket, BufSz, nowait) ->
+ {ok, {Source, Data}} |
+ {ok, SelInfo} |
+ {error, Reason} when
+ Socket :: socket(),
+ BufSz :: non_neg_integer(),
+ Source :: sockaddr() | undefined,
+ Data :: binary(),
+ SelInfo :: {select, RecvRef},
+ RecvRef :: reference(),
+ Reason :: term()
; (Socket, BufSz, Timeout) ->
{ok, {Source, Data}} | {error, Reason} when
Socket :: socket(),
@@ -1938,20 +1961,35 @@ recvfrom(Socket, BufSz, Flags) when is_list(Flags) ->
recvfrom(Socket, BufSz, Timeout) ->
recvfrom(Socket, BufSz, ?SOCKET_RECV_FLAGS_DEFAULT, Timeout).
--spec recvfrom(Socket, BufSz, Flags, Timeout) ->
- {ok, {Source, Data}} | {error, Reason} when
- Socket :: socket(),
- BufSz :: non_neg_integer(),
- Flags :: recv_flags(),
- Timeout :: timeout(),
- Source :: sockaddr() | undefined,
- Data :: binary(),
- Reason :: term().
+-spec recvfrom(Socket, BufSz, Flags, nowait) ->
+ {ok, {Source, Data}} |
+ {ok, SelInfo} |
+ {error, Reason} when
+ Socket :: socket(),
+ BufSz :: non_neg_integer(),
+ Flags :: recv_flags(),
+ Source :: sockaddr() | undefined,
+ Data :: binary(),
+ SelInfo :: {select, RecvRef},
+ RecvRef :: reference(),
+ Reason :: term()
+ ; (Socket, BufSz, Flags, Timeout) ->
+ {ok, {Source, Data}} |
+ {error, Reason} when
+ Socket :: socket(),
+ BufSz :: non_neg_integer(),
+ Flags :: recv_flags(),
+ Timeout :: timeout(),
+ Source :: sockaddr() | undefined,
+ Data :: binary(),
+ Reason :: term().
recvfrom(#socket{ref = SockRef}, BufSz, Flags, Timeout)
when (is_integer(BufSz) andalso (BufSz >= 0)) andalso
is_list(Flags) andalso
- (is_integer(Timeout) orelse (Timeout =:= infinity)) ->
+ (is_integer(Timeout) orelse
+ (Timeout =:= infinity) orelse
+ (Timeout =:= nowait)) ->
EFlags = enc_recv_flags(Flags),
do_recvfrom(SockRef, BufSz, EFlags, Timeout).
@@ -1962,6 +2000,10 @@ do_recvfrom(SockRef, BufSz, EFlags, Timeout) ->
{ok, {_Source, _NewData}} = OK ->
OK;
+ {error, eagain} when (Timeout =:= nowait) ->
+ SelInfo = {select, RecvRef},
+ {ok, SelInfo};
+
{error, eagain} ->
%% There is nothing just now, but we will be notified when there
%% is something to read (a select message).
@@ -3525,8 +3567,7 @@ timestamp(_) ->
timestamp().
timestamp() ->
- {A,B,C} = os:timestamp(),
- A*1000000000+B*1000+(C div 1000).
+ erlang:monotonic_time(milli_seconds).
next_timeout(_, nowait = Timeout) ->
Timeout;