Skip to content

Commit 00e8446

Browse files
author
José Valim
committed
Remove support for inner swap_handler
1 parent 2aecfed commit 00e8446

File tree

3 files changed

+24
-86
lines changed

3 files changed

+24
-86
lines changed

lib/elixir/lib/gen_event.ex

Lines changed: 23 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ defmodule GenEvent do
8282
8383
- `{:ok, new_state}`
8484
- `{:ok, new_state, :hibernate}`
85-
- `{:swap_handler, args1, new_state, handler2, args2}`
8685
- `:remove_handler`
8786
8887
* `handle_call(msg, state)` - invoked when a `call/3` is done to a specific
@@ -92,7 +91,6 @@ defmodule GenEvent do
9291
9392
- `{:ok, reply, new_state}`
9493
- `{:ok, reply, new_state, :hibernate}`
95-
- `{:swap_handler, reply, args1, new_state, handler2, args2}`
9694
- `{:remove_handler, reply}`
9795
9896
* `handle_info(msg, state)` - invoked to handle all other messages which
@@ -603,15 +601,19 @@ defmodule GenEvent do
603601
reply(tag, reply)
604602
loop(parent, name, handlers, debug, hib)
605603
{_from, tag, {:add_handler, handler, args}} ->
606-
{hib, reply, handlers} = server_add_handler(handler, args, handlers)
604+
{hib, reply, handlers} = server_add_handler(handler, args, handlers, nil)
607605
reply(tag, reply)
608606
loop(parent, name, handlers, debug, hib)
609-
{_from, tag, {:add_mon_handler, handler, args, mon}} ->
610-
{hib, reply, handlers} = server_add_mon_handler(handler, args, handlers, mon)
607+
{_from, tag, {:add_handler, handler, args, notify}} ->
608+
{hib, reply, handlers} = server_add_handler(handler, args, handlers, notify)
609+
reply(tag, reply)
610+
loop(parent, name, handlers, debug, hib)
611+
{_from, tag, {:add_mon_handler, handler, args, notify}} ->
612+
{hib, reply, handlers} = server_add_mon_handler(handler, args, handlers, notify)
611613
reply(tag, reply)
612614
loop(parent, name, handlers, debug, hib)
613615
{_from, tag, {:add_process_handler, pid, notify}} ->
614-
{hib, reply, handlers} = server_add_process_handler(pid, notify, handlers)
616+
{hib, reply, handlers} = server_add_process_handler(pid, handlers, notify)
615617
reply(tag, reply)
616618
loop(parent, name, handlers, debug, hib)
617619
{_from, tag, {:delete_handler, handler, args}} ->
@@ -737,34 +739,32 @@ defmodule GenEvent do
737739
IO.puts dev, "*DBG* #{inspect name}: #{inspect dbg}"
738740
end
739741

740-
defp server_add_handler({module, id}, args, handlers) do
741-
handler = handler(module: module, id: {module, id})
742+
defp server_add_handler({module, id}, args, handlers, notify) do
743+
handler = handler(module: module, id: {module, id}, pid: notify)
742744
do_add_handler(module, handler, args, handlers, :ok)
743745
end
744746

745-
defp server_add_handler(module, args, handlers) do
746-
handler = handler(module: module, id: module)
747+
defp server_add_handler(module, args, handlers, notify) do
748+
handler = handler(module: module, id: module, pid: notify)
747749
do_add_handler(module, handler, args, handlers, :ok)
748750
end
749751

750-
defp server_add_mon_handler({module, id}, args, handlers, pid) do
751-
ref = Process.monitor(pid)
752-
handler = handler(module: module, id: {module, id}, pid: pid, ref: ref)
752+
defp server_add_mon_handler({module, id}, args, handlers, notify) do
753+
ref = Process.monitor(notify)
754+
handler = handler(module: module, id: {module, id}, pid: notify, ref: ref)
753755
do_add_handler(module, handler, args, handlers, :ok)
754756
end
755757

756-
defp server_add_mon_handler(module, args, handlers, pid) do
757-
ref = Process.monitor(pid)
758-
handler = handler(module: module, id: module, pid: pid, ref: ref)
758+
defp server_add_mon_handler(module, args, handlers, notify) do
759+
ref = Process.monitor(notify)
760+
handler = handler(module: module, id: module, pid: notify, ref: ref)
759761
do_add_handler(module, handler, args, handlers, :ok)
760762
end
761763

762-
defp server_add_process_handler(pid, notify, handlers) do
764+
defp server_add_process_handler(pid, handlers, notify) do
763765
ref = Process.monitor(pid)
764-
# Notice the pid is set only when notifications
765-
# are explicitly required.
766766
handler = handler(module: GenEvent.Stream, id: pid,
767-
pid: if(notify, do: pid), ref: ref)
767+
pid: notify, ref: ref)
768768
do_add_handler(GenEvent.Stream, handler, {pid, ref}, handlers, {self(), ref})
769769
end
770770

@@ -779,7 +779,7 @@ defmodule GenEvent do
779779
if sup do
780780
server_add_mon_handler(module2, {args2, state}, handlers, sup)
781781
else
782-
server_add_handler(module2, {args2, state}, handlers)
782+
server_add_handler(module2, {args2, state}, handlers, nil)
783783
end
784784
end
785785

@@ -829,7 +829,7 @@ defmodule GenEvent do
829829
{hib, acc}
830830
end
831831

832-
defp server_update(handler, fun, event, name, handlers) do
832+
defp server_update(handler, fun, event, name, _handlers) do
833833
handler(module: module, state: state) = handler
834834

835835
case do_handler(module, fun, [event, state]) do
@@ -839,8 +839,6 @@ defmodule GenEvent do
839839
{false, handler(handler, state: state)}
840840
{:ok, state, :hibernate} ->
841841
{true, handler(handler, state: state)}
842-
{:swap_handler, args1, state, handler2, args2} ->
843-
do_swap(handler(handler, state: state), args1, handler2, args2, name, handlers)
844842
:remove_handler ->
845843
do_terminate(handler, :remove_handler, event, name, :normal)
846844
:error
@@ -892,7 +890,7 @@ defmodule GenEvent do
892890
end
893891
end
894892

895-
defp server_call_update(handler, query, name, handlers) do
893+
defp server_call_update(handler, query, name, _handlers) do
896894
handler(module: module, state: state) = handler
897895
case do_handler(module, :handle_call, [query, state]) do
898896
{:ok, res} ->
@@ -901,8 +899,6 @@ defmodule GenEvent do
901899
{{false, handler(handler, state: state)}, reply}
902900
{:ok, reply, state, :hibernate} ->
903901
{{true, handler(handler, state: state)}, reply}
904-
{:swap_handler, reply, args1, state, handler2, args2} ->
905-
{do_swap(handler(handler, state: state), args1, handler2, args2, name, handlers), reply}
906902
{:remove_handler, reply} ->
907903
do_terminate(handler, :remove_handler, query, name, :normal)
908904
{:error, reply}
@@ -971,33 +967,6 @@ defmodule GenEvent do
971967
end
972968
end
973969

974-
defp do_swap(handler, args1, module2, args2, name, handlers) do
975-
pid = handler(handler, :pid)
976-
state = do_terminate(handler,
977-
args1, :swapped, name, {:swapped, module2, pid})
978-
979-
{hib, res, handlers} =
980-
if handler(handler, :id) == module2 or
981-
:lists.keyfind(module2, handler(:id) + 1, handlers) == false do
982-
983-
if pid do
984-
server_add_mon_handler(module2, {args2, state}, [], pid)
985-
else
986-
server_add_handler(module2, {args2, state}, [])
987-
end
988-
else
989-
{false, {:error, :already_present}, []}
990-
end
991-
992-
case res do
993-
:ok ->
994-
{hib, hd(handlers)}
995-
{:error, reason} ->
996-
report_terminate(handler, reason, state, :swapped, name)
997-
:error
998-
end
999-
end
1000-
1001970
defp do_take_handler(module, args, handlers, name, last_in, reason) do
1002971
case :lists.keytake(module, handler(:id) + 1, handlers) do
1003972
{:value, handler, handlers} ->

lib/elixir/lib/gen_event/stream.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ defimpl Enumerable, for: GenEvent.Stream do
8080

