Browse Source

mreg() on props failed to trigger monitor

Ulf Wiger 11 years ago
parent
commit
349ee564c5
2 changed files with 14 additions and 0 deletions
  1. 3 0
      src/gproc_lib.erl
  2. 11 0
      test/gproc_tests.erl

+ 3 - 0
src/gproc_lib.erl

@@ -274,6 +274,9 @@ mk_reg_rev_objs(T, Scope, Pid, L) ->
 
 ensure_monitor(shared, _) ->
     ok;
+ensure_monitor(Pid, _) when Pid == self() ->
+    %% monitoring is ensured through a 'monitor_me' message
+    ok;
 ensure_monitor(Pid, Scope) when Scope==g; Scope==l ->
     case ets:insert_new(?TAB, {{Pid, Scope}}) of
         false -> ok;

+ 11 - 0
test/gproc_tests.erl

@@ -93,6 +93,8 @@ reg_test_() ->
       , ?_test(t_is_clean())
       , {spawn, ?_test(?debugVal(t_simple_mreg()))}
       , ?_test(t_is_clean())
+      , {spawn, ?_test(?debugVal(t_mreg_props()))}
+      , ?_test(t_is_clean())
       , {spawn, ?_test(?debugVal(t_gproc_crash()))}
       , ?_test(t_is_clean())
       , {spawn, ?_test(?debugVal(t_cancel_wait_and_register()))}
@@ -322,6 +324,15 @@ t_simple_mreg() ->
     ?assertEqual(P, gproc:where({n,l,bar})),
     ?assertEqual(true, gproc:munreg(n, l, [foo, bar])).
 
+t_mreg_props() ->
+    P = self(),
+    ?assertEqual(true, gproc:mreg(p, l, [{p, v}])),
+    ?assertEqual(v, gproc:get_value({p,l,p})),
+    %% Force a context switch, since gproc:monitor_me() is asynchronous
+    _ = sys:get_status(gproc),
+    {monitors, Mons} = process_info(whereis(gproc), monitors),
+    ?assertEqual(true, lists:keymember(P, 2, Mons)).
+
 
 t_gproc_crash() ->
     P = spawn_helper(),