diff options
| author | Matthew Sackman <matthew@lshift.net> | 2009-08-03 17:04:04 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@lshift.net> | 2009-08-03 17:04:04 +0100 |
| commit | 7723b5d4340fb6a9978ec7b306bc0d19a58a0ae5 (patch) | |
| tree | e8a535b78c53d3dd2d146c888ce342844007e096 /src | |
| parent | cf714a38b3f36fb9be07ba1d909c5b8db6ab4c50 (diff) | |
| download | rabbitmq-server-git-7723b5d4340fb6a9978ec7b306bc0d19a58a0ae5.tar.gz | |
The bug was not as advertised (it actually popped up when merging into 20980). However, we should definitely make sure we receive at least 1 msg when coming out of hibernate, and in loop we don't care too much. Also, use now() to seed the rng as erlang doesn't do it for you (rng state is implicitly per process).
Diffstat (limited to 'src')
| -rw-r--r-- | src/gen_server2.erl | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/gen_server2.erl b/src/gen_server2.erl index 63b1d908e4..fc528b4df7 100644 --- a/src/gen_server2.erl +++ b/src/gen_server2.erl @@ -436,6 +436,7 @@ unregister_name(Pid) when is_pid(Pid) -> extend_backoff(Mod, {backoff, CurrentTO, MinimumTimeout, DesiredHibPeriod}) -> Pre = erlang:function_exported(Mod, handle_pre_hibernate, 1), Post = erlang:function_exported(Mod, handle_post_hibernate, 1), + random:seed(now()), %% call before we get into the loop {backoff, CurrentTO, MinimumTimeout, DesiredHibPeriod, Pre, Post}. %%%======================================================================== @@ -449,11 +450,15 @@ loop(Parent, Name, State, Mod, hibernate, undefined, Queue, Debug) -> [Parent, Name, State, Mod, undefined, Queue, Debug]); loop(Parent, Name, State, Mod, Time, TimeoutState, Queue, Debug) -> process_next_msg(Parent, Name, State, Mod, Time, TimeoutState, - drain(Queue), Debug). + drain(Queue, false), Debug). -drain(Queue) -> +drain(Queue, true) -> receive - Input -> drain(in(Input,Queue)) + Input -> drain(in(Input, Queue), false) + end; +drain(Queue, false) -> + receive + Input -> drain(in(Input, Queue), false) after 0 -> Queue end. @@ -490,11 +495,11 @@ process_next_msg(Parent, Name, State, Mod, Time, TimeoutState, Queue, Debug) -> wake_hib(Parent, Name, State, Mod, TimeoutState, Queue, Debug) -> process_next_msg(Parent, Name, State, Mod, hibernate, TimeoutState, - drain(Queue), Debug). + drain(Queue, true), Debug). wake_hib(Parent, Name, State, Mod, SleptAt, TimeoutState, Queue, Debug) -> backoff_post_hibernate(Parent, Name, State, Mod, SleptAt, now(), - TimeoutState, drain(Queue), Debug). + TimeoutState, drain(Queue, true), Debug). backoff_pre_hibernate(Parent, Name, State, Mod, TimeoutState = {backoff, _Current, _Minimum, _Desired, Pre, _Post}, |