8181
defp start(%{manager: manager} = stream) do
8282
try do
83-
{:ok, {pid, ref}} = :gen.call(manager, self(), {:add_process_handler, self(), true}, :infinity)
83+
{:ok, {pid, ref}} = :gen.call(manager, self(), {:add_process_handler, self(), self()}, :infinity)
8484
mon_ref = Process.monitor(pid)
8585
{pid, ref, mon_ref}
8686
catch

lib/elixir/test/elixir/gen_event_test.exs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,6 @@ defmodule GenEventTest do
315315
assert GenEvent.notify(pid, :hello) == :ok
316316
assert_receive {:event, :hello}
317317

318-
msg = {:custom, {:swap_handler, :swapped, self(), ReplyHandler, :swap}}
319-
assert GenEvent.notify(pid, msg) == :ok
320-
assert_receive {:terminate, :swapped}
321-
assert_receive :swapped
322-
323318
assert GenEvent.notify(pid, {:custom, :remove_handler}) == :ok
324319
assert_receive {:terminate, :remove_handler}
325320
assert GenEvent.which_handlers(pid) == []
@@ -354,11 +349,6 @@ defmodule GenEventTest do
354349
assert GenEvent.ack_notify(pid, :hello) == :ok
355350
assert_receive {:event, :hello}
356351

357-
msg = {:custom, {:swap_handler, :swapped, self(), ReplyHandler, :swap}}
358-
assert GenEvent.ack_notify(pid, msg) == :ok
359-
assert_receive {:terminate, :swapped}
360-
assert_receive :swapped
361-
362352
assert GenEvent.ack_notify(pid, {:custom, :remove_handler}) == :ok
363353
assert_receive {:terminate, :remove_handler}
364354
assert GenEvent.which_handlers(pid) == []
@@ -383,11 +373,6 @@ defmodule GenEventTest do
383373
assert GenEvent.sync_notify(pid, :hello) == :ok
384374
assert_received {:event, :hello}
385375

386-
msg = {:custom, {:swap_handler, :swapped, self(), ReplyHandler, :swap}}
387-
assert GenEvent.sync_notify(pid, msg) == :ok
388-
assert_received {:terminate, :swapped}
389-
assert_received :swapped
390-
391376
assert GenEvent.sync_notify(pid, {:custom, :remove_handler}) == :ok
392377
assert_received {:terminate, :remove_handler}
393378
assert GenEvent.which_handlers(pid) == []
@@ -412,28 +397,12 @@ defmodule GenEventTest do
412397
assert GenEvent.call(pid, ReplyHandler, :hello) == :ok
413398
assert_receive {:call, :hello}
414399

415-
msg = {:custom, {:swap_handler, :ok, :swapped, self(), ReplyHandler, :swap}}
416-
assert GenEvent.call(pid, ReplyHandler, msg) == :ok
417-
assert_receive {:terminate, :swapped}
418-
assert_receive :swapped
419-
420400
assert GenEvent.call(pid, ReplyHandler, {:custom, {:remove_handler, :ok}}) == :ok
421401
assert_receive {:terminate, :remove_handler}
422402
assert GenEvent.which_handlers(pid) == []
423403

424-
GenEvent.add_handler(pid, ReplyHandler, {self(), false})
425-
msg = {:custom, {:swap_handler, :ok, :swapped, self(), ReplyHandler, :raise}}
426-
assert GenEvent.call(pid, ReplyHandler, msg) == :ok
427-
assert GenEvent.which_handlers(pid) == []
428-
429404
Logger.remove_backend(:console)
430-
431405
GenEvent.add_handler(pid, ReplyHandler, {self(), false})
432-
GenEvent.add_handler(pid, {ReplyHandler, self}, {self(), false})
433-
434-
msg = {:custom, {:swap_handler, :ok, :swapped, self(), ReplyHandler, :raise}}
435-
assert GenEvent.call(pid, {ReplyHandler, self()}, msg) == :ok
436-
assert GenEvent.which_handlers(pid) == [ReplyHandler]
437406

438407
assert {:error, {:bad_return_value, :oops}} =
439408
GenEvent.call(pid, ReplyHandler, {:custom, :oops})

0 commit comments

Comments
 (0)