aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJanusz Dziemidowicz <rraptorr@nails.eu.org>2012-03-22 21:13:05 +0100
committerAlexey Shchepin <alexey@process-one.net>2012-07-09 17:03:33 +0300
commitefc0b0ba5aa1b532be470befa187d787f877d7c7 (patch)
treeae05ddf92a9a51b7dbbdb29bbf5aa17f16a52249 /src
parentFix 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.erl41
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.
-