From: David Reiss Date: Mon, 30 Aug 2010 22:05:46 +0000 (+0000) Subject: erlang: Don't use a separate process for buffered_transport X-Git-Tag: 0.5.0~114 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=0127af242fecdd715bcf89d681bb876d0fa68094;p=common%2Fthrift.git erlang: Don't use a separate process for buffered_transport git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@990991 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/lib/erl/src/thrift_buffered_transport.erl b/lib/erl/src/thrift_buffered_transport.erl index 6668549c..795df39e 100644 --- a/lib/erl/src/thrift_buffered_transport.erl +++ b/lib/erl/src/thrift_buffered_transport.erl @@ -19,159 +19,51 @@ -module(thrift_buffered_transport). --behaviour(gen_server). -behaviour(thrift_transport). %% API -export([new/1, new_transport_factory/1]). -%% gen_server callbacks --export([init/1, handle_call/3, handle_cast/2, handle_info/2, - terminate/2, code_change/3]). - %% thrift_transport callbacks -export([write/2, read/2, flush/1, close/1]). -record(buffered_transport, {wrapped, % a thrift_transport write_buffer % iolist() }). --type state() :: pid(). +-type state() :: #buffered_transport{}. -include("thrift_transport_impl.hrl"). -%%==================================================================== -%% API -%%==================================================================== -%%-------------------------------------------------------------------- -%% Function: start_link() -> {ok,Pid} | ignore | {error,Error} -%% Description: Starts the server -%%-------------------------------------------------------------------- new(WrappedTransport) -> - case gen_server:start_link(?MODULE, [WrappedTransport], []) of - {ok, Pid} -> - thrift_transport:new(?MODULE, Pid); - Else -> - Else - end. - - - -%%-------------------------------------------------------------------- -%% Function: write(Transport, Data) -> ok -%% -%% Data = iolist() -%% -%% Description: Writes data into the buffer -%%-------------------------------------------------------------------- -write(Transport, Data) -> - {Transport, gen_server:call(Transport, {write, Data})}. - -%%-------------------------------------------------------------------- -%% Function: flush(Transport) -> ok -%% -%% Description: Flushes the buffer through to the wrapped transport -%%-------------------------------------------------------------------- -flush(Transport) -> - {Transport, gen_server:call(Transport, flush)}. - -%%-------------------------------------------------------------------- -%% Function: close(Transport) -> ok -%% -%% Description: Closes the transport and the wrapped transport -%%-------------------------------------------------------------------- -close(Transport) -> - {Transport, gen_server:cast(Transport, close)}. - -%%-------------------------------------------------------------------- -%% Function: Read(Transport, Len) -> {ok, Data} -%% -%% Data = binary() -%% -%% Description: Reads data through from the wrapped transoprt -%%-------------------------------------------------------------------- -read(Transport, Len) when is_integer(Len) -> - {Transport, gen_server:call(Transport, {read, Len}, _Timeout=10000)}. + State = #buffered_transport{wrapped = WrappedTransport, + write_buffer = []}, + thrift_transport:new(?MODULE, State). -%%==================================================================== -%% gen_server callbacks -%%==================================================================== -%%-------------------------------------------------------------------- -%% Function: init(Args) -> {ok, State} | -%% {ok, State, Timeout} | -%% ignore | -%% {stop, Reason} -%% Description: Initiates the server -%%-------------------------------------------------------------------- -init([Wrapped]) -> - {ok, #buffered_transport{wrapped = Wrapped, - write_buffer = []}}. +%% Writes data into the buffer +write(State = #buffered_transport{write_buffer = WBuf}, Data) -> + {State#buffered_transport{write_buffer = [WBuf, Data]}, ok}. -%%-------------------------------------------------------------------- -%% Function: %% handle_call(Request, From, State) -> {reply, Reply, State} | -%% {reply, Reply, State, Timeout} | -%% {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, Reply, State} | -%% {stop, Reason, State} -%% Description: Handling call messages -%%-------------------------------------------------------------------- -handle_call({write, Data}, _From, State = #buffered_transport{write_buffer = WBuf}) -> - {reply, ok, State#buffered_transport{write_buffer = [WBuf, Data]}}; - -handle_call({read, Len}, _From, State = #buffered_transport{wrapped = Wrapped}) -> - {NewWrapped, Response} = thrift_transport:read(Wrapped, Len), - NewState = State#buffered_transport{wrapped = NewWrapped}, - {reply, Response, NewState}; - -handle_call(flush, _From, State = #buffered_transport{write_buffer = WBuf, - wrapped = Wrapped0}) -> +%% Flushes the buffer through to the wrapped transport +flush(State = #buffered_transport{write_buffer = WBuf, + wrapped = Wrapped0}) -> {Wrapped1, Response} = thrift_transport:write(Wrapped0, WBuf), {Wrapped2, _} = thrift_transport:flush(Wrapped1), NewState = State#buffered_transport{write_buffer = [], wrapped = Wrapped2}, - {reply, Response, NewState}. - -%%-------------------------------------------------------------------- -%% Function: handle_cast(Msg, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% Description: Handling cast messages -%%-------------------------------------------------------------------- -handle_cast(close, State = #buffered_transport{write_buffer = WBuf, - wrapped = Wrapped}) -> - %% Wrapped is closed by terminate/2 - %% error_logger:info_msg("thrift_buffered_transport ~p: closing", [self()]), - {stop, normal, State}; -handle_cast(Msg, State=#buffered_transport{}) -> - {noreply, State}. - -%%-------------------------------------------------------------------- -%% Function: handle_info(Info, State) -> {noreply, State} | -%% {noreply, State, Timeout} | -%% {stop, Reason, State} -%% Description: Handling all non call/cast messages -%%-------------------------------------------------------------------- -handle_info(_Info, State) -> - {noreply, State}. - -%%-------------------------------------------------------------------- -%% Function: terminate(Reason, State) -> void() -%% Description: This function is called by a gen_server when it is about to -%% terminate. It should be the opposite of Module:init/1 and do any necessary -%% cleaning up. When it returns, the gen_server terminates with Reason. -%% The return value is ignored. -%%-------------------------------------------------------------------- -terminate(_Reason, State = #buffered_transport{wrapped=Wrapped}) -> - thrift_transport:close(Wrapped), - ok. - -%%-------------------------------------------------------------------- -%% Func: code_change(OldVsn, State, Extra) -> {ok, NewState} -%% Description: Convert process state when code is changed -%%-------------------------------------------------------------------- -code_change(_OldVsn, State, _Extra) -> - {ok, State}. + {NewState, Response}. + +%% Closes the transport and the wrapped transport +close(State = #buffered_transport{wrapped = Wrapped0}) -> + {Wrapped1, Result} = thrift_transport:close(Wrapped0), + NewState = State#buffered_transport{wrapped = Wrapped1}, + {NewState, Result}. + +%% Reads data through from the wrapped transoprt +read(State = #buffered_transport{wrapped = Wrapped0}, Len) when is_integer(Len) -> + {Wrapped1, Response} = thrift_transport:read(Wrapped0, Len), + NewState = State#buffered_transport{wrapped = Wrapped1}, + {NewState, Response}. %%-------------------------------------------------------------------- %%% Internal functions