aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--erts/doc/src/socket.xml6
-rw-r--r--erts/emulator/nifs/common/socket_nif.c17
-rw-r--r--erts/preloaded/ebin/socket.beambin75044 -> 75044 bytes
-rw-r--r--erts/preloaded/src/socket.erl4
4 files changed, 22 insertions, 5 deletions
diff --git a/erts/doc/src/socket.xml b/erts/doc/src/socket.xml
index e5cf77663a..b4e22e86a8 100644
--- a/erts/doc/src/socket.xml
+++ b/erts/doc/src/socket.xml
@@ -98,10 +98,14 @@
</datatype>
<datatype>
<name name="select_tag"/>
+ <desc>
+ <p>A tag that describes the (select) operation.</p>
+ </desc>
</datatype>
<datatype>
<name name="select_ref"/>
- <desc><p>A reference that uniquely identifies the (select) operation.</p>
+ <desc>
+ <p>A reference that uniquely identifies the (select) operation.</p>
</desc>
</datatype>
<datatype>
diff --git a/erts/emulator/nifs/common/socket_nif.c b/erts/emulator/nifs/common/socket_nif.c
index 1a8ce89b7b..4394e7bc7c 100644
--- a/erts/emulator/nifs/common/socket_nif.c
+++ b/erts/emulator/nifs/common/socket_nif.c
@@ -4966,7 +4966,7 @@ ERL_NIF_TERM nconnect(ErlNifEnv* env,
descP->state = SOCKET_STATE_CONNECTED;
enif_set_pid_undefined(&descP->connPid);
- MON_INIT(&descP->connMon);
+ DEMONP("nconnect -> connected", env, descP, &descP->connMon);
descP->isReadable = TRUE;
descP->isWritable = TRUE;
@@ -5026,7 +5026,7 @@ ERL_NIF_TERM nfinalize_connection(ErlNifEnv* env,
{
int error;
- if (descP->state != SOCKET_STATE_CONNECTING)
+ if (!IS_CONNECTING(descP))
return esock_make_error(env, atom_enotconn);
if (!verify_is_connected(descP, &error)) {
@@ -5035,6 +5035,8 @@ ERL_NIF_TERM nfinalize_connection(ErlNifEnv* env,
}
descP->state = SOCKET_STATE_CONNECTED;
+ enif_set_pid_undefined(&descP->connPid);
+ DEMONP("nfinalize_connection -> connected", env, descP, &descP->connMon);
descP->isReadable = TRUE;
descP->isWritable = TRUE;
@@ -18705,6 +18707,17 @@ void socket_down(ErlNifEnv* env,
MON2T(env, mon));
}
+ } else if (COMPARE_PIDS(&descP->connPid, pid) == 0) {
+
+ /* The connPid is only set during the connection.
+ * The same goes for the monitor (connMon).
+ */
+
+ descP->state = SOCKET_STATE_OPEN; /* restore state */
+ enif_set_pid_undefined(&descP->connPid);
+ DEMONP("socket_down -> connector",
+ env, descP, &descP->connMon);
+
} else {
/* check all operation queue(s): acceptor, writer and reader.
diff --git a/erts/preloaded/ebin/socket.beam b/erts/preloaded/ebin/socket.beam
index fd8d489f36..134b4eac13 100644
--- a/erts/preloaded/ebin/socket.beam
+++ b/erts/preloaded/ebin/socket.beam
Binary files differ
diff --git a/erts/preloaded/src/socket.erl b/erts/preloaded/src/socket.erl
index c8d044209d..ae1ffdb4ac 100644
--- a/erts/preloaded/src/socket.erl
+++ b/erts/preloaded/src/socket.erl
@@ -591,8 +591,8 @@
#{level := integer(), type := integer(), data := binary()}.
--type select_tag() :: atom().
--opaque select_ref() :: reference().
+-opaque select_tag() :: atom().
+-opaque select_ref() :: reference().
-record(select_info, {tag :: select_tag(), ref :: select_ref()}).