]> granicus.if.org Git - ejabberd/commitdiff
Reduce size of XML stream state
authorJanusz Dziemidowicz <rraptorr@nails.eu.org>
Thu, 22 Mar 2012 20:13:05 +0000 (21:13 +0100)
committerAlexey Shchepin <alexey@process-one.net>
Mon, 9 Jul 2012 14:03:33 +0000 (17:03 +0300)
This makes size of hibernated ejabberd_receiver a lot smaller (from
~290 words down to ~40).

src/xml_stream.erl

index 2e0547ead2d6ec22b8c6caa3f653340a0a331e1c..891dd9ea57eef395f55b4a83284971d4fe7890fc 100644 (file)
@@ -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.
-