Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 1.97 KB | None | 0 0
  1. -module(proc).
  2. -export([loop/1]).
  3.  
  4.  
  5.  
  6. loop(Setting) ->
  7.  
  8.         #{uid := Uid} = Setting,
  9.         #{map := Map} = Setting,
  10.         #{logPid := LogPid} = Setting,
  11.  
  12.         receive
  13.             {From, {To, Msg, NewMap}}  ->
  14.                 log(Uid,LogPid, Msg),
  15.                 case is_map_change(Map, NewMap) of
  16.                     true -> log(Uid,LogPid, "Карта изменилась"), SettingNew = update_map(Uid,NewMap,LogPid);
  17.                     false -> log(Uid,LogPid, "Карта не изменилась"), SettingNew = Setting
  18.                 end,
  19.                 case is_end_destination(Uid, To) of
  20.                     true -> log(Uid,LogPid, "Пакет прибыл в место назначения");
  21.                     false -> log(Uid,LogPid, "Передаем пакет дальше"),
  22.                     case is_process_alive(get_link(Uid, NewMap)) of
  23.                         true -> get_link(Uid, NewMap) ! {From, {To, Msg, NewMap}};
  24.                         false -> log(Uid,LogPid, "Процесс не в сети, перестраиваем сеть"),
  25.                         UpdatedMap = reMap(Uid, get_link(get_link(Uid, NewMap),NewMap),NewMap ),
  26.                         SettingNew = update_map(Uid,UpdatedMap, NewMap),
  27.                         get_link(Uid, UpdatedMap) ! {From, {To, Msg, UpdatedMap}}
  28.                     end
  29.                 end
  30.          end,
  31.         loop(SettingNew).
  32.  
  33. %is_process_alive(Pid).
  34.  
  35. %update current proc link and map ver.
  36. reMap(Uid, NewUidLink, OldMap) ->
  37.         #{ver := Ver} = OldMap,
  38.         OldMap#{Uid => NewUidLink, ver => Ver+1}.
  39.  
  40. get_link(Uid, Map) ->
  41.     #{Uid := Next} = Map, Next.
  42.  
  43. is_map_change(Map, NewMap) ->
  44.     #{ver := Old} = Map, #{ver := New} = NewMap,
  45.     Old < New.
  46.  
  47. %update map in Setting
  48. update_map(Uid, NewMap, LogPid) ->
  49.     #{uid => Uid, map => NewMap, logPid => LogPid}.
  50.  
  51. is_end_destination(Uid, To) ->
  52.     Uid =:= To.
  53.    
  54.  
  55. log(Uid, Pid, Msg) -> Pid ! {Uid, Msg}.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement