Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 1.87 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),
  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.  
  34.  
  35.  
  36. %is_process_alive(Pid).
  37.  
  38.  
  39. reMap(Uid, NewUidLink, OldMap) ->
  40.         maps:put(Uid, NewUidLink, OldMap).
  41.  
  42. get_link(Uid, Map) ->
  43.     #{Uid := Next} = Map.
  44.  
  45. is_map_change(Map, NewMap) ->
  46.     #{ver := Old} = Map, #{ver := New} = NewMap,
  47.     Old =:= New.
  48.  
  49. update_map(Uid, NewMap, LogPid) ->
  50.     #{uid => Uid, map => NewMap, logPid => LogPid}
  51.  
  52. is_end_destination(Uid, To) ->
  53.     Uid =:= To.
  54.    
  55.  
  56. log(Uid, Pid, Msg) -> Pid ! {Uid, Msg}.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement