summaryrefslogtreecommitdiff
path: root/lib/kernel/src/gen_tcp_socket.erl
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2021-04-16 19:59:33 +0200
committerMicael Karlberg <bmk@erlang.org>2021-04-26 15:20:22 +0200
commitaa19802c2bccb7704e4206ef47b923e82d30b58b (patch)
tree566bb081d6b8a68163aa4d461b387fc2854e6d10 /lib/kernel/src/gen_tcp_socket.erl
parent90e7301b8b8cf7b1045b930e05574e62e91cd6cf (diff)
downloaderlang-aa19802c2bccb7704e4206ef47b923e82d30b58b.tar.gz
[esock] Add general socket monitoring
Add general socket monitor feature. That is, make it possible to monitor "classic" sockets (port) as well as new gen_tcp_socket sockets. OTP-17155
Diffstat (limited to 'lib/kernel/src/gen_tcp_socket.erl')
-rw-r--r--lib/kernel/src/gen_tcp_socket.erl29
1 files changed, 24 insertions, 5 deletions
diff --git a/lib/kernel/src/gen_tcp_socket.erl b/lib/kernel/src/gen_tcp_socket.erl
index c794eaa890..f937b7f2ca 100644
--- a/lib/kernel/src/gen_tcp_socket.erl
+++ b/lib/kernel/src/gen_tcp_socket.erl
@@ -28,7 +28,7 @@
shutdown/2, close/1, controlling_process/2]).
%% inet
-export([
- %% monitor/1,
+ monitor/1, demonitor/1,
setopts/2, getopts/2,
sockname/1, peername/1,
getstat/2
@@ -498,9 +498,28 @@ controlling_process(S, NewOwner, Server, Msg) ->
%% Module inet backends
%% -------------------------------------------------------------------------
-%% monitor(?module_socket(Server, _Socket)) ->
-%% %% Do we really need the pid? Its part of the call info
-%% call(Server, {monitor, self()}).
+monitor(?module_socket(_Server, ESock) = Socket) ->
+ %% The socket that is part of the down message:
+ socket_registry:monitor(ESock, #{msocket => Socket});
+monitor(Socket) ->
+ erlang:error(badarg, [Socket]).
+
+demonitor(MRef) when is_reference(MRef) ->
+ case socket_registry:demonitor(MRef) of
+ ok ->
+ ok;
+ {error, unknown_monitor} -> % Possible race
+ receive
+ {'DOWN', MRef, socket, _, _} ->
+ ok
+ after 0 ->
+ ok
+ end;
+ {error, Reason} ->
+ erlang:error({invalid, Reason})
+ end;
+demonitor(Socket) ->
+ erlang:error(badarg, [Socket]).
%% -------------------------------------------------------------------------
@@ -1308,7 +1327,7 @@ handle_event({call, From}, {getopts, Opts}, State, {P, D}) ->
%% Call: setopts/1
handle_event({call, From}, {setopts, Opts}, State, {P, D}) ->
- %% ?DBG([{opts, Opts}, {state, State}, {d, D}]),
+ %% ?DBG([{setopts, Opts}, {state, State}, {d, D}]),
{Result, D_1} = state_setopts(P, D, State, Opts),
%% ?DBG([{result, Result}, {d1, D_1}]),
case Result of