From efc0b0ba5aa1b532be470befa187d787f877d7c7 Mon Sep 17 00:00:00 2001 From: Janusz Dziemidowicz Date: Thu, 22 Mar 2012 21:13:05 +0100 Subject: Reduce size of XML stream state This makes size of hibernated ejabberd_receiver a lot smaller (from ~290 words down to ~40). --- src/xml_stream.erl | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) (limited to 'src') diff --git a/src/xml_stream.erl b/src/xml_stream.erl index 2e0547ead..891dd9ea5 100644 --- a/src/xml_stream.erl +++ b/src/xml_stream.erl @@ -49,33 +49,33 @@ process_data(CallbackPid, Stack, Data) -> if Stack == [] -> catch gen_fsm:send_event(CallbackPid, - {xmlstreamstart, Name, Attrs}); + {xmlstreamstart, Name, Attrs}), + %% There is no need to store name or attributes of + %% stream opening element as it is not used + %% anymore. + [xmlstreamstart]; true -> - ok - end, - [{xmlelement, Name, Attrs, []} | Stack]; + [{xmlelement, Name, Attrs, []} | Stack] + end; {?XML_END, EndName} -> case Stack of - [{xmlelement, Name, Attrs, Els} | Tail] -> + [xmlstreamstart] -> + catch gen_fsm:send_event(CallbackPid, + {xmlstreamend, EndName}), + []; + [{xmlelement, Name, Attrs, Els}, xmlstreamstart] -> NewEl = {xmlelement, Name, Attrs, lists:reverse(Els)}, - case Tail of - [] -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamend, EndName}), - Tail; - [_] -> - catch gen_fsm:send_event(CallbackPid, - {xmlstreamelement, NewEl}), - Tail; - [{xmlelement, Name1, Attrs1, Els1} | Tail1] -> - [{xmlelement, Name1, Attrs1, [NewEl | Els1]} | - Tail1] - end + catch gen_fsm:send_event(CallbackPid, + {xmlstreamelement, NewEl}), + [xmlstreamstart]; + [{xmlelement, Name, Attrs, Els}, {xmlelement, Name1, Attrs1, Els1} | Tail] -> + NewEl = {xmlelement, Name, Attrs, lists:reverse(Els)}, + [{xmlelement, Name1, Attrs1, [NewEl | Els1]} | Tail] end; {?XML_CDATA, CData} -> case Stack of - [El] -> - [El]; + [xmlstreamstart] -> + [xmlstreamstart]; %% Merge CDATA nodes if they are contiguous %% This does not change the semantic: the split in %% several CDATA nodes depends on the TCP/IP packet @@ -187,4 +187,3 @@ process_element_events([Event | Events], Stack) -> {?XML_ERROR, Err} -> {error, Err} end. - -- cgit v1.2.3