diff options
author | Francesco Mazzoli <francesco@rabbitmq.com> | 2012-04-23 16:51:06 +0100 |
---|---|---|
committer | Francesco Mazzoli <francesco@rabbitmq.com> | 2012-04-23 16:51:06 +0100 |
commit | 5a19e94645c5a4918900dfd170f341d23a3c7135 (patch) | |
tree | f2d90c503fc6e5e752c4765120a44442628a5733 | |
parent | 33bfcb5917fcc8bddf2b899001a2afbe5e07df33 (diff) | |
download | rabbitmq-server-5a19e94645c5a4918900dfd170f341d23a3c7135.tar.gz |
Make rabbit_variable_queue:dropwhile tail recursive
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/rabbit_variable_queue.erl | 11 |
2 files changed, 7 insertions, 6 deletions
@@ -207,7 +207,7 @@ start-background-node: all -rm -f $(RABBITMQ_MNESIA_DIR).pid mkdir -p $(RABBITMQ_MNESIA_DIR) setsid sh -c "$(MAKE) run-background-node > $(RABBITMQ_MNESIA_DIR)/startup_log 2> $(RABBITMQ_MNESIA_DIR)/startup_err" & - sleep 1 + sleep 3 start-rabbit-on-node: all echo "rabbit:start()." | $(ERL_CALL) diff --git a/src/rabbit_variable_queue.erl b/src/rabbit_variable_queue.erl index ddbe6bcc..209e5252 100644 --- a/src/rabbit_variable_queue.erl +++ b/src/rabbit_variable_queue.erl @@ -578,8 +578,10 @@ drain_confirmed(State = #vqstate { confirmed = C }) -> confirmed = gb_sets:new() }} end. -dropwhile(Pred, AckRequired, State) -> - End = fun(S) when AckRequired -> {[], S}; +dropwhile(Pred, AckRequired, State) -> dropwhile(Pred, AckRequired, State, []). + +dropwhile(Pred, AckRequired, State, Msgs) -> + End = fun(S) when AckRequired -> {lists:reverse(Msgs), S}; (S) -> {undefined, S} end, case queue_out(State) of @@ -591,11 +593,10 @@ dropwhile(Pred, AckRequired, State) -> {MsgStatus1, State2} = read_msg(MsgStatus, State1), {{Msg, _, AckTag, _}, State3} = internal_fetch(true, MsgStatus1, State2), - {L, State4} = dropwhile(Pred, AckRequired, State3), - {[{Msg, AckTag} | L], State4}; + dropwhile(Pred, AckRequired, State3, [{Msg, AckTag} | Msgs]); {true, false} -> {_, State2} = internal_fetch(false, MsgStatus, State1), - dropwhile(Pred, AckRequired, State2); + dropwhile(Pred, AckRequired, State2, undefined); {false, _} -> End(a(in_r(MsgStatus, State1))) end |