aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ejabberd_c2s.erl14
-rw-r--r--src/treap.erl21
2 files changed, 32 insertions, 3 deletions
diff --git a/src/ejabberd_c2s.erl b/src/ejabberd_c2s.erl
index 6df6766ca..ef4614aa2 100644
--- a/src/ejabberd_c2s.erl
+++ b/src/ejabberd_c2s.erl
@@ -1276,7 +1276,7 @@ handle_info({route, From, To, Packet}, StateName, StateData) ->
case ejabberd_hooks:run_fold(
feature_check_packet, StateData#state.server,
allow,
- [StateData#state.user,
+ [StateData#state.jid,
StateData#state.server,
StateData#state.pres_last,
{From, To, Packet},
@@ -1392,7 +1392,8 @@ terminate(_Reason, StateName, StateData) ->
presence_broadcast(
StateData, From, StateData#state.pres_i, Packet)
end
- end;
+ end,
+ bounce_messages();
_ ->
ok
end,
@@ -2185,6 +2186,15 @@ fsm_limit_opts(Opts) ->
end
end.
+bounce_messages() ->
+ receive
+ {route, From, To, El} ->
+ ejabberd_router:route(From, To, El),
+ bounce_messages()
+ after 0 ->
+ ok
+ end.
+
%%%----------------------------------------------------------------------
%%% JID Set memory footprint reduction code
%%%----------------------------------------------------------------------
diff --git a/src/treap.erl b/src/treap.erl
index 61cfe7017..a5ed9b93b 100644
--- a/src/treap.erl
+++ b/src/treap.erl
@@ -33,7 +33,9 @@
get_root/1,
lookup/2,
is_empty/1,
- fold/3]).
+ fold/3,
+ from_list/1,
+ to_list/1]).
empty() ->
nil.
@@ -173,3 +175,20 @@ fold(F, Acc, {{_Hash, Key}, Priority, Value, Left, Right}) ->
Acc1 = F({Key, Priority, Value}, Acc),
Acc2 = fold(F, Acc1, Left),
fold(F, Acc2, Right).
+
+to_list(Tree) ->
+ to_list(Tree, []).
+
+to_list(nil, Acc) ->
+ Acc;
+to_list(Tree, Acc) ->
+ Root = get_root(Tree),
+ to_list(delete_root(Tree), [Root|Acc]).
+
+from_list(List) ->
+ from_list(List, nil).
+
+from_list([{Key, Priority, Value}|Tail], Tree) ->
+ from_list(Tail, insert(Key, Priority, Value, Tree));
+from_list([], Tree) ->
+ Tree.