summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@lshift.net>2009-08-03 17:04:04 +0100
committerMatthew Sackman <matthew@lshift.net>2009-08-03 17:04:04 +0100
commit7723b5d4340fb6a9978ec7b306bc0d19a58a0ae5 (patch)
treee8a535b78c53d3dd2d146c888ce342844007e096 /src
parentcf714a38b3f36fb9be07ba1d909c5b8db6ab4c50 (diff)
downloadrabbitmq-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.erl15
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},