diff options
author | Micael Karlberg <[email protected]> | 2019-04-12 16:02:36 +0200 |
---|---|---|
committer | Micael Karlberg <[email protected]> | 2019-05-29 14:07:39 +0200 |
commit | 6ef2e9e290ffb378ff5a18b9c278d1a2ce15cf55 (patch) | |
tree | d9306da83600ce4d5fc06ab00fbe842e165e72e8 /erts | |
parent | 9b3796b912fb1410a983e9ace5d892cdeda72926 (diff) | |
download | otp-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')
-rw-r--r-- | erts/preloaded/ebin/socket.beam | bin | 71412 -> 72020 bytes | |||
-rw-r--r-- | erts/preloaded/src/socket.erl | 69 |
2 files changed, 55 insertions, 14 deletions
diff --git a/erts/preloaded/ebin/socket.beam b/erts/preloaded/ebin/socket.beam Binary files differindex 71a41bd599..d0e9817b8c 100644 --- a/erts/preloaded/ebin/socket.beam +++ b/erts/preloaded/ebin/socket.beam 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; |