You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by dr...@apache.org on 2008/06/11 03:03:45 UTC

svn commit: r666462 - /incubator/thrift/trunk/lib/alterl/src/thrift_socket_transport.erl

Author: dreiss
Date: Tue Jun 10 18:03:44 2008
New Revision: 666462

URL: http://svn.apache.org/viewvc?rev=666462&view=rev
Log:
Parse options to thrift_socket_transport:new_protocol_factory/3 "manually" - O(n) instead of O(n^2)

Modified:
    incubator/thrift/trunk/lib/alterl/src/thrift_socket_transport.erl

Modified: incubator/thrift/trunk/lib/alterl/src/thrift_socket_transport.erl
URL: http://svn.apache.org/viewvc/incubator/thrift/trunk/lib/alterl/src/thrift_socket_transport.erl?rev=666462&r1=666461&r2=666462&view=diff
==============================================================================
--- incubator/thrift/trunk/lib/alterl/src/thrift_socket_transport.erl (original)
+++ incubator/thrift/trunk/lib/alterl/src/thrift_socket_transport.erl Tue Jun 10 18:03:44 2008
@@ -49,35 +49,57 @@
 
 %%%% FACTORY GENERATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+
+%% The following "local" record is filled in by parse_factory_options/2
+%% below. These options can be passed to new_protocol_factory/3 in a
+%% proplists-style option list. They're parsed like this so it is an O(n)
+%% operation instead of O(n^2)
+-record(factory_opts, {connect_timeout = infinity,
+                       sockopts = [],
+                       framed = false,
+                       strict_read = true,
+                       strict_write = true}).
+
+parse_factory_options([], Opts) ->
+    Opts;
+parse_factory_options([{strict_read, Bool} | Rest], Opts) when is_boolean(Bool) ->
+    parse_factory_options(Rest, Opts#factory_opts{strict_read=Bool});
+parse_factory_options([{strict_write, Bool} | Rest], Opts) when is_boolean(Bool) ->
+    parse_factory_options(Rest, Opts#factory_opts{strict_write=Bool});
+parse_factory_options([{framed, Bool} | Rest], Opts) when is_boolean(Bool) ->
+    parse_factory_options(Rest, Opts#factory_opts{framed=Bool});
+parse_factory_options([{sockopts, OptList} | Rest], Opts) when is_list(OptList) ->
+    parse_factory_options(Rest, Opts#factory_opts{sockopts=OptList});
+parse_factory_options([{connect_timeout, TO} | Rest], Opts) when TO =:= infinity; is_integer(TO) ->
+    parse_factory_options(Rest, Opts#factory_opts{connect_timeout=TO}).
+
 %%
 %% Generates a "protocol factory" function - a fun which returns a Protocol instance.
 %% This can be passed to thrift_client:start_link in order to connect to a
 %% server over a socket.
 %%
 new_protocol_factory(Host, Port, Options) ->
-    ConnectTimeout = proplists:get_value(connect_timeout, Options, infinity),
-    InSockOpts     = proplists:get_value(sockopts, Options, []),
-    Framed         = proplists:get_value(framed, Options, false),
-    StrictRead     = proplists:get_value(strict_read, Options, true),
-    StrictWrite    = proplists:get_value(strict_write, Options, true),
+    ParsedOpts = parse_factory_options(Options, #factory_opts{}),
 
     F = fun() ->
                 SockOpts = [binary,
                             {packet, 0},
                             {active, false},
                             {nodelay, true} |
-                            InSockOpts],
-                case catch gen_tcp:connect(Host, Port, SockOpts, ConnectTimeout) of
+                            ParsedOpts#factory_opts.sockopts],
+                case catch gen_tcp:connect(Host, Port, SockOpts,
+                                           ParsedOpts#factory_opts.connect_timeout) of
                     {ok, Sock} ->
                         {ok, Transport} = thrift_socket_transport:new(Sock),
                         {ok, BufTransport} =
-                            case Framed of
+                            case ParsedOpts#factory_opts.framed of
                                 true  -> thrift_framed_transport:new(Transport);
                                 false -> thrift_buffered_transport:new(Transport)
                             end,
-                        thrift_binary_protocol:new(BufTransport,
-                                                   [{strict_read,  StrictRead},
-                                                    {strict_write, StrictWrite}]);
+                        thrift_binary_protocol:new(
+                          BufTransport,
+                          [{strict_read,  ParsedOpts#factory_opts.strict_read},
+                           {strict_write, ParsedOpts#factory_opts.strict_write}]);
                     Error  ->
                         Error
                 end