aboutsummaryrefslogtreecommitdiffstats
path: root/erts/preloaded/src/socket.erl
diff options
context:
space:
mode:
authorMicael Karlberg <[email protected]>2018-11-06 15:25:10 +0100
committerMicael Karlberg <[email protected]>2018-11-06 15:25:10 +0100
commit0182f3ddb6a0243444bd1ef279221e0acc010233 (patch)
tree1875dfac505842f33ef491d68ebe95a84b45ae85 /erts/preloaded/src/socket.erl
parent3f46e8a184a503ead01674ee180e7222b3928712 (diff)
parente3e607ac76dc308da3ac24364477d48da0dc23bd (diff)
downloadotp-0182f3ddb6a0243444bd1ef279221e0acc010233.tar.gz
otp-0182f3ddb6a0243444bd1ef279221e0acc010233.tar.bz2
otp-0182f3ddb6a0243444bd1ef279221e0acc010233.zip
Merge branch 'bmk/20181101/nififying_inet_ping_pong/OTP-14831' into bmk/20180918/nififying_inet/OTP-14831
Diffstat (limited to 'erts/preloaded/src/socket.erl')
-rw-r--r--erts/preloaded/src/socket.erl55
1 files changed, 47 insertions, 8 deletions
diff --git a/erts/preloaded/src/socket.erl b/erts/preloaded/src/socket.erl
index 5ebc2074e0..a40692881b 100644
--- a/erts/preloaded/src/socket.erl
+++ b/erts/preloaded/src/socket.erl
@@ -1573,12 +1573,13 @@ sendmsg(Socket, MsgHdr, Timeout)
sendmsg(Socket, MsgHdr, ?SOCKET_SENDMSG_FLAGS_DEFAULT, Timeout).
--spec sendmsg(Socket, MsgHdr, Flags, Timeout) -> ok | {error, Reason} when
- Socket :: socket(),
- MsgHdr :: msghdr(),
- Flags :: send_flags(),
- Timeout :: timeout(),
- Reason :: term().
+-spec sendmsg(Socket, MsgHdr, Flags, Timeout) -> ok | {ok, Remaining} | {error, Reason} when
+ Socket :: socket(),
+ MsgHdr :: msghdr(),
+ Flags :: send_flags(),
+ Timeout :: timeout(),
+ Remaining :: erlang:iovec(),
+ Reason :: term().
sendmsg(#socket{ref = SockRef}, #{iov := IOV} = MsgHdr, Flags, Timeout)
when is_list(IOV) andalso
@@ -1603,6 +1604,18 @@ do_sendmsg(SockRef, MsgHdr, EFlags, Timeout) ->
%% We are done
ok;
+ {ok, Written} when is_integer(Written) andalso (Written > 0) ->
+
+ %% We should not retry here since the protocol may not
+ %% be able to handle a message being split. Leave it to
+ %% the caller to figure out (call again with the rest).
+ %%
+ %% We should really not need to cancel, since this is
+ %% accepted for sendmsg!
+ %%
+ cancel(SockRef, sendmsg, SendRef),
+ {ok, do_sendmsg_rest(maps:get(iov, MsgHdr), Written)};
+
{error, eagain} ->
receive
{select, SockRef, SendRef, ready_output} ->
@@ -1617,6 +1630,12 @@ do_sendmsg(SockRef, MsgHdr, EFlags, Timeout) ->
ERROR
end.
+do_sendmsg_rest([B|IOVec], Written) when (Written >= size(B)) ->
+ do_sendmsg_rest(IOVec, Written - size(B));
+do_sendmsg_rest([B|IOVec], Written) ->
+ <<_:Written/binary, Rest/binary>> = B,
+ [Rest|IOVec].
+
ensure_msghdr(#{ctrl := []} = M) ->
ensure_msghdr(maps:remove(ctrl, M));
ensure_msghdr(#{iov := IOV} = M) when is_list(IOV) andalso (IOV =/= []) ->
@@ -1625,6 +1644,8 @@ ensure_msghdr(_) ->
einval().
+
+
%% ===========================================================================
%%
%% writev - write data into multiple buffers
@@ -1937,6 +1958,7 @@ do_recvfrom(SockRef, BufSz, EFlags, Timeout) ->
next_timeout(TS, Timeout));
{nif_abort, RecvRef, Reason} ->
+ %% p("received nif-abort: ~p", [Reason]),
{error, Reason}
after NewTimeout ->
@@ -1949,6 +1971,13 @@ do_recvfrom(SockRef, BufSz, EFlags, Timeout) ->
end.
+%% pi(Item) ->
+%% pi(self(), Item).
+
+%% pi(Pid, Item) ->
+%% {Item, Info} = process_info(Pid, Item),
+%% Info.
+
%% ---------------------------------------------------------------------------
%%
@@ -1983,10 +2012,20 @@ recvmsg(Socket, Timeout) ->
Flags :: recv_flags(),
Timeout :: timeout(),
MsgHdr :: msghdr(),
+ Reason :: term()
+ ; (Socket, BufSz, CtrlSz) -> {ok, MsgHdr} | {error, Reason} when
+ Socket :: socket(),
+ BufSz :: non_neg_integer(),
+ CtrlSz :: non_neg_integer(),
+ MsgHdr :: msghdr(),
Reason :: term().
-recvmsg(Socket, Flags, Timeout) ->
- recvmsg(Socket, 0, 0, Flags, Timeout).
+recvmsg(Socket, Flags, Timeout) when is_list(Flags) ->
+ recvmsg(Socket, 0, 0, Flags, Timeout);
+recvmsg(Socket, BufSz, CtrlSz) when is_integer(BufSz) andalso is_integer(CtrlSz) ->
+ recvmsg(Socket, BufSz, CtrlSz,
+ ?SOCKET_RECV_FLAGS_DEFAULT, ?SOCKET_RECV_TIMEOUT_DEFAULT).
+
-spec recvmsg(Socket,
BufSz, CtrlSz,