Skip to content

Instantly share code, notes, and snippets.

@davisp
Created April 2, 2012 23:45
Show Gist options
  • Select an option

  • Save davisp/2288078 to your computer and use it in GitHub Desktop.

Select an option

Save davisp/2288078 to your computer and use it in GitHub Desktop.
+wait_loop(Parent, Timeout, State) ->
% State transitions
% unset -> (updated | timeout | waiting)
% updated -> (updated | unset)
% timeout -> (unset | updated)
% waiting -> unset
receive
db_updated when State == waiting ->
Parent ! updated,
wait_loop(Parent, Timeout, unset);
db_updated when State == unset orelse State == updated ->
wait_loop(Parent, Timeout, updated);
get_state when State == unset ->
wait_loop(Parent, Timeout, waiting);
get_state ->
Parent ! State,
wait_loop(Parent, Timeout, unset);
done ->
ok
after Timeout ->
case State of
waiting ->
Parent ! timeout;
unset ->
wait_loop(Parent, Timeout, timeout)
end
end.
@davisp
Copy link
Copy Markdown
Author

davisp commented Apr 6, 2012

I don't think you want that drain in there. The point of looping through the db updated messages is so that your mail box should never have a backlog so there shouldn't be anything to drain.

As to the Timeout clause, there should be no timeout state. That changse the behavior of the keep sending changes loop because its possible to timeout directly after you finish an update. The timeout should only be triggered after the get_state message as waited for Timeout seconds, not if there was more than Timeout seconds before the get_state message with no db_updated message. Its slight and subtle, but I bet it'd at least break tests.

@bdionne
Copy link
Copy Markdown

bdionne commented Apr 6, 2012

Agree about the timeout (typo there), not sure I agree about the drain but I'll defer to your judgement there. Let me push a PR so we can get more eyeballs on it

cloudant/fabric@cca4750

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment