Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:26
erlang
0251-esock-Corrected-zero-timeout-return.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0251-esock-Corrected-zero-timeout-return.patch of Package erlang
From e3fe7ca7867c4986f24c895646bf9fd48cc55848 Mon Sep 17 00:00:00 2001 From: Micael Karlberg <bmk@erlang.org> Date: Wed, 10 Apr 2024 11:13:39 +0200 Subject: [PATCH 1/2] [esock] Corrected zero timeout return When performing a read (recv, recvfrom and recvmsg) with timeout 0 (zero) and the operation was not able complete immediately, the nif should return with the atom 'timeout', not 'ok' as it was on Windows. OTP-19063 --- erts/emulator/nifs/win32/win_socket_asyncio.c | 61 ++++++++++--------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/erts/emulator/nifs/win32/win_socket_asyncio.c b/erts/emulator/nifs/win32/win_socket_asyncio.c index 82db98651e..e33727e971 100644 --- a/erts/emulator/nifs/win32/win_socket_asyncio.c +++ b/erts/emulator/nifs/win32/win_socket_asyncio.c @@ -3869,7 +3869,7 @@ ERL_NIF_TERM recv_check_result(ErlNifEnv* env, } else { - eres = esock_atom_ok; + eres = esock_atom_timeout; // Will trigger {error, timeout} } @@ -3901,7 +3901,7 @@ ERL_NIF_TERM recv_check_ok(ErlNifEnv* env, ERL_NIF_TERM sockRef, ERL_NIF_TERM recvRef) { - ERL_NIF_TERM data, result; + ERL_NIF_TERM data, eres; DWORD read = 0, flags = 0; SSDBG( descP, @@ -3940,7 +3940,7 @@ ERL_NIF_TERM recv_check_ok(ErlNifEnv* env, ESOCK_CNT_INC(env, descP, sockRef, esock_atom_read_fails, &descP->readFails, 1); - result = esock_make_error(env, esock_atom_closed); + eres = esock_make_error(env, esock_atom_closed); } else { @@ -3973,7 +3973,7 @@ ERL_NIF_TERM recv_check_ok(ErlNifEnv* env, if (read > descP->readPkgMax) descP->readPkgMax = read; - result = esock_make_ok2(env, data); + eres = esock_make_ok2(env, data); } @@ -3993,8 +3993,9 @@ ERL_NIF_TERM recv_check_ok(ErlNifEnv* env, if (! IS_ZERO(recvRef)) { - result = recv_check_pending(env, descP, opP, caller, - sockRef, recvRef); + eres = recv_check_pending(env, descP, opP, caller, + sockRef, recvRef); + } else { /* But we are not allowed to wait! => cancel */ @@ -4017,11 +4018,11 @@ ERL_NIF_TERM recv_check_ok(ErlNifEnv* env, "\r\n %T" "\r\n", sockRef, descP->sock, reason) ); - result = esock_make_error(env, MKT2(env, tag, reason)); + eres = esock_make_error(env, MKT2(env, tag, reason)); } else { - result = esock_atom_ok; // Will trigger {error, timeout} + eres = esock_atom_timeout; // Will trigger {error, timeout} } } @@ -4043,7 +4044,7 @@ ERL_NIF_TERM recv_check_ok(ErlNifEnv* env, MUNLOCK(ctrl.cntMtx); - result = esock_make_error(env, reason); + eres = esock_make_error(env, reason); } break; } @@ -4054,7 +4055,7 @@ ERL_NIF_TERM recv_check_ok(ErlNifEnv* env, "\r\n", sockRef, descP->sock) ); - return result; + return eres; } @@ -4303,7 +4304,7 @@ ERL_NIF_TERM recvfrom_check_result(ErlNifEnv* env, } else { - eres = esock_atom_ok; // Will trigger {error, timeout} + eres = esock_atom_timeout; // Will trigger {error, timeout} } @@ -4335,7 +4336,7 @@ ERL_NIF_TERM recvfrom_check_ok(ErlNifEnv* env, ERL_NIF_TERM sockRef, ERL_NIF_TERM recvRef) { - ERL_NIF_TERM data, result; + ERL_NIF_TERM data, eres; DWORD read = 0, flags = 0; SSDBG( descP, @@ -4381,7 +4382,7 @@ ERL_NIF_TERM recvfrom_check_ok(ErlNifEnv* env, * This is: {ok, {Source, Data}} * But it should really be: {ok, {Source, Flags, Data}} */ - result = esock_make_ok2(env, MKT2(env, eSockAddr, data)); + eres = esock_make_ok2(env, MKT2(env, eSockAddr, data)); } else { @@ -4399,8 +4400,8 @@ ERL_NIF_TERM recvfrom_check_ok(ErlNifEnv* env, if (! IS_ZERO(recvRef)) { - result = recv_check_pending(env, descP, opP, caller, - sockRef, recvRef); + eres = recv_check_pending(env, descP, opP, caller, + sockRef, recvRef); } else { @@ -4424,11 +4425,11 @@ ERL_NIF_TERM recvfrom_check_ok(ErlNifEnv* env, "\r\n %T" "\r\n", sockRef, descP->sock, reason) ); - result = esock_make_error(env, MKT2(env, tag, reason)); + eres = esock_make_error(env, MKT2(env, tag, reason)); } else { - result = esock_atom_ok; // Will trigger {error, timeout} + eres = esock_atom_timeout; // Will trigger {error, timeout} } } @@ -4450,7 +4451,7 @@ ERL_NIF_TERM recvfrom_check_ok(ErlNifEnv* env, MUNLOCK(ctrl.cntMtx); - result = esock_make_error(env, reason); + eres = esock_make_error(env, reason); } break; } @@ -4460,9 +4461,9 @@ ERL_NIF_TERM recvfrom_check_ok(ErlNifEnv* env, ("WIN-ESAIO", "recvfrom_check_ok(%T) {%d} -> done with" "\r\n result: %T" "\r\n", - sockRef, descP->sock, result) ); + sockRef, descP->sock, eres) ); - return result; + return eres; } @@ -4710,7 +4711,7 @@ ERL_NIF_TERM recvmsg_check_result(ErlNifEnv* env, } else { - eres = esock_atom_ok; // Will trigger {error, timeout} + eres = esock_atom_timeout; // Will trigger {error, timeout} } @@ -4745,7 +4746,7 @@ ERL_NIF_TERM recvmsg_check_ok(ErlNifEnv* env, ERL_NIF_TERM sockRef, ERL_NIF_TERM recvRef) { - ERL_NIF_TERM eMsg, result; + ERL_NIF_TERM eMsg, eres; DWORD read = 0, flags = 0; SSDBG( descP, @@ -4781,7 +4782,7 @@ ERL_NIF_TERM recvmsg_check_ok(ErlNifEnv* env, if (read > descP->readPkgMax) descP->readPkgMax = read; - result = esock_make_ok2(env, eMsg); + eres = esock_make_ok2(env, eMsg); } else { @@ -4799,8 +4800,8 @@ ERL_NIF_TERM recvmsg_check_ok(ErlNifEnv* env, if (! IS_ZERO(recvRef)) { - result = recv_check_pending(env, descP, opP, caller, - sockRef, recvRef); + eres = recv_check_pending(env, descP, opP, caller, + sockRef, recvRef); } else { @@ -4824,11 +4825,11 @@ ERL_NIF_TERM recvmsg_check_ok(ErlNifEnv* env, "\r\n %T" "\r\n", sockRef, descP->sock, reason) ); - result = esock_make_error(env, MKT2(env, tag, reason)); + eres = esock_make_error(env, MKT2(env, tag, reason)); } else { - result = esock_atom_ok; // Will trigger {error, timeout} + eres = esock_atom_timeout; // Will trigger {error, timeout} } } @@ -4850,7 +4851,7 @@ ERL_NIF_TERM recvmsg_check_ok(ErlNifEnv* env, MUNLOCK(ctrl.cntMtx); - result = esock_make_error(env, reason); + eres = esock_make_error(env, reason); } break; } @@ -4860,9 +4861,9 @@ ERL_NIF_TERM recvmsg_check_ok(ErlNifEnv* env, ("WIN-ESAIO", "recvmsg_check_ok(%T) {%d} -> done with" "\r\n result: %T" "\r\n", - sockRef, descP->sock, result) ); + sockRef, descP->sock, eres) ); - return result; + return eres; } -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor