diff options
| author | Matthias Radestock <matthias@rabbitmq.com> | 2014-01-01 20:17:36 +0000 |
|---|---|---|
| committer | Matthias Radestock <matthias@rabbitmq.com> | 2014-01-01 20:17:36 +0000 |
| commit | 4a6ebfd2fda6dbdbcdcde5e797b98cb688c55a1b (patch) | |
| tree | efbf11d8584bd7de8629b081e40c584408cff2d3 /src | |
| parent | 8e2b7f2c2e90fdd294b0863501b1c4eedfe58946 (diff) | |
| parent | 65d820335306e9e6a0b4593309f6ab6f94b59841 (diff) | |
| download | rabbitmq-server-git-4a6ebfd2fda6dbdbcdcde5e797b98cb688c55a1b.tar.gz | |
merge stable into bug25939
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_reader.erl | 23 |
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} -> |
