@@ -82,7 +82,6 @@ defmodule GenEvent do
82
82
83
83
- `{:ok, new_state}`
84
84
- `{:ok, new_state, :hibernate}`
85
- - `{:swap_handler, args1, new_state, handler2, args2}`
86
85
- `:remove_handler`
87
86
88
87
* `handle_call(msg, state)` - invoked when a `call/3` is done to a specific
@@ -92,7 +91,6 @@ defmodule GenEvent do
92
91
93
92
- `{:ok, reply, new_state}`
94
93
- `{:ok, reply, new_state, :hibernate}`
95
- - `{:swap_handler, reply, args1, new_state, handler2, args2}`
96
94
- `{:remove_handler, reply}`
97
95
98
96
* `handle_info(msg, state)` - invoked to handle all other messages which
@@ -603,15 +601,19 @@ defmodule GenEvent do
603
601
reply ( tag , reply )
604
602
loop ( parent , name , handlers , debug , hib )
605
603
{ _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 )
607
605
reply ( tag , reply )
608
606
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 )
611
613
reply ( tag , reply )
612
614
loop ( parent , name , handlers , debug , hib )
613
615
{ _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 )
615
617
reply ( tag , reply )
616
618
loop ( parent , name , handlers , debug , hib )
617
619
{ _from , tag , { :delete_handler , handler , args } } ->
@@ -737,34 +739,32 @@ defmodule GenEvent do
737
739
IO . puts dev , "*DBG* #{ inspect name } : #{ inspect dbg } "
738
740
end
739
741
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 )
742
744
do_add_handler ( module , handler , args , handlers , :ok )
743
745
end
744
746
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 )
747
749
do_add_handler ( module , handler , args , handlers , :ok )
748
750
end
749
751
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 )
753
755
do_add_handler ( module , handler , args , handlers , :ok )
754
756
end
755
757
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 )
759
761
do_add_handler ( module , handler , args , handlers , :ok )
760
762
end
761
763
762
- defp server_add_process_handler ( pid , notify , handlers ) do
764
+ defp server_add_process_handler ( pid , handlers , notify ) do
763
765
ref = Process . monitor ( pid )
764
- # Notice the pid is set only when notifications
765
- # are explicitly required.
766
766
handler = handler ( module: GenEvent.Stream , id: pid ,
767
- pid: if ( notify , do: pid ) , ref: ref )
767
+ pid: notify , ref: ref )
768
768
do_add_handler ( GenEvent.Stream , handler , { pid , ref } , handlers , { self ( ) , ref } )
769
769
end
770
770
@@ -779,7 +779,7 @@ defmodule GenEvent do
779
779
if sup do
780
780
server_add_mon_handler ( module2 , { args2 , state } , handlers , sup )
781
781
else
782
- server_add_handler ( module2 , { args2 , state } , handlers )
782
+ server_add_handler ( module2 , { args2 , state } , handlers , nil )
783
783
end
784
784
end
785
785
@@ -829,7 +829,7 @@ defmodule GenEvent do
829
829
{ hib , acc }
830
830
end
831
831
832
- defp server_update ( handler , fun , event , name , handlers ) do
832
+ defp server_update ( handler , fun , event , name , _handlers ) do
833
833
handler ( module: module , state: state ) = handler
834
834
835
835
case do_handler ( module , fun , [ event , state ] ) do
@@ -839,8 +839,6 @@ defmodule GenEvent do
839
839
{ false , handler ( handler , state: state ) }
840
840
{ :ok , state , :hibernate } ->
841
841
{ true , handler ( handler , state: state ) }
842
- { :swap_handler , args1 , state , handler2 , args2 } ->
843
- do_swap ( handler ( handler , state: state ) , args1 , handler2 , args2 , name , handlers )
844
842
:remove_handler ->
845
843
do_terminate ( handler , :remove_handler , event , name , :normal )
846
844
:error
@@ -892,7 +890,7 @@ defmodule GenEvent do
892
890
end
893
891
end
894
892
895
- defp server_call_update ( handler , query , name , handlers ) do
893
+ defp server_call_update ( handler , query , name , _handlers ) do
896
894
handler ( module: module , state: state ) = handler
897
895
case do_handler ( module , :handle_call , [ query , state ] ) do
898
896
{ :ok , res } ->
@@ -901,8 +899,6 @@ defmodule GenEvent do
901
899
{ { false , handler ( handler , state: state ) } , reply }
902
900
{ :ok , reply , state , :hibernate } ->
903
901
{ { 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 }
906
902
{ :remove_handler , reply } ->
907
903
do_terminate ( handler , :remove_handler , query , name , :normal )
908
904
{ :error , reply }
@@ -971,33 +967,6 @@ defmodule GenEvent do
971
967
end
972
968
end
973
969
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
-
1001
970
defp do_take_handler ( module , args , handlers , name , last_in , reason ) do
1002
971
case :lists . keytake ( module , handler ( :id ) + 1 , handlers ) do
1003
972
{ :value , handler , handlers } ->
0 commit comments