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 | efdc4896f7b14cb6a637ea8c42c813db6edbf182 (patch) | |
tree | e8a535b78c53d3dd2d146c888ce342844007e096 | |
parent | be327931a5ef997ff18c4651072a238de303d41d (diff) | |
download | rabbitmq-server-efdc4896f7b14cb6a637ea8c42c813db6edbf182.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).
-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 63b1d908..fc528b4d 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}, |