|
@@ -117,15 +117,16 @@ register_or_update(Scope, Name, Pid, MetaOrFun) ->
|
|
|
_ ->
|
|
|
Node = node(Pid),
|
|
|
case syn_gen_scope:call(?MODULE, Node, Scope, {'3.0', register_or_update_on_node, node(), Name, Pid, MetaOrFun}) of
|
|
|
- {ok, {CallbackMethod, Meta, Time, TableByName, TableByPid}} when Node =/= node() ->
|
|
|
+ {ok, {CallbackMethod, PreviousMeta, Meta, Time, TableByName, TableByPid}} when Node =/= node() ->
|
|
|
%% update table on caller node immediately so that subsequent calls have an updated registry
|
|
|
add_to_local_table(Name, Pid, Meta, Time, undefined, TableByName, TableByPid),
|
|
|
%% callback
|
|
|
syn_event_handler:call_event_handler(CallbackMethod, [Scope, Name, Pid, Meta, normal]),
|
|
|
+ syn_event_handler:call_event_handler(CallbackMethod, [Scope, Name, Pid, PreviousMeta, Meta, normal]),
|
|
|
%% return
|
|
|
{ok, {Pid, Meta}};
|
|
|
|
|
|
- {ok, {_, Meta, _, _, _}} ->
|
|
|
+ {ok, {_, _, Meta, _, _, _}} ->
|
|
|
{ok, {Pid, Meta}};
|
|
|
|
|
|
{noop, Meta} ->
|
|
@@ -239,7 +240,7 @@ handle_call({'3.0', register_or_update_on_node, RequesterNode, Name, Pid, MetaOr
|
|
|
undefined -> erlang:monitor(process, Pid); %% process is not monitored yet, add
|
|
|
MRef0 -> MRef0
|
|
|
end,
|
|
|
- do_register_on_node(Name, Pid, MetaOrFun, MRef, normal, RequesterNode, on_process_registered, State);
|
|
|
+ do_register_on_node(Name, Pid, undefined, MetaOrFun, MRef, normal, RequesterNode, on_process_registered, State);
|
|
|
|
|
|
{Name, Pid, TableMeta, _, MRef, _} when is_function(MetaOrFun) ->
|
|
|
%% update with fun
|
|
@@ -248,7 +249,7 @@ handle_call({'3.0', register_or_update_on_node, RequesterNode, Name, Pid, MetaOr
|
|
|
{reply, {noop, TableMeta}, State};
|
|
|
|
|
|
Meta ->
|
|
|
- do_register_on_node(Name, Pid, Meta, MRef, normal, RequesterNode, on_registry_process_updated, State)
|
|
|
+ do_register_on_node(Name, Pid, TableMeta, Meta, MRef, normal, RequesterNode, on_registry_process_updated, State)
|
|
|
|
|
|
catch Class:Reason:Stacktrace ->
|
|
|
error_logger:error_msg(
|
|
@@ -262,9 +263,9 @@ handle_call({'3.0', register_or_update_on_node, RequesterNode, Name, Pid, MetaOr
|
|
|
%% same pid, same meta
|
|
|
{reply, {noop, MetaOrFun}, State};
|
|
|
|
|
|
- {Name, Pid, _, _, MRef, _} ->
|
|
|
+ {Name, Pid, TableMeta, _, MRef, _} ->
|
|
|
%% same pid, different meta
|
|
|
- do_register_on_node(Name, Pid, MetaOrFun, MRef, normal, RequesterNode, on_registry_process_updated, State);
|
|
|
+ do_register_on_node(Name, Pid, TableMeta, MetaOrFun, MRef, normal, RequesterNode, on_registry_process_updated, State);
|
|
|
|
|
|
_ ->
|
|
|
{reply, {error, taken}, State}
|
|
@@ -435,6 +436,7 @@ do_rebuild_monitors([{Name, Pid, Meta, Time} | T], NewMRefs, Scope, TableByName,
|
|
|
-spec do_register_on_node(
|
|
|
Name :: term(),
|
|
|
Pid :: pid(),
|
|
|
+ PreviousMeta :: term(),
|
|
|
Meta :: term(),
|
|
|
MRef :: reference() | undefined,
|
|
|
Reason :: term(),
|
|
@@ -446,6 +448,7 @@ do_rebuild_monitors([{Name, Pid, Meta, Time} | T], NewMRefs, Scope, TableByName,
|
|
|
reply,
|
|
|
{ok, {
|
|
|
CallbackMethod :: atom(),
|
|
|
+ PreviousMeta :: term(),
|
|
|
Meta :: term(),
|
|
|
Time :: non_neg_integer(),
|
|
|
TableByName :: atom(),
|
|
@@ -453,7 +456,7 @@ do_rebuild_monitors([{Name, Pid, Meta, Time} | T], NewMRefs, Scope, TableByName,
|
|
|
}},
|
|
|
#state{}
|
|
|
}.
|
|
|
-do_register_on_node(Name, Pid, Meta, MRef, Reason, RequesterNode, CallbackMethod, #state{
|
|
|
+do_register_on_node(Name, Pid, PreviousMeta, Meta, MRef, Reason, RequesterNode, CallbackMethod, #state{
|
|
|
scope = Scope,
|
|
|
table_by_name = TableByName,
|
|
|
table_by_pid = TableByPid
|
|
@@ -463,10 +466,11 @@ do_register_on_node(Name, Pid, Meta, MRef, Reason, RequesterNode, CallbackMethod
|
|
|
add_to_local_table(Name, Pid, Meta, Time, MRef, TableByName, TableByPid),
|
|
|
%% callback
|
|
|
syn_event_handler:call_event_handler(CallbackMethod, [Scope, Name, Pid, Meta, Reason]),
|
|
|
+ syn_event_handler:call_event_handler(CallbackMethod, [Scope, Name, Pid, PreviousMeta, Meta, normal]),
|
|
|
%% broadcast
|
|
|
syn_gen_scope:broadcast({'3.0', sync_register, Name, Pid, Meta, Time, Reason}, [RequesterNode], State),
|
|
|
%% return
|
|
|
- {reply, {ok, {CallbackMethod, Meta, Time, TableByName, TableByPid}}, State}.
|
|
|
+ {reply, {ok, {CallbackMethod, PreviousMeta, Meta, Time, TableByName, TableByPid}}, State}.
|
|
|
|
|
|
-spec get_registry_tuples_for_node(Node :: node(), TableByName :: atom()) -> [syn_registry_tuple()].
|
|
|
get_registry_tuples_for_node(Node, TableByName) ->
|
|
@@ -616,7 +620,8 @@ handle_registry_sync(Name, Pid, Meta, Time, Reason, #state{
|
|
|
%% callback (call only if meta update)
|
|
|
case TableMeta =/= Meta of
|
|
|
true ->
|
|
|
- syn_event_handler:call_event_handler(on_registry_process_updated, [Scope, Name, Pid, Meta, Reason]);
|
|
|
+ syn_event_handler:call_event_handler(on_registry_process_updated, [Scope, Name, Pid, Meta, Reason]),
|
|
|
+ syn_event_handler:call_event_handler(on_registry_process_updated, [Scope, Name, Pid, TableMeta, Meta, Reason]);
|
|
|
_ -> ok
|
|
|
end;
|
|
|
|