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 | 7407a6c96cce7e61aaafa520ebeef607f8ace3f7 (patch) | |
| tree | f2d90c503fc6e5e752c4765120a44442628a5733 | |
| parent | 9b3d19faf258c10cc4127ceeab684139516b1e8c (diff) | |
| download | rabbitmq-server-git-7407a6c96cce7e61aaafa520ebeef607f8ace3f7.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 ddbe6bcc6b..209e5252d0 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 |
