Просмотр исходного кода

Merge pull request #75 from uwiger/uw-dist-await-deletes-key

removing dead waiter (dist) accidentally deletes reg
Ulf Wiger 10 лет назад
Родитель
Сommit
26a9d9faff
3 измененных файлов с 16 добавлено и 6 удалено
  1. 8 2
      src/gproc_dist.erl
  2. 2 1
      test/gproc_dist_tests.erl
  3. 6 3
      test/gproc_tests.erl

+ 8 - 2
src/gproc_dist.erl

@@ -730,8 +730,14 @@ filter_standbys([], _) ->
 
 remove_entry(Key, Pid, Event) ->
     K = ets_key(Key, Pid),
-    ets:delete(?TAB, K),
-    remove_rev_entry(get_opts(Pid, Key), Pid, Key, Event).
+    case ets:lookup(?TAB, K) of
+	[{_, Pid, _}] ->
+	    ets:delete(?TAB, K),
+	    remove_rev_entry(get_opts(Pid, Key), Pid, Key, Event);
+	[{_, _OtherPid, _}] ->
+	    ets:delete(?TAB, {Pid, Key}),
+	    []
+    end.
 
 remove_rev_entry(Opts, Pid, {T,g,_} = K, Event) when T==n; T==a ->
     Key = {Pid, K},

+ 2 - 1
test/gproc_dist_tests.erl

@@ -232,7 +232,7 @@ t_mreg([H|_] = Ns) ->
     [?assertMatch(ok, t_lookup_everywhere({n,g,K},Ns,undefined)) || K <- Keys],
     ?assertMatch(ok, t_call(P, die)).
 
-t_await_reg([A,B|_]) ->
+t_await_reg([A,B|_] = Ns) ->
     Name = ?T_NAME,
     P = t_spawn(A),
     Ref = erlang:monitor(process, P),
@@ -249,6 +249,7 @@ t_await_reg([A,B|_]) ->
 		  end),
     ?assertMatch(ok, t_call(P, die)),
     flush_down(Ref),
+    ?assertMatch(ok, t_lookup_everywhere(Name, Ns, P1)),
     ?assertMatch(ok, t_call(P1, die)).
 
 t_await_self([A|_]) ->

+ 6 - 3
test/gproc_tests.erl

@@ -272,18 +272,21 @@ t_other_proc(F) ->
 
 t_await() ->
     Me = self(),
+    Name = {n,l,t_await},
     {_Pid,Ref} = spawn_monitor(
                    fun() ->
 			   exit(?assert(
-				   gproc:await({n,l,t_await}) =:= {Me,val}))
+				   gproc:await(Name) =:= {Me,val}))
 		   end),
-    ?assert(gproc:reg({n,l,t_await},val) =:= true),
+    ?assert(gproc:reg(Name, val) =:= true),
     receive
         {'DOWN', Ref, _, _, R} ->
             ?assertEqual(R, ok)
     after 10000 ->
             erlang:error(timeout)
-    end.
+    end,
+    ?assertMatch(Me, gproc:where(Name)),
+    ok.
 
 t_await_self() ->
     Me = self(),