Kirill Pribylov 5 years ago
parent
commit
ab13a8aeaa
3 changed files with 25 additions and 6 deletions
  1. 1 1
      src/gproc.erl
  2. 5 5
      src/gproc_lib.erl
  3. 19 0
      test/gproc_tests.erl

+ 1 - 1
src/gproc.erl

@@ -2358,7 +2358,7 @@ handle_call({demonitor, {T,l,_} = Key, Ref, Pid}, _From, S)
                     [{K, Opts}] ->
                     [{K, Opts}] ->
                         Opts1 = gproc_lib:remove_monitor(Opts, Pid, Ref),
                         Opts1 = gproc_lib:remove_monitor(Opts, Pid, Ref),
                         ets:insert(?TAB, {K, Opts1}),
                         ets:insert(?TAB, {K, Opts1}),
-                        case gproc_lib:does_pid_monitor(Pid, Opts) of
+                        case gproc_lib:does_pid_monitor(Pid, Opts1) of
                             true ->
                             true ->
                                 ok;
                                 ok;
                             false ->
                             false ->

+ 5 - 5
src/gproc_lib.erl

@@ -291,13 +291,13 @@ remove_monitors(Key, Pid, MPid) ->
 	[{_, r}] ->
 	[{_, r}] ->
 	    [];
 	    [];
 	[{K, Opts}] when is_list(Opts) ->
 	[{K, Opts}] when is_list(Opts) ->
-	    case lists:keyfind(monitors, 1, Opts) of
+	    case lists:keyfind(monitor, 1, Opts) of
 		false ->
 		false ->
 		    [];
 		    [];
 		{_, Ms} ->
 		{_, Ms} ->
-		    Ms1 = [{P,R} || {P,R} <- Ms,
+		    Ms1 = [{P,R,T} || {P,R,T} <- Ms,
 				    P =/= MPid],
 				    P =/= MPid],
-		    NewMs = lists:keyreplace(monitors, 1, Opts, {monitors,Ms1}),
+		    NewMs = lists:keyreplace(monitor, 1, Opts, {monitor,Ms1}),
 		    ets:insert(?TAB, {K, NewMs}),
 		    ets:insert(?TAB, {K, NewMs}),
 		    [{insert, [{{Pid,Key}, NewMs}]}]
 		    [{insert, [{{Pid,Key}, NewMs}]}]
 	    end;
 	    end;
@@ -306,7 +306,7 @@ remove_monitors(Key, Pid, MPid) ->
     end.
     end.
 
 
 does_pid_monitor(Pid, Opts) ->
 does_pid_monitor(Pid, Opts) ->
-    case lists:keyfind(monitors, 1, Opts) of
+    case lists:keyfind(monitor, 1, Opts) of
         false ->
         false ->
             false;
             false;
         {_, Ms} ->
         {_, Ms} ->
@@ -393,7 +393,7 @@ select_monitors([], _, Acc) ->
     Acc.
     Acc.
 
 
 remove_monitor_pid([{monitor, Mons}|T], Pid) ->
 remove_monitor_pid([{monitor, Mons}|T], Pid) ->
-    [{monitors, [M || M <- Mons,
+    [{monitor, [M || M <- Mons,
                       element(1, M) =/= Pid]}|T];
                       element(1, M) =/= Pid]}|T];
 remove_monitor_pid([H|T], Pid) ->
 remove_monitor_pid([H|T], Pid) ->
     [H | remove_monitor_pid(T, Pid)];
     [H | remove_monitor_pid(T, Pid)];

+ 19 - 0
test/gproc_tests.erl

@@ -154,6 +154,8 @@ reg_test_() ->
       , ?_test(t_is_clean())
       , ?_test(t_is_clean())
       , {spawn, ?_test(?debugVal(t_monitor_follow()))}
       , {spawn, ?_test(?debugVal(t_monitor_follow()))}
       , ?_test(t_is_clean())
       , ?_test(t_is_clean())
+      , {spawn, ?_test(?debugVal(t_two_monitoring_processes_one_dies()))}
+      , ?_test(t_is_clean())
       , {spawn, ?_test(?debugVal(t_monitor_demonitor()))}
       , {spawn, ?_test(?debugVal(t_monitor_demonitor()))}
       , ?_test(t_is_clean())
       , ?_test(t_is_clean())
       , {spawn, ?_test(?debugVal(t_subscribe()))}
       , {spawn, ?_test(?debugVal(t_subscribe()))}
@@ -926,6 +928,23 @@ t_monitor_follow() ->
     [exit(P,kill) || P <- [P1,P3]],
     [exit(P,kill) || P <- [P1,P3]],
     ok.
     ok.
 
 
+t_two_monitoring_processes_one_dies() ->
+  Name = ?T_NAME,
+  P = t_spawn_reg(Name),
+  Ref = gproc:monitor(Name),
+  {P2, R2} = spawn_monitor(fun() -> gproc:monitor(Name) end),
+  receive
+    {'DOWN', R2, process, P2, normal} -> ok
+  end,
+  exit(P, kill),
+  receive
+    M ->
+      ?assertEqual({gproc, unreg, Ref, Name}, M)
+  after 1000 ->
+    error(timeout)
+  end
+.
+
 t_monitor_demonitor() ->
 t_monitor_demonitor() ->
     Name = ?T_NAME,
     Name = ?T_NAME,
     P1 = t_spawn(Selective = true),
     P1 = t_spawn(Selective = true),