summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2014-01-01 20:17:36 +0000
committerMatthias Radestock <matthias@rabbitmq.com>2014-01-01 20:17:36 +0000
commit4a6ebfd2fda6dbdbcdcde5e797b98cb688c55a1b (patch)
treeefbf11d8584bd7de8629b081e40c584408cff2d3 /src
parent8e2b7f2c2e90fdd294b0863501b1c4eedfe58946 (diff)
parent65d820335306e9e6a0b4593309f6ab6f94b59841 (diff)
downloadrabbitmq-server-git-4a6ebfd2fda6dbdbcdcde5e797b98cb688c55a1b.tar.gz
merge stable into bug25939
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_reader.erl23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl
index 32b52e6e79..23150040d2 100644
--- a/src/rabbit_reader.erl
+++ b/src/rabbit_reader.erl
@@ -284,15 +284,26 @@ recvloop(Deb, State = #v1{sock = Sock, recv_len = RecvLen, buf_len = BufLen})
when BufLen < RecvLen ->
ok = rabbit_net:setopts(Sock, [{active, once}]),
mainloop(Deb, State#v1{pending_recv = true});
-recvloop(Deb, State = #v1{recv_len = RecvLen, buf = Buf, buf_len = BufLen}) ->
- {Data, Rest} = split_binary(case Buf of
- [B] -> B;
- _ -> list_to_binary(lists:reverse(Buf))
- end, RecvLen),
+recvloop(Deb, State = #v1{recv_len = RecvLen, buf_len = BufLen, buf = [B]}) ->
+ {Data, Rest} = split_binary(B, RecvLen),
recvloop(Deb, handle_input(State#v1.callback, Data,
- State#v1{buf = [Rest],
+ State#v1{buf = [Rest],
+ buf_len = BufLen - RecvLen}));
+recvloop(Deb, State = #v1{recv_len = RecvLen, buf_len = BufLen, buf = Buf}) ->
+ {DataLRev, RestLRev} = binlist_split(RecvLen, BufLen, Buf, []),
+ Data = list_to_binary(lists:reverse(DataLRev)),
+ recvloop(Deb, handle_input(State#v1.callback, Data,
+ State#v1{buf = lists:reverse(RestLRev),
buf_len = BufLen - RecvLen})).
+binlist_split(N, N, L, Acc) ->
+ {L, Acc};
+binlist_split(N, Len, L, [Acc0|Acc]) when Len < N ->
+ {H, T} = split_binary(Acc0, N - Len),
+ {[H|L], [T|Acc]};
+binlist_split(N, Len, [H|T], Acc) ->
+ binlist_split(N, Len - size(H), T, [H|Acc]).
+
mainloop(Deb, State = #v1{sock = Sock, buf = Buf, buf_len = BufLen}) ->
case rabbit_net:recv(Sock) of
{data, Data} ->