386386-define (HIBERNATE_AFTER_MIN , 1000 ).
387387-define (DESIRED_HIBERNATE , 10000 ).
388388-define (BROADCAST_TIMER , 25 ).
389+ -define (VERSION_START , 0 ).
389390-define (SETS , ordsets ).
390391-define (DICT , orddict ).
391392
@@ -515,8 +516,8 @@ group_members(Server) ->
515516init ([GroupName , Module , Args ]) ->
516517 {MegaSecs , Secs , MicroSecs } = now (),
517518 random :seed (MegaSecs , Secs , MicroSecs ),
519+ Self = make_member (GroupName ),
518520 gen_server2 :cast (self (), join ),
519- Self = self (),
520521 {ok , # state { self = Self ,
521522 left = {Self , undefined },
522523 right = {Self , undefined },
@@ -541,7 +542,8 @@ handle_call({confirmed_broadcast, Msg}, _From,
541542 right = {Self , undefined },
542543 module = Module ,
543544 callback_args = Args }) ->
544- handle_callback_result ({Module :handle_msg (Args , Self , Msg ), ok , State });
545+ handle_callback_result ({Module :handle_msg (Args , get_pid (Self ), Msg ),
546+ ok , State });
545547
546548handle_call ({confirmed_broadcast , Msg }, From , State ) ->
547549 internal_broadcast (Msg , From , State );
@@ -604,7 +606,8 @@ handle_cast({broadcast, Msg},
604606 right = {Self , undefined },
605607 module = Module ,
606608 callback_args = Args }) ->
607- handle_callback_result ({Module :handle_msg (Args , Self , Msg ), State });
609+ handle_callback_result ({Module :handle_msg (Args , get_pid (Self ), Msg ),
610+ State });
608611
609612handle_cast ({broadcast , Msg }, State ) ->
610613 internal_broadcast (Msg , none , State );
@@ -623,7 +626,7 @@ handle_cast(join, State = #state { self = Self,
623626 State1 = check_neighbours (State # state { view = View ,
624627 members_state = MembersState }),
625628 handle_callback_result (
626- {Module :joined (Args , all_known_members (View )), State1 });
629+ {Module :joined (Args , get_pids ( all_known_members (View ) )), State1 });
627630
628631handle_cast (leave , State ) ->
629632 {stop , normal , State }.
@@ -817,7 +820,7 @@ internal_broadcast(Msg, From, State = #state { self = Self,
817820 confirms = Confirms ,
818821 callback_args = Args ,
819822 broadcast_buffer = Buffer }) ->
820- Result = Module :handle_msg (Args , Self , Msg ),
823+ Result = Module :handle_msg (Args , get_pid ( Self ) , Msg ),
821824 Buffer1 = [{PubCount , Msg } | Buffer ],
822825 Confirms1 = case From of
823826 none -> Confirms ;
@@ -979,7 +982,7 @@ join_group(Self, GroupName, #gm_group { members = Members } = Group) ->
979982 end ,
980983 try
981984 case gen_server2 :call (
982- Left , {add_on_right , Self }, infinity ) of
985+ get_pid ( Left ) , {add_on_right , Self }, infinity ) of
983986 {ok , Group1 } -> group_to_view (Group1 );
984987 not_ready -> join_group (Self , GroupName )
985988 end
@@ -1005,7 +1008,7 @@ prune_or_create_group(Self, GroupName) ->
10051008 mnesia :sync_transaction (
10061009 fun () -> GroupNew = # gm_group { name = GroupName ,
10071010 members = [Self ],
1008- version = 0 },
1011+ version = ? VERSION_START },
10091012 case mnesia :read ({? GROUP_TABLE , GroupName }) of
10101013 [] ->
10111014 mnesia :write (GroupNew ),
@@ -1114,24 +1117,25 @@ can_erase_view_member(_Self, _Id, _LA, _LP) -> false.
11141117ensure_neighbour (_Ver , Self , {Self , undefined }, Self ) ->
11151118 {Self , undefined };
11161119ensure_neighbour (Ver , Self , {Self , undefined }, RealNeighbour ) ->
1117- ok = gen_server2 :cast (RealNeighbour , {? TAG , Ver , check_neighbours }),
1120+ ok = gen_server2 :cast (get_pid (RealNeighbour ),
1121+ {? TAG , Ver , check_neighbours }),
11181122 {RealNeighbour , maybe_monitor (RealNeighbour , Self )};
11191123ensure_neighbour (_Ver , _Self , {RealNeighbour , MRef }, RealNeighbour ) ->
11201124 {RealNeighbour , MRef };
11211125ensure_neighbour (Ver , Self , {RealNeighbour , MRef }, Neighbour ) ->
11221126 true = erlang :demonitor (MRef ),
11231127 Msg = {? TAG , Ver , check_neighbours },
1124- ok = gen_server2 :cast (RealNeighbour , Msg ),
1128+ ok = gen_server2 :cast (get_pid ( RealNeighbour ) , Msg ),
11251129 ok = case Neighbour of
11261130 Self -> ok ;
1127- _ -> gen_server2 :cast (Neighbour , Msg )
1131+ _ -> gen_server2 :cast (get_pid ( Neighbour ) , Msg )
11281132 end ,
11291133 {Neighbour , maybe_monitor (Neighbour , Self )}.
11301134
11311135maybe_monitor (Self , Self ) ->
11321136 undefined ;
11331137maybe_monitor (Other , _Self ) ->
1134- erlang :monitor (process , Other ).
1138+ erlang :monitor (process , get_pid ( Other ) ).
11351139
11361140check_neighbours (State = # state { self = Self ,
11371141 left = Left ,
@@ -1238,6 +1242,15 @@ prepare_members_state(MembersState) ->
12381242build_members_state (MembersStateList ) ->
12391243 ? DICT :from_list (MembersStateList ).
12401244
1245+ make_member (GroupName ) ->
1246+ {case read_group (GroupName ) of
1247+ # gm_group { version = Version } -> Version ;
1248+ {error , not_found } -> ? VERSION_START
1249+ end , self ()}.
1250+
1251+ get_pid ({_Version , Pid }) -> Pid .
1252+
1253+ get_pids (Ids ) -> [Pid || {_Version , Pid } <- Ids ].
12411254
12421255% % ---------------------------------------------------------------------------
12431256% % Activity assembly
@@ -1262,13 +1275,13 @@ maybe_send_activity(Activity, #state { self = Self,
12621275 send_right (Right , View , {activity , Self , Activity }).
12631276
12641277send_right (Right , View , Msg ) ->
1265- ok = gen_server2 :cast (Right , {? TAG , view_version (View ), Msg }).
1278+ ok = gen_server2 :cast (get_pid ( Right ) , {? TAG , view_version (View ), Msg }).
12661279
12671280callback (Args , Module , Activity ) ->
12681281 lists :foldl (
12691282 fun ({Id , Pubs , _Acks }, ok ) ->
12701283 lists :foldl (fun ({_PubNum , Pub }, ok ) ->
1271- Module :handle_msg (Args , Id , Pub );
1284+ Module :handle_msg (Args , get_pid ( Id ) , Pub );
12721285 (_ , Error ) ->
12731286 Error
12741287 end , ok , Pubs );
@@ -1283,7 +1296,8 @@ callback_view_changed(Args, Module, OldView, NewView) ->
12831296 Deaths = OldMembers -- NewMembers ,
12841297 case {Births , Deaths } of
12851298 {[], []} -> ok ;
1286- _ -> Module :members_changed (Args , Births , Deaths )
1299+ _ -> Module :members_changed (Args , get_pids (Births ),
1300+ get_pids (Deaths ))
12871301 end .
12881302
12891303handle_callback_result ({Result , State }) ->
0 commit comments