diff options
author | Janusz Dziemidowicz <rraptorr@nails.eu.org> | 2012-03-22 21:13:05 +0100 |
---|---|---|
committer | Alexey Shchepin <alexey@process-one.net> | 2012-07-09 17:03:33 +0300 |
commit | efc0b0ba5aa1b532be470befa187d787f877d7c7 (patch) | |
tree | ae05ddf92a9a51b7dbbdb29bbf5aa17f16a52249 /src | |
parent | Fix file name of Name Service Switch (thanks to Konstantin Khomoutov) (diff) |
Reduce size of XML stream state
This makes size of hibernated ejabberd_receiver a lot smaller (from
~290 words down to ~40).
Diffstat (limited to 'src')
-rw-r--r-- | src/xml_stream.erl | 41 |
1 files changed, 20 insertions, 21 deletions
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. - |