0
votes

I have a function that sets a value to a process Pid and I can have a process depend on another one. So if I set a value to a process then I have to also set the value to the processes that depend on it. However, if there is a circle between the processes

i.e. A depends on B and B depends on A 

then I want to return an error message.

I try to do this by passing a list of Pids which have already changed values so that if I come across the same Pid twice (By checking if it is a member of the list of Pids) then the whole function stops. This is my code:

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.

When I run it, I get this error:

=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}]}]}

From what I understand I give bad arguments to lists:member function. What should I do?

Thanks

1

1 Answers

2
votes

If you read your error message, you have {lists,member, [<0.888.0>,empty_list] ..., where lists is module, member is function name, and [<0.888.0>,empty_list] are aruguments (two) presented as list. So you are making call to lists:nenber/2 with PidList variable being atom empty_list. And this gives you an error.

So you need to look into how you funciton is being called (prefered), or create some pattern match on PidList like

set_values(Pid, Value, PidSet, _PidList = empty_list) ->
   ...