Skip to content

Commit b93912b

Browse files
author
José Valim
committed
Deprecate monitor option in GenEvent
1 parent 71eca8a commit b93912b

File tree

3 files changed

+48
-28
lines changed

3 files changed

+48
-28
lines changed

lib/elixir/lib/gen_event.ex

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ defmodule GenEvent do
166166
167167
Keep in mind though Elixir and Erlang gen events are not 100% compatible.
168168
The `:gen_event.add_sup_handler/3` is not supported by Elixir's GenEvent,
169-
which in turn supports `monitor: true` in `GenEvent.add_handler/4`.
169+
which in turn supports `GenEvent.add_mon_handler/3`.
170170
171171
The benefits of the monitoring approach are described in the "Don't drink
172172
too much kool aid" section of the "Learn you some Erlang" link above. Due
@@ -316,11 +316,28 @@ defmodule GenEvent do
316316
317317
If the given handler was previously installed at the manager, this
318318
function returns `{:error, :already_present}`.
319+
"""
320+
@spec add_handler(manager, handler, term, [monitor: boolean]) :: :ok | {:error, term}
321+
def add_handler(manager, handler, args, options \\ []) do
322+
cond do
323+
Keyword.get(options, :monitor, false) ->
324+
IO.write :stderr, "warning: the :monitor option in GenEvent.add_handler/4 is deprecated, " <>
325+
"please use GenEvent.add_mon_handler/3 instead\n#{Exception.format_stacktrace}"
326+
rpc(manager, {:add_mon_handler, handler, args, self()})
327+
true ->
328+
rpc(manager, {:add_handler, handler, args})
329+
end
330+
end
331+
332+
@doc """
333+
Adds a monitored event handler to the event `manager`.
334+
335+
Expects the same input and returns the same values as `add_handler/3`.
319336
320337
## Monitored handlers
321338
322-
When adding a handler, a `:monitor` option with value `true` can be given.
323-
This means the calling process will now be monitored by the GenEvent handler.
339+
A monitored handler implies the calling process will now be monitored
340+
by the GenEvent manager.
324341
325342
If the calling process later terminates with `reason`, the event manager
326343
will delete the event handler by calling the `terminate/2` callback with
@@ -352,14 +369,9 @@ defmodule GenEvent do
352369
Finally, this functionality only works with GenEvent started via this
353370
module (it is not backwards compatible with Erlang's `:gen_event`).
354371
"""
355-
@spec add_handler(manager, handler, term, [monitor: boolean]) :: :ok | {:error, term}
356-
def add_handler(manager, handler, args, options \\ []) do
357-
cond do
358-
Keyword.get(options, :monitor, false) ->
359-
rpc(manager, {:add_mon_handler, handler, args, self()})
360-
true ->
361-
rpc(manager, {:add_handler, handler, args})
362-
end
372+
@spec add_mon_handler(manager, handler, term) :: :ok | {:error, term}
373+
def add_mon_handler(manager, handler, args) do
374+
rpc(manager, {:add_mon_handler, handler, args, self()})
363375
end
364376

365377
@doc """
@@ -474,23 +486,31 @@ defmodule GenEvent do
474486
is not installed or if the handler fails to terminate with a given reason
475487
in which case `state = {:error, term}`.
476488
477-
A `:monitor` option can also be set to specify if the new handler
478-
should be monitored by the manager. See `add_handler/4` for more
479-
information.
480-
481489
If `init/1` in the second handler returns a correct value, this
482490
function returns `:ok`.
483491
"""
484492
@spec swap_handler(manager, handler, term, handler, term, [monitor: boolean]) :: :ok | {:error, term}
485493
def swap_handler(manager, handler1, args1, handler2, args2, options \\ []) do
486494
cond do
487495
Keyword.get(options, :monitor, false) ->
496+
IO.write :stderr, "warning: the :monitor option in GenEvent.swap_handler/6 is deprecated, " <>
497+
"please use GenEvent.swap_mon_handler/5 instead\n#{Exception.format_stacktrace}"
488498
rpc(manager, {:swap_mon_handler, handler1, args1, handler2, args2, self()})
489499
true ->
490500
rpc(manager, {:swap_handler, handler1, args1, handler2, args2})
491501
end
492502
end
493503

504+
@doc """
505+
Replaces an old event handler with a new monitored one in the event `manager`.
506+
507+
Read the docs for `add_mon_handler/3` and `swap_handler/5` for more information.
508+
"""
509+
@spec swap_mon_handler(manager, handler, term, handler, term) :: :ok | {:error, term}
510+
def swap_mon_handler(manager, handler1, args1, handler2, args2) do
511+
rpc(manager, {:swap_mon_handler, handler1, args1, handler2, args2, self()})
512+
end
513+
494514
@doc """
495515
Returns a list of all event handlers installed in the `manager`.
496516
"""

lib/elixir/test/elixir/gen_event_test.exs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ defmodule GenEventTest do
221221
GenEvent.stop(pid)
222222
end
223223

224-
test "add_handler/4" do
224+
test "add_handler/3" do
225225
{:ok, pid} = GenEvent.start()
226226

227227
assert GenEvent.add_handler(pid, ReplyHandler, {:custom, {:error, :my_error}}) ==
@@ -240,12 +240,12 @@ defmodule GenEventTest do
240240
assert GenEvent.which_handlers(pid) == [{ReplyHandler, self()}, ReplyHandler]
241241
end
242242

243-
test "add_handler/4 with monitor" do
243+
test "add_mon_handler/3" do
244244
{:ok, pid} = GenEvent.start()
245245
parent = self()
246246

247247
{mon_pid, mon_ref} = spawn_monitor(fn ->
248-
assert GenEvent.add_handler(pid, ReplyHandler, {self(), false}, monitor: true) == :ok
248+
assert GenEvent.add_mon_handler(pid, ReplyHandler, {self(), false}) == :ok
249249
send parent, :ok
250250
receive after: (:infinity -> :ok)
251251
end)
@@ -265,20 +265,20 @@ defmodule GenEventTest do
265265
assert GenEvent.which_handlers(pid) == [{ReplyHandler, self()}]
266266
end
267267

268-
test "add_handler/4 with notifications" do
268+
test "add_mon_handler/3 with notifications" do
269269
{:ok, pid} = GenEvent.start()
270270
self = self()
271271

272-
GenEvent.add_handler(pid, ReplyHandler, {self(), false}, monitor: true)
272+
GenEvent.add_mon_handler(pid, ReplyHandler, {self(), false})
273273
GenEvent.remove_handler(pid, ReplyHandler, :ok)
274274
assert_receive {:gen_event_EXIT, ReplyHandler, :normal}
275275

276-
GenEvent.add_handler(pid, ReplyHandler, {self(), false}, monitor: true)
277-
GenEvent.swap_handler(pid, ReplyHandler, :swapped, ReplyHandler, :swap)
276+
:ok = GenEvent.add_mon_handler(pid, ReplyHandler, {self(), false})
277+
:ok = GenEvent.swap_handler(pid, ReplyHandler, :swapped, ReplyHandler, :swap)
278278
assert_receive {:gen_event_EXIT, ReplyHandler, {:swapped, ReplyHandler, nil}}
279279

280-
GenEvent.swap_handler(pid, ReplyHandler, :swapped, ReplyHandler, :swap, monitor: true)
281-
GenEvent.swap_handler(pid, ReplyHandler, :swapped, ReplyHandler, :swap, monitor: true)
280+
:ok = GenEvent.swap_mon_handler(pid, ReplyHandler, :swapped, ReplyHandler, :swap)
281+
:ok = GenEvent.swap_mon_handler(pid, ReplyHandler, :swapped, ReplyHandler, :swap)
282282
assert_receive {:gen_event_EXIT, ReplyHandler, {:swapped, ReplyHandler, ^self}}
283283

284284
GenEvent.stop(pid)
@@ -288,15 +288,15 @@ defmodule GenEventTest do
288288
test "remove_handler/3" do
289289
{:ok, pid} = GenEvent.start()
290290

291-
GenEvent.add_handler(pid, ReplyHandler, {self(), false}, monitor: true)
291+
GenEvent.add_mon_handler(pid, ReplyHandler, {self(), false})
292292

293293
assert GenEvent.remove_handler(pid, {ReplyHandler, self()}, :ok) ==
294294
{:error, :handler_not_found}
295295
assert GenEvent.remove_handler(pid, ReplyHandler, :ok) ==
296296
{:terminate, :ok}
297297
assert_receive {:terminate, :ok}
298298

299-
GenEvent.add_handler(pid, {ReplyHandler, self()}, {self(), false}, monitor: true)
299+
GenEvent.add_mon_handler(pid, {ReplyHandler, self()}, {self(), false})
300300

301301
assert GenEvent.remove_handler(pid, ReplyHandler, :ok) ==
302302
{:error, :handler_not_found}
@@ -306,7 +306,7 @@ defmodule GenEventTest do
306306
assert GenEvent.which_handlers(pid) == []
307307
end
308308

309-
test "swap_handler/6" do
309+
test "swap_handler/5" do
310310
{:ok, pid} = GenEvent.start()
311311

312312
GenEvent.add_handler(pid, ReplyHandler, {self(), false})

lib/logger/lib/logger/watcher.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ defmodule Logger.Watcher do
5858
@doc false
5959
def init({mod, handler, args, :monitor}) do
6060
ref = Process.monitor(mod)
61-
res = GenEvent.add_handler(mod, handler, args, monitor: true)
61+
res = GenEvent.add_mon_handler(mod, handler, args)
6262
do_init(res, mod, handler, ref)
6363
end
6464

0 commit comments

Comments
 (0)