diff options
author | Matthias Radestock <matthias@rabbitmq.com> | 2013-12-25 11:47:47 +0000 |
---|---|---|
committer | Matthias Radestock <matthias@rabbitmq.com> | 2013-12-25 11:47:47 +0000 |
commit | d9a380f75bc57ca161e967545faa737ba7734d11 (patch) | |
tree | 981b66b5a2bb4b28c1ad883db7fa826f069f641c | |
parent | 6507be92af48e66b3d9ed277438848561c025d2b (diff) | |
download | rabbitmq-server-d9a380f75bc57ca161e967545faa737ba7734d11.tar.gz |
more efficient data splitting in reader
-rw-r--r-- | src/rabbit_reader.erl | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/rabbit_reader.erl b/src/rabbit_reader.erl index 52127300..5da1d45a 100644 --- a/src/rabbit_reader.erl +++ b/src/rabbit_reader.erl @@ -285,14 +285,20 @@ recvloop(Deb, State = #v1{sock = Sock, recv_len = RecvLen, buf_len = BufLen}) 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, handle_input(State#v1.callback, Data, - State#v1{buf = [Rest], + {Data, Rest} = binlist_split(RecvLen, BufLen, Buf, []), + recvloop(Deb, handle_input(State#v1.callback, + list_to_binary(lists:reverse(Data)), + State#v1{buf = lists:reverse(Rest), 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} -> |