Browse Source

Fix premature demonitor

Andrei Dziaineka 4 years ago
parent
commit
000375473d
1 changed files with 18 additions and 2 deletions
  1. 18 2
      src/syn_registry.erl

+ 18 - 2
src/syn_registry.erl

@@ -500,8 +500,8 @@ unregister_on_node(Name) ->
             {error, undefined};
             {error, undefined};
 
 
         {{Name, Pid}, _Meta, _Clock, MonitorRef, _Node} when MonitorRef =/= undefined ->
         {{Name, Pid}, _Meta, _Clock, MonitorRef, _Node} when MonitorRef =/= undefined ->
-            %% demonitor
-            erlang:demonitor(MonitorRef, [flush]),
+            %% demonitor if it is last name to unregister for the Pid
+            maybe_demonitor(Pid),
             %% remove from table
             %% remove from table
             remove_from_local_table(Name, Pid),
             remove_from_local_table(Name, Pid),
             %% return
             %% return
@@ -527,6 +527,22 @@ unregister_on_node(Name) ->
             {error, remote_pid}
             {error, remote_pid}
     end.
     end.
 
 
+-spec maybe_demonitor(Pid :: pid()) -> ok.
+maybe_demonitor(Pid) ->
+    %% try to get two items to check if it only one item left
+    case ets:select(syn_registry_by_pid, [{
+        {{Pid, '_'}, '_', '_', '$5', '_'},
+        [],
+        ['$5']
+    }], 2) of
+        {[MonitorRef], _} ->
+            erlang:demonitor(MonitorRef, [flush]),
+            ok;
+
+        _ ->
+            ok
+    end.
+
 -spec add_to_local_table(
 -spec add_to_local_table(
     Name :: any(),
     Name :: any(),
     Pid :: pid(),
     Pid :: pid(),