diff options
| author | Simon MacMullen <simon@rabbitmq.com> | 2012-01-12 11:36:23 +0000 |
|---|---|---|
| committer | Simon MacMullen <simon@rabbitmq.com> | 2012-01-12 11:36:23 +0000 |
| commit | f3008fd7104c6b08b886e32a1b21f202b6ad1080 (patch) | |
| tree | bfe7c41cd03d6a1f1f24952c510c8b040e553294 /src | |
| parent | 444fbf98c6903efc8db00b166406acb3d622972f (diff) | |
| download | rabbitmq-server-git-f3008fd7104c6b08b886e32a1b21f202b6ad1080.tar.gz | |
Refactor / tidy, and sneakily fix an off-by-one error (ahem).
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_flow.erl | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/src/rabbit_flow.erl b/src/rabbit_flow.erl index ea1260036c..b2ccb05e1d 100644 --- a/src/rabbit_flow.erl +++ b/src/rabbit_flow.erl @@ -16,8 +16,8 @@ -module(rabbit_flow). --define(MAX_CREDIT, 100). --define(MORE_CREDIT_AT, 50). +-define(MAX_CREDIT, 2). +-define(MORE_CREDIT_AT, 1). -export([ack/1, bump/1, blocked/0, send/1]). @@ -31,8 +31,7 @@ ack(To) -> Credit = - case get({credit_to, To}) of - undefined -> ?MAX_CREDIT; + case get({credit_to, To}, ?MAX_CREDIT) of ?MORE_CREDIT_AT + 1 -> grant(To, ?MAX_CREDIT - ?MORE_CREDIT_AT), ?MAX_CREDIT; C -> C - 1 @@ -40,10 +39,7 @@ ack(To) -> put({credit_to, To}, Credit). bump({From, MoreCredit}) -> - Credit = case get({credit_from, From}) of - undefined -> MoreCredit; - C -> C + MoreCredit - end, + Credit = get({credit_from, From}, 0) + MoreCredit, put({credit_from, From}, Credit), case Credit > 0 of true -> unblock(), @@ -56,10 +52,7 @@ blocked() -> get(credit_blocked) =:= true. send(From) -> - Credit = case get({credit_from, From}) of - undefined -> ?MAX_CREDIT; - C -> C - end - 1, + Credit = get({credit_from, From}, ?MAX_CREDIT) - 1, case Credit of 0 -> put(credit_blocked, true); _ -> ok @@ -72,17 +65,17 @@ grant(To, Quantity) -> Msg = {bump_credit, {self(), Quantity}}, case blocked() of false -> To ! Msg; - true -> Deferred = case get(credit_deferred) of - undefined -> []; - L -> L - end, + true -> Deferred = get(credit_deferred, []), put(credit_deferred, [{To, Msg} | Deferred]) end. unblock() -> erase(credit_blocked), - case get(credit_deferred) of - undefined -> ok; - Deferred -> [To ! Msg || {To, Msg} <- Deferred], - erase(credit_deferred) + [To ! Msg || {To, Msg} <- get(credit_deferred, [])], + erase(credit_deferred). + +get(Key, Default) -> + case get(Key) of + undefined -> Default; + Value -> Value end. |
