diff options
author | Micael Karlberg <bmk@erlang.org> | 2021-04-16 19:59:33 +0200 |
---|---|---|
committer | Micael Karlberg <bmk@erlang.org> | 2021-04-26 15:20:22 +0200 |
commit | aa19802c2bccb7704e4206ef47b923e82d30b58b (patch) | |
tree | 566bb081d6b8a68163aa4d461b387fc2854e6d10 /lib/kernel/src/gen_tcp_socket.erl | |
parent | 90e7301b8b8cf7b1045b930e05574e62e91cd6cf (diff) | |
download | erlang-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.erl | 29 |
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 |