У меня есть функция, которая устанавливает значение для процесса Pid, и у меня может быть процесс, зависящий от другого. Поэтому, если я устанавливаю значение для процесса, я также должен установить значение для процессов, которые от него зависят. Однако, если существует круг между процессами
i.e. A depends on B and B depends on A
то я хочу вернуть сообщение об ошибке.
Я пытаюсь сделать это, передавая список PID, которые уже изменили значения, поэтому, если я дважды сталкиваюсь с одним и тем же Pid (проверив, является ли он членом списка PID), вся функция останавливается. Это мой код:
set_values(Pid, Value, PidSet, PidList) ->
case lists:member(Pid, PidList) of
false -> io:format("Setting Value~n"),
lists:map(fun(Pid) ->
Pid ! {self(), set_value, Value, [Pid | PidList]} end, PidSet);
true -> io:format("circle_detected~n"),
Pid ! {circle_detected}
end.
Когда я запускаю его, я получаю эту ошибку:
=ERROR REPORT==== 2-Nov-2014::17:47:45 ===
Error in process <0.888.0> with exit value: {badarg,[{lists,member,
[<0.888.0>,empty_list],[]},{process,set_viewer_values,4,[{file,"process.erl"},{line,56}]},
{process,looper,2,[{file,"process.erl"},{line,116}]}]}
Насколько я понимаю, я даю плохие аргументы функциям lists:member. Что я должен делать?
Спасибо