diff options
Diffstat (limited to 'erts/emulator')
-rw-r--r-- | erts/emulator/nifs/common/socket_nif.c | 79 | ||||
-rw-r--r-- | erts/emulator/test/socket_SUITE.erl | 59 |
2 files changed, 74 insertions, 64 deletions
diff --git a/erts/emulator/nifs/common/socket_nif.c b/erts/emulator/nifs/common/socket_nif.c index 44aa44f5fc..9375e9c005 100644 --- a/erts/emulator/nifs/common/socket_nif.c +++ b/erts/emulator/nifs/common/socket_nif.c @@ -4250,6 +4250,12 @@ ERL_NIF_TERM nopen(ErlNifEnv* env, descP->type = type; descP->protocol = protocol; + /* Does this apply to other types? Such as RAW? */ + if (type == SOCK_DGRAM) { + descP->isReadable = TRUE; + descP->isWritable = TRUE; + } + /* * Should we keep track of sockets (resources) in some way? * Doing it here will require mutex to ensure data integrity, @@ -4544,20 +4550,27 @@ ERL_NIF_TERM nconnect(ErlNifEnv* env, { int code, save_errno = 0; - /* Verify that we are where in the proper state */ + /* + * <KOLLA> + * + * We should look both the read and write mutex:es... + * + * </KOLLA> + * + * Verify that we are where in the proper state */ if (!IS_OPEN(descP)) { - SSDBG( descP, ("SOCKET", "nif_sendto -> not open\r\n") ); + SSDBG( descP, ("SOCKET", "nif_connect -> not open\r\n") ); return esock_make_error(env, atom_exbadstate); } if (IS_CONNECTED(descP)) { - SSDBG( descP, ("SOCKET", "nif_sendto -> already connected\r\n") ); + SSDBG( descP, ("SOCKET", "nif_connect -> already connected\r\n") ); return esock_make_error(env, atom_eisconn); } if (IS_CONNECTING(descP)) { - SSDBG( descP, ("SOCKET", "nif_sendto -> already connecting\r\n") ); + SSDBG( descP, ("SOCKET", "nif_connect -> already connecting\r\n") ); return esock_make_error(env, esock_atom_einval); } @@ -4566,7 +4579,7 @@ ERL_NIF_TERM nconnect(ErlNifEnv* env, descP->addrLen); save_errno = sock_errno(); - SSDBG( descP, ("SOCKET", "nif_sendto -> connect result: %d, %d\r\n", + SSDBG( descP, ("SOCKET", "nif_connect -> connect result: %d, %d\r\n", code, save_errno) ); if (IS_SOCKET_ERROR(code) && @@ -4580,7 +4593,9 @@ ERL_NIF_TERM nconnect(ErlNifEnv* env, descP, NULL, ref); return esock_make_ok2(env, ref); } else if (code == 0) { /* ok we are connected */ - descP->state = SOCKET_STATE_CONNECTED; + descP->state = SOCKET_STATE_CONNECTED; + descP->isReadable = TRUE; + descP->isWritable = TRUE; /* Do we need to do somthing for "active" mode? * Is there even such a thing *here*? */ @@ -4637,7 +4652,9 @@ ERL_NIF_TERM nfinalize_connection(ErlNifEnv* env, return esock_make_error_errno(env, error); } - descP->state = SOCKET_STATE_CONNECTED; + descP->state = SOCKET_STATE_CONNECTED; + descP->isReadable = TRUE; + descP->isWritable = TRUE; return esock_atom_ok; } @@ -4968,7 +4985,9 @@ ERL_NIF_TERM naccept_listening(ErlNifEnv* env, descP, NULL, esock_atom_undefined); #endif - accDescP->state = SOCKET_STATE_CONNECTED; + accDescP->state = SOCKET_STATE_CONNECTED; + accDescP->isReadable = TRUE; + accDescP->isWritable = TRUE; return esock_make_ok2(env, accRef); } @@ -5108,7 +5127,9 @@ ERL_NIF_TERM naccept_accepting(ErlNifEnv* env, descP, NULL, esock_atom_undefined); #endif - accDescP->state = SOCKET_STATE_CONNECTED; + accDescP->state = SOCKET_STATE_CONNECTED; + accDescP->isReadable = TRUE; + accDescP->isWritable = TRUE; /* Check if there are waiting acceptors (popping the acceptor queue) */ @@ -5182,9 +5203,6 @@ ERL_NIF_TERM nif_send(ErlNifEnv* env, return enif_make_badarg(env); } - if (IS_CLOSED(descP) || IS_CLOSING(descP)) - return esock_make_error(env, atom_closed); - SSDBG( descP, ("SOCKET", "nif_send -> args when sock = %d:" "\r\n Socket: %T" @@ -5193,9 +5211,6 @@ ERL_NIF_TERM nif_send(ErlNifEnv* env, "\r\n eFlags: %d" "\r\n", descP->sock, sockRef, sendRef, sndData.size, eflags) ); - if (!IS_CONNECTED(descP)) - return esock_make_error(env, atom_enotconn); - if (!esendflags2sendflags(eflags, &flags)) return enif_make_badarg(env); @@ -5315,9 +5330,6 @@ ERL_NIF_TERM nif_sendto(ErlNifEnv* env, return enif_make_badarg(env); } - if (IS_CLOSED(descP) || IS_CLOSING(descP)) - return esock_make_error(env, atom_closed); - SSDBG( descP, ("SOCKET", "nif_sendto -> args when sock = %d:" "\r\n Socket: %T" @@ -5328,12 +5340,6 @@ ERL_NIF_TERM nif_sendto(ErlNifEnv* env, "\r\n", descP->sock, sockRef, sendRef, sndData.size, eSockAddr, eflags) ); - /* THIS TEST IS NOT CORRECT!!! */ - if (!IS_OPEN(descP)) { - SSDBG( descP, ("SOCKET", "nif_sendto -> not open (%u)\r\n", descP->state) ); - return esock_make_error(env, esock_atom_einval); - } - if (!esendflags2sendflags(eflags, &flags)) { SSDBG( descP, ("SOCKET", "nif_sendto -> sendflags decode failed\r\n") ); return esock_make_error(env, esock_atom_einval); @@ -5447,9 +5453,6 @@ ERL_NIF_TERM nif_sendmsg(ErlNifEnv* env, return enif_make_badarg(env); } - if (IS_CLOSED(descP) || IS_CLOSING(descP)) - return esock_make_error(env, atom_closed); - SSDBG( descP, ("SOCKET", "nif_sendmsg -> args when sock = %d:" "\r\n Socket: %T" @@ -5458,10 +5461,6 @@ ERL_NIF_TERM nif_sendmsg(ErlNifEnv* env, "\r\n", descP->sock, argv[0], sendRef, eflags) ); - /* THIS TEST IS NOT CORRECT!!! */ - if (!IS_OPEN(descP)) - return esock_make_error(env, esock_atom_einval); - if (!esendflags2sendflags(eflags, &flags)) return esock_make_error(env, esock_atom_einval); @@ -5745,12 +5744,6 @@ ERL_NIF_TERM nif_recv(ErlNifEnv* env, return enif_make_badarg(env); } - if (IS_CLOSED(descP) || IS_CLOSING(descP)) - return esock_make_error(env, atom_closed); - - if (!IS_CONNECTED(descP)) - return esock_make_error(env, atom_enotconn); - if (!erecvflags2recvflags(eflags, &flags)) return enif_make_badarg(env); @@ -5893,9 +5886,6 @@ ERL_NIF_TERM nif_recvfrom(ErlNifEnv* env, return enif_make_badarg(env); } - if (IS_CLOSED(descP) || IS_CLOSING(descP)) - return esock_make_error(env, atom_closed); - SSDBG( descP, ("SOCKET", "nif_recvfrom -> args when sock = %d:" "\r\n Socket: %T" @@ -6062,9 +6052,6 @@ ERL_NIF_TERM nif_recvmsg(ErlNifEnv* env, return enif_make_badarg(env); } - if (IS_CLOSED(descP) || IS_CLOSING(descP)) - return esock_make_error(env, atom_closed); - SSDBG( descP, ("SOCKET", "nif_recvmsg -> args when sock = %d:" "\r\n Socket: %T" @@ -6292,6 +6279,8 @@ ERL_NIF_TERM nclose(ErlNifEnv* env, descP->closeLocal = TRUE; descP->state = SOCKET_STATE_CLOSING; + descP->isReadable = FALSE; + descP->isWritable = FALSE; doClose = TRUE; } @@ -15842,7 +15831,7 @@ SocketDescriptor* alloc_descriptor(SOCKET sock, HANDLE event) descP->currentWriterP = NULL; // currentWriter not used descP->writersQ.first = NULL; descP->writersQ.last = NULL; - descP->isWritable = TRUE; + descP->isWritable = FALSE; // TRUE; descP->writePkgCnt = 0; descP->writeByteCnt = 0; descP->writeTries = 0; @@ -15854,7 +15843,7 @@ SocketDescriptor* alloc_descriptor(SOCKET sock, HANDLE event) descP->currentReaderP = NULL; // currentReader not used descP->readersQ.first = NULL; descP->readersQ.last = NULL; - descP->isReadable = TRUE; + descP->isReadable = FALSE; // TRUE; descP->readPkgCnt = 0; descP->readByteCnt = 0; descP->readTries = 0; diff --git a/erts/emulator/test/socket_SUITE.erl b/erts/emulator/test/socket_SUITE.erl index 2fbc0dddad..01d332c34e 100644 --- a/erts/emulator/test/socket_SUITE.erl +++ b/erts/emulator/test/socket_SUITE.erl @@ -454,14 +454,29 @@ suite() -> {timetrap,{minutes,1}}]. all() -> - [ - {group, api}, - {group, socket_closure}, - {group, traffic}, - {group, ttest} - - %% {group, tickets} - ]. + Groups = [{api, "ESOCK_TEST_API", include}, + {socket_closure, "ESOCK_TEST_SOCK_CLOSE", include}, + {traffic, "ESOCK_TEST_TRAFFIC", include}, + {ttest, "ESOCK_TEST_TTEST", exclude}], + [use_group(Group, Env, Default) || {Group, Env, Default} <- Groups]. + +use_group(Group, Env, Default) -> + case os:getenv(Env) of + false when (Default =:= include) -> + [{group, Group}]; + false -> + []; + Val -> + case list_to_atom(string:to_lower(Val)) of + Use when (Use =:= include) orelse + (Use =:= enable) orelse + (Use =:= true) -> + [{group, Group}]; + _ -> + [] + end + end. + groups() -> [{api, [], api_cases()}, @@ -10919,12 +10934,12 @@ tpp_udp_server_handler_msg_exchange_loop(Sock, Send, Recv, %% socket:setopt(Sock, otp, debug, true); %% true -> ok %% end, - case tpp_udp_recv_req(Sock, Recv) of + try tpp_udp_recv_req(Sock, Recv) of {ok, Msg, RecvSz, From} -> NewStart = if (Start =:= undefined) -> ?LIB:timestamp(); true -> Start end, %% ?SEV_IPRINT("[~w] received - now try send", [N]), - case tpp_udp_send_rep(Sock, Send, Msg, From) of + try tpp_udp_send_rep(Sock, Send, Msg, From) of {ok, SendSz} -> tpp_udp_server_handler_msg_exchange_loop(Sock, Send, Recv, N+1, @@ -10934,15 +10949,10 @@ tpp_udp_server_handler_msg_exchange_loop(Sock, Send, Recv, {error, SReason} -> ?SEV_EPRINT("send (~w): ~p", [N, SReason]), exit({send, SReason, N}) + catch + SC:SE:SS -> + exit({send, {SC, SE, SS}, N}) end; - %% {error, timeout} -> - %% ?SEV_IPRINT("timeout(~w) - try again", [N]), - %% case Send(Sock, list_to_binary("ping")) of - %% ok -> - %% exit({'ping-send', ok, N}); - %% {error, Reason} -> - %% exit({'ping-send', Reason, N}) - %% end; {error, closed} -> ?SEV_IPRINT("closed - we are done: ~w, ~w, ~w", [N, Sent, Received]), @@ -10951,6 +10961,9 @@ tpp_udp_server_handler_msg_exchange_loop(Sock, Send, Recv, {error, RReason} -> ?SEV_EPRINT("recv (~w): ~p", [N, RReason]), exit({recv, RReason, N}) + catch + RC:RE:RS -> + exit({recv, {RC, RE, RS}, N}) end. @@ -11033,9 +11046,11 @@ tpp_udp_recv_rep(Sock, Recv) -> tpp_udp_recv(Sock, Recv, ?TPP_REPLY). tpp_udp_recv(Sock, Recv, Tag) -> - case Recv(Sock, 0) of + %% ok = socket:setopt(Sock, otp, debug, true), + try Recv(Sock, 0) of {ok, {Source, <<Tag:32/integer, Sz:32/integer, Data/binary>> = Msg}} when (Sz =:= size(Data)) -> + %% ok = socket:setopt(Sock, otp, debug, false), %% We got it all %% ?SEV_IPRINT("tpp_udp_recv -> got all: " %% "~n Source: ~p" @@ -11045,11 +11060,17 @@ tpp_udp_recv(Sock, Recv, Tag) -> %% [Source, Tag, Sz, size(Data)]), {ok, Data, size(Msg), Source}; {ok, {_Source, <<Tag:32/integer, Sz:32/integer, Data/binary>>}} -> + %% ok = socket:setopt(Sock, otp, debug, false), {error, {invalid_msg, Sz, size(Data)}}; {ok, {_, <<Tag:32/integer, _/binary>>}} -> + %% ok = socket:setopt(Sock, otp, debug, false), {error, {invalid_msg_tag, Tag}}; {error, _} = ERROR -> + %% ok = socket:setopt(Sock, otp, debug, false), ERROR + catch + C:E:S -> + {error, {catched, C, E, S}} end. tpp_udp_send_req(Sock, Send, Data, Dest) -> |