@@ -732,57 +732,33 @@ defmodule GenEvent do
732
732
733
733
defp server_add_handler ( { module , id } , args , handlers ) do
734
734
handler = handler ( module: module , id: { module , id } )
735
- server_add_handler ( module , handler , args , handlers )
735
+ do_add_handler ( module , handler , args , handlers , :ok )
736
736
end
737
737
738
738
defp server_add_handler ( module , args , handlers ) do
739
739
handler = handler ( module: module , id: module )
740
- server_add_handler ( module , handler , args , handlers )
741
- end
742
-
743
- defp server_add_handler ( module , handler , arg , handlers ) do
744
- case :lists . keyfind ( handler ( handler , :id ) , handler ( :id ) + 1 , handlers ) do
745
- false ->
746
- case do_handler ( module , :init , [ arg ] ) do
747
- { :ok , res } ->
748
- case res do
749
- { :ok , state } ->
750
- { false , :ok , [ handler ( handler , state: state ) | handlers ] }
751
- { :ok , state , :hibernate } ->
752
- { true , :ok , [ handler ( handler , state: state ) | handlers ] }
753
- { :error , _ } = error ->
754
- { false , error , handlers }
755
- other ->
756
- { false , { :error , { :bad_return_value , other } } , handlers }
757
- end
758
- { :error , _ } = error ->
759
- { false , error , handlers }
760
- end
761
- _ ->
762
- { false , { :error , :already_added } , handlers }
763
- end
740
+ do_add_handler ( module , handler , args , handlers , :ok )
764
741
end
765
742
766
743
defp server_add_mon_handler ( { module , id } , args , handlers , pid ) do
767
744
ref = Process . monitor ( pid )
768
745
handler = handler ( module: module , id: { module , id } , pid: pid , ref: ref )
769
- server_add_handler ( module , handler , args , handlers )
746
+ do_add_handler ( module , handler , args , handlers , :ok )
770
747
end
771
748
772
749
defp server_add_mon_handler ( module , args , handlers , pid ) do
773
750
ref = Process . monitor ( pid )
774
751
handler = handler ( module: module , id: module , pid: pid , ref: ref )
775
- server_add_handler ( module , handler , args , handlers )
752
+ do_add_handler ( module , handler , args , handlers , :ok )
776
753
end
777
754
778
755
defp server_add_process_handler ( pid , notify , handlers ) do
779
756
ref = Process . monitor ( pid )
780
- { :ok , state } = GenEvent.Stream . init ( { pid , ref } )
781
757
# Notice the pid is set only when notifications
782
758
# are explicitly required.
783
- handler = handler ( module: GenEvent.Stream , id: { GenEvent.Stream , ref } ,
784
- pid: if ( notify , do: pid ) , ref: ref , state: state )
785
- { false , ref , [ handler | handlers ] }
759
+ handler = handler ( module: GenEvent.Stream , id: { GenEvent.Stream , pid } ,
760
+ pid: if ( notify , do: pid ) , ref: ref )
761
+ do_add_handler ( GenEvent.Stream , handler , { pid , ref } , handlers , { self ( ) , ref } )
786
762
end
787
763
788
764
defp server_remove_handler ( module , args , handlers , name ) do
@@ -813,7 +789,7 @@ defmodule GenEvent do
813
789
814
790
defp server_split_process_handlers ( mode , event , [ handler | t ] , handlers , streams ) do
815
791
case handler ( handler , :id ) do
816
- { GenEvent.Stream , _ref } ->
792
+ { GenEvent.Stream , _pid } ->
817
793
server_process_notify ( mode , event , handler )
818
794
server_split_process_handlers ( mode , event , t , handlers , [ handler | streams ] )
819
795
_ ->
@@ -965,6 +941,29 @@ defmodule GenEvent do
965
941
end
966
942
end
967
943
944
+ defp do_add_handler ( module , handler , arg , handlers , succ ) do
945
+ case :lists . keyfind ( handler ( handler , :id ) , handler ( :id ) + 1 , handlers ) do
946
+ false ->
947
+ case do_handler ( module , :init , [ arg ] ) do
948
+ { :ok , res } ->
949
+ case res do
950
+ { :ok , state } ->
951
+ { false , succ , [ handler ( handler , state: state ) | handlers ] }
952
+ { :ok , state , :hibernate } ->
953
+ { true , succ , [ handler ( handler , state: state ) | handlers ] }
954
+ { :error , _ } = error ->
955
+ { false , error , handlers }
956
+ other ->
957
+ { false , { :error , { :bad_return_value , other } } , handlers }
958
+ end
959
+ { :error , _ } = error ->
960
+ { false , error , handlers }
961
+ end
962
+ _ ->
963
+ { false , { :error , :already_added } , handlers }
964
+ end
965
+ end
966
+
968
967
defp do_swap ( handler , args1 , module2 , args2 , name , handlers ) do
969
968
pid = handler ( handler , :pid )
970
969
state = do_terminate ( handler ,
0 commit comments