diff options
author | Matthias Radestock <matthias@rabbitmq.com> | 2011-03-29 19:17:57 +0100 |
---|---|---|
committer | Matthias Radestock <matthias@rabbitmq.com> | 2011-03-29 19:17:57 +0100 |
commit | 02e0065a00a7e131a6293de2a4d843b2e8367c05 (patch) | |
tree | 8c8af135516c28f08c4aff1d9ed6ac3797cf08ff /src/rabbit_binding.erl | |
parent | 0c42f486246b1d1b43c44015172682be589128a1 (diff) | |
download | rabbitmq-server-02e0065a00a7e131a6293de2a4d843b2e8367c05.tar.gz |
shrinkage: one dict is better than two
Diffstat (limited to 'src/rabbit_binding.erl')
-rw-r--r-- | src/rabbit_binding.erl | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl index 204be5f6..d1e6f220 100644 --- a/src/rabbit_binding.erl +++ b/src/rabbit_binding.erl @@ -407,38 +407,28 @@ merge_entry({X1, Deleted1, Bindings1}, {X2, Deleted2, Bindings2}) -> [Bindings1 | Bindings2]}. process_deletions(Deletions) -> - Serials = dict:fold( - fun (XName, {X, Deleted, Bindings}, Acc) -> - FlatBindings = lists:flatten(Bindings), - pd_callback(transaction, X, Deleted, FlatBindings), - case Deleted of - deleted -> Acc; - not_deleted -> dict:store(XName, - rabbit_exchange:serial(X), - Acc) - end - end, dict:new(), Deletions), + AugmentedDeletions = + dict:map(fun (_XName, {X, deleted, Bindings}) -> + Bs = lists:flatten(Bindings), + pd_callback(transaction, X, delete, Bs), + {X, deleted, Bs, none}; + (_XName, {X, not_deleted, Bindings}) -> + Bs = lists:flatten(Bindings), + pd_callback(transaction, X, remove_bindings, Bs), + {X, not_deleted, Bs, rabbit_exchange:serial(X)} + end, Deletions), fun() -> - dict:fold( - fun (XName, {X, Deleted, Bindings}, ok) -> - FlatBindings = lists:flatten(Bindings), - Serial = case Deleted of - deleted -> none; - not_deleted -> dict:fetch(XName, Serials) - end, - pd_callback(Serial, X, Deleted, FlatBindings), - [rabbit_event:notify(binding_deleted, info(B)) || - B <- FlatBindings], - case Deleted of - deleted -> ok = rabbit_event:notify( - exchange_deleted, [{name, XName}]); - _ -> ok - end - end, ok, Deletions) + dict:fold(fun (XName, {X, deleted, Bs, Serial}, ok) -> + ok = rabbit_event:notify( + exchange_deleted, [{name, XName}]), + del_notify(Bs), + pd_callback(Serial, X, delete, Bs); + (_XName, {X, not_deleted, Bs, Serial}, ok) -> + del_notify(Bs), + pd_callback(Serial, X, remove_bindings, Bs) + end, ok, AugmentedDeletions) end. -pd_callback(Arg, X, Deleted, Bindings) -> - ok = rabbit_exchange:callback(X, case Deleted of - not_deleted -> remove_bindings; - deleted -> delete - end, [Arg, X, Bindings]). +del_notify(Bs) -> [rabbit_event:notify(binding_deleted, info(B)) || B <- Bs]. + +pd_callback(Arg, X, F, Bs) -> ok = rabbit_exchange:callback(X, F, [Arg, X, Bs]). |