Connector.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=============================================================================
00004 /**
00005  *  @file    Connector.h
00006  *
00007  *  Connector.h,v 4.65 2006/02/24 17:25:11 shuston Exp
00008  *
00009  *  @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
00010  */
00011 //=============================================================================
00012 
00013 #ifndef ACE_CONNECTOR_H
00014 #define ACE_CONNECTOR_H
00015 
00016 #include /**/ "ace/pre.h"
00017 
00018 #include "ace/Service_Object.h"
00019 
00020 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00021 # pragma once
00022 #endif /* ACE_LACKS_PRAGMA_ONCE */
00023 
00024 #include "ace/Strategies_T.h"
00025 #include "ace/Synch_Options.h"
00026 #include "ace/Unbounded_Set.h"
00027 
00028 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00029 
00030 /**
00031  * @class ACE_Connector_Base
00032  *
00033  * @brief This base interface allows ACE_NonBlocking_Connect_Handler
00034  * to only care about the SVC_HANDLER template parameter of the
00035  * ACE_Connector.  Otherwise, ACE_NonBlocking_Connect_Handler would
00036  * have to be configured with all the template parameters that
00037  * ACE_Connector is configured with.
00038  */
00039 template <class SVC_HANDLER>
00040 class ACE_Connector_Base
00041 {
00042 public:
00043 
00044   virtual ~ACE_Connector_Base (void) {}
00045 
00046   /// Initialize the Svc_Handler.
00047   virtual void initialize_svc_handler (ACE_HANDLE handle,
00048                                        SVC_HANDLER *svc_handler) = 0;
00049 
00050   /// Return the handle set representing the non-blocking connects in
00051   /// progress.
00052   virtual ACE_Unbounded_Set<ACE_HANDLE> &non_blocking_handles (void) = 0;
00053 };
00054 
00055 /**
00056  * @class ACE_NonBlocking_Connect_Handler
00057  *
00058  * @brief Performs non-blocking connects on behalf of the Connector.
00059  */
00060 template <class SVC_HANDLER>
00061 class ACE_NonBlocking_Connect_Handler : public ACE_Event_Handler
00062 {
00063 public:
00064 
00065   // Constructor.
00066   ACE_NonBlocking_Connect_Handler (ACE_Connector_Base<SVC_HANDLER> &connector,
00067                                    SVC_HANDLER *,
00068                                    long timer_id);
00069 
00070   /// Close up and return underlying SVC_HANDLER through @c sh.
00071   /**
00072    * If the return value is true the close was performed succesfully,
00073    * implying that this object was removed from the reactor and thereby
00074    * (by means of reference counting decremented to 0) deleted.
00075    * If the return value is false, the close was not successful.
00076    * The @c sh does not have any connection to the return
00077    * value. The argument will return a valid svc_handler object if a
00078    * valid one exists within the object. Returning a valid svc_handler
00079    * pointer also invalidates the svc_handler contained in this
00080    * object.
00081    */
00082   bool close (SVC_HANDLER *&sh);
00083 
00084   /// Get SVC_HANDLER.
00085   SVC_HANDLER *svc_handler (void);
00086 
00087   // = Get/set handle.
00088   /// Get handle.
00089   ACE_HANDLE handle (void);
00090 
00091   /// Set handle.
00092   void handle (ACE_HANDLE);
00093 
00094   // = Set/get timer id.
00095   /// Get timer id.
00096   long timer_id (void);
00097 
00098   /// Set timer id.
00099   void timer_id (long timer_id);
00100 
00101   /// Called by ACE_Reactor when asynchronous connections fail.
00102   virtual int handle_input (ACE_HANDLE);
00103 
00104   /// Called by ACE_Reactor when asynchronous connections succeed.
00105   virtual int handle_output (ACE_HANDLE);
00106 
00107   /// Called by ACE_Reactor when asynchronous connections suceeds (on
00108   /// some platforms only).
00109   virtual int handle_exception (ACE_HANDLE fd);
00110 
00111   /// This method is called if a connection times out before
00112   /// completing.
00113   virtual int handle_timeout (const ACE_Time_Value &tv,
00114                               const void *arg);
00115 
00116   /// Should Reactor resume us if we have been suspended before the
00117   /// upcall?
00118   virtual int resume_handler (void);
00119 
00120   /// Dump the state of an object.
00121   void dump (void) const;
00122 
00123   /// Declare the dynamic allocation hooks.
00124   ACE_ALLOC_HOOK_DECLARE;
00125 
00126 private:
00127 
00128   /// Connector base.
00129   ACE_Connector_Base<SVC_HANDLER> &connector_;
00130 
00131   /// Associated SVC_HANDLER.
00132   SVC_HANDLER *svc_handler_;
00133 
00134   /// Associated timer id.
00135   long timer_id_;
00136 };
00137 
00138 /**
00139  * @class ACE_Connector
00140  *
00141  * @brief Generic factory for actively connecting clients and creating
00142  * service handlers (SVC_HANDLERs).
00143  *
00144  * Implements the strategy for actively establishing connections with
00145  * clients.  An ACE_Connector is parameterized by concrete types that
00146  * conform to the interfaces of PEER_CONNECTOR and SVC_HANDLER.  The
00147  * PEER_CONNECTOR is instantiated with a transport mechanism that
00148  * actively establishes connections.  The SVC_HANDLER is instantiated
00149  * with a concrete type that performs the application-specific
00150  * service.  Both blocking and non-blocking connects are supported.
00151  * Further, non-blocking connects support timeouts.
00152  */
00153 template <class SVC_HANDLER, ACE_PEER_CONNECTOR_1>
00154 class ACE_Connector : public ACE_Connector_Base<SVC_HANDLER>, public ACE_Service_Object
00155 {
00156 public:
00157 
00158   // Useful STL-style traits.
00159   typedef ACE_TYPENAME SVC_HANDLER::addr_type    addr_type;
00160   typedef ACE_PEER_CONNECTOR                     connector_type;
00161   typedef SVC_HANDLER                            handler_type;
00162   typedef ACE_TYPENAME SVC_HANDLER::stream_type  stream_type;
00163 
00164   // typedef ACE_TYPENAME ACE_PEER_CONNECTOR_ADDR PEER_ADDR;
00165 #if defined (ACE_HAS_TYPENAME_KEYWORD)
00166   typedef ACE_PEER_CONNECTOR_ADDR ACE_PEER_ADDR_TYPEDEF;
00167 #endif /* ACE_HAS_TYPENAME_KEYWORD */
00168 
00169   typedef ACE_TYPENAME _ACE_PEER_CONNECTOR::PEER_ADDR
00170   ACE_TYPENAME_ACE_PEER_CONNECTOR_PEER_ADDR;
00171 
00172   /**
00173    * Initialize a connector.  @a flags indicates how <SVC_HANDLER>'s
00174    * should be initialized prior to being activated.  Right now, the
00175    * only flag that is processed is ACE_NONBLOCK, which enabled
00176    * non-blocking I/O on the <SVC_HANDLER> when it is opened.
00177    */
00178   ACE_Connector (ACE_Reactor *r = ACE_Reactor::instance (),
00179                  int flags = 0);
00180 
00181   /**
00182    * Initialize a connector.  @a flags indicates how <SVC_HANDLER>'s
00183    * should be initialized prior to being activated.  Right now, the
00184    * only flag that is processed is ACE_NONBLOCK, which enabled
00185    * non-blocking I/O on the <SVC_HANDLER> when it is opened.
00186    */
00187   virtual int open (ACE_Reactor *r = ACE_Reactor::instance (),
00188                     int flags = 0);
00189 
00190   /// Shutdown a connector and release resources.
00191   virtual ~ACE_Connector (void);
00192 
00193   // = Connection establishment methods.
00194 
00195   /**
00196    * Initiate connection of <svc_handler> to peer at <remote_addr>
00197    * using <synch_options>.  If the caller wants to designate the
00198    * selected <local_addr> they can (and can also insist that the
00199    * <local_addr> be reused by passing a value <reuse_addr> ==
00200    * 1). @a flags and <perms> can be used to pass any flags that are
00201    * needed to perform specific operations such as opening a file
00202    * within connect with certain permissions.  If the connection fails
00203    * the <close> hook on the <svc_handler> will be called
00204    * automatically to prevent resource leaks.
00205    */
00206   virtual int connect (SVC_HANDLER *&svc_handler,
00207                        const ACE_PEER_CONNECTOR_ADDR &remote_addr,
00208                        const ACE_Synch_Options &synch_options = ACE_Synch_Options::defaults,
00209                        const ACE_PEER_CONNECTOR_ADDR &local_addr
00210                        = (ACE_TYPENAME_ACE_PEER_CONNECTOR_PEER_ADDR &) ACE_PEER_CONNECTOR_ADDR_ANY,
00211                        int reuse_addr = 0,
00212                        int flags = O_RDWR,
00213                        int perms = 0);
00214 
00215   /**
00216    * This is a variation on the previous <connect> method.  On cached
00217    * connectors the <svc_handler_hint> variable can be used as a hint
00218    * for future lookups.  Since this variable is modified in the
00219    * context of the internal cache its use is thread-safe.  But the
00220    * actual svc_handler for the current connection is returned in the
00221    * second parameter <svc_handler>.  If the connection fails the
00222    * <close> hook on the <svc_handler> will be called automatically to
00223    * prevent resource leaks.
00224    */
00225   virtual int connect (SVC_HANDLER *&svc_handler_hint,
00226                        SVC_HANDLER *&svc_handler,
00227                        const ACE_PEER_CONNECTOR_ADDR &remote_addr,
00228                        const ACE_Synch_Options &synch_options = ACE_Synch_Options::defaults,
00229                        const ACE_PEER_CONNECTOR_ADDR &local_addr
00230                        = (ACE_TYPENAME_ACE_PEER_CONNECTOR_PEER_ADDR &) ACE_PEER_CONNECTOR_ADDR_ANY,
00231                        int reuse_addr = 0,
00232                        int flags = O_RDWR,
00233                        int perms = 0);
00234 
00235   /**
00236    * Initiate connection of <n> <svc_handlers> to peers at
00237    * <remote_addrs> using <synch_options>.  Returns -1 if failure
00238    * occurs and 0 otherwise.  If <failed_svc_handlers> is non-NULL, a
00239    * 1 is placed in the corresponding index of <failed_svc_handler>
00240    * for each <svc_handlers[i]> that failed to connect, else a 0 is
00241    * placed in that index.
00242    */
00243   virtual int connect_n (size_t n,
00244                          SVC_HANDLER *svc_handlers[],
00245                          ACE_PEER_CONNECTOR_ADDR remote_addrs[],
00246                          ACE_TCHAR *failed_svc_handlers = 0,
00247                          const ACE_Synch_Options &synch_options =
00248                          ACE_Synch_Options::defaults);
00249 
00250   /**
00251    * Cancel a <svc_handler> that was started asynchronously. Note that
00252    * this is the only case when the Connector does not actively close
00253    * the <svc_handler>. It is left up to the caller of <cancel> to
00254    * decide the fate of the <svc_handler>.
00255    */
00256   virtual int cancel (SVC_HANDLER *svc_handler);
00257 
00258   /// Close down the Connector.  All pending non-blocking connects are
00259   /// canceled and the corresponding svc_handler is closed.
00260   virtual int close (void);
00261 
00262   /// Return the underlying PEER_CONNECTOR object.
00263   virtual ACE_PEER_CONNECTOR &connector (void) const;
00264 
00265   /// Initialize Svc_Handler.
00266   virtual void initialize_svc_handler (ACE_HANDLE handle,
00267                                        SVC_HANDLER *svc_handler);
00268 
00269   /// Set Reactor.
00270   virtual void reactor (ACE_Reactor *reactor);
00271 
00272   /// Get Reactor.
00273   virtual ACE_Reactor *reactor (void) const;
00274 
00275   /// Dump the state of an object.
00276   void dump (void) const;
00277 
00278   /// Declare the dynamic allocation hooks.
00279   ACE_ALLOC_HOOK_DECLARE;
00280 
00281 protected:
00282   // = Helpful typedefs.
00283   typedef ACE_NonBlocking_Connect_Handler<SVC_HANDLER> NBCH;
00284 
00285   // = The following two methods define the Connector's strategies for
00286   // creating, connecting, and activating SVC_HANDLER's, respectively.
00287 
00288   /**
00289    * Bridge method for creating a SVC_HANDLER.  The default is to
00290    * create a new SVC_HANDLER only if <sh> == 0, else <sh> is
00291    * unchanged.  However, subclasses can override this policy to
00292    * perform SVC_HANDLER creation in any way that they like (such as
00293    * creating subclass instances of SVC_HANDLER, using a singleton,
00294    * dynamically linking the handler, etc.).  Returns -1 if failure,
00295    * else 0.
00296    */
00297   virtual int make_svc_handler (SVC_HANDLER *&sh);
00298 
00299   /**
00300    * Bridge method for connecting the <svc_handler> to the
00301    * <remote_addr>.  The default behavior delegates to the
00302    * <PEER_CONNECTOR::connect>.
00303    */
00304   virtual int connect_svc_handler (SVC_HANDLER *&svc_handler,
00305                                    const ACE_PEER_CONNECTOR_ADDR &remote_addr,
00306                                    ACE_Time_Value *timeout,
00307                                    const ACE_PEER_CONNECTOR_ADDR &local_addr,
00308                                    int reuse_addr,
00309                                    int flags,
00310                                    int perms);
00311   virtual int connect_svc_handler (SVC_HANDLER *&svc_handler,
00312                                    SVC_HANDLER *&sh_copy,
00313                                    const ACE_PEER_CONNECTOR_ADDR &remote_addr,
00314                                    ACE_Time_Value *timeout,
00315                                    const ACE_PEER_CONNECTOR_ADDR &local_addr,
00316                                    int reuse_addr,
00317                                    int flags,
00318                                    int perms);
00319 
00320   /**
00321    * Bridge method for activating a <svc_handler> with the appropriate
00322    * concurrency strategy.  The default behavior of this method is to
00323    * activate the SVC_HANDLER by calling its <open> method (which
00324    * allows the SVC_HANDLER to define its own concurrency strategy).
00325    * However, subclasses can override this strategy to do more
00326    * sophisticated concurrency activations (such as creating the
00327    * SVC_HANDLER as an "active object" via multi-threading or
00328    * multi-processing).
00329    */
00330   virtual int activate_svc_handler (SVC_HANDLER *svc_handler);
00331 
00332   /// Creates and registers ACE_NonBlocking_Connect_Handler.
00333   int nonblocking_connect (SVC_HANDLER *,
00334                            const ACE_Synch_Options &);
00335 
00336   /// Implementation the <connect> methods.
00337   virtual int connect_i (SVC_HANDLER *&svc_handler,
00338                          SVC_HANDLER **sh_copy,
00339                          const ACE_PEER_CONNECTOR_ADDR &remote_addr,
00340                          const ACE_Synch_Options &synch_options,
00341                          const ACE_PEER_CONNECTOR_ADDR &local_addr,
00342                          int reuse_addr,
00343                          int flags,
00344                          int perms);
00345 
00346   /// Return the handle set representing the non-blocking connects in
00347   /// progress.
00348   ACE_Unbounded_Set<ACE_HANDLE> &non_blocking_handles (void);
00349 
00350   // = Dynamic linking hooks.
00351   /// Default version does no work and returns -1.  Must be overloaded
00352   /// by application developer to do anything meaningful.
00353   virtual int init (int argc, ACE_TCHAR *argv[]);
00354 
00355   /// Calls <handle_close> to shutdown the Connector gracefully.
00356   virtual int fini (void);
00357 
00358   /// Default version returns address info in <buf>.
00359   virtual int info (ACE_TCHAR **, size_t) const;
00360 
00361   // = Service management hooks.
00362   /// Default version does no work and returns -1.  Must be overloaded
00363   /// by application developer to do anything meaningful.
00364   virtual int suspend (void);
00365 
00366   /// Default version does no work and returns -1.  Must be overloaded
00367   /// by application developer to do anything meaningful.
00368   virtual int resume (void);
00369 
00370 private:
00371   /// This is the peer connector factory.
00372   ACE_PEER_CONNECTOR connector_;
00373 
00374   /**
00375    * Flags that indicate how <SVC_HANDLER>'s should be initialized
00376    * prior to being activated.  Right now, the only flag that is
00377    * processed is ACE_NONBLOCK, which enabled non-blocking I/O on
00378    * the <SVC_HANDLER> when it is opened.
00379    */
00380   int flags_;
00381 
00382   /// Pointer to the Reactor.
00383   ACE_Reactor *reactor_;
00384 
00385   /// Handle set representing the non-blocking connects in progress.
00386   ACE_Unbounded_Set<ACE_HANDLE> non_blocking_handles_;
00387 
00388 };
00389 
00390 /**
00391  * @class ACE_Strategy_Connector
00392  *
00393  * @brief Abstract factory for creating a service handler
00394  * (SVC_HANDLER), connecting the SVC_HANDLER, and activating the
00395  * SVC_HANDLER.
00396  *
00397  * Implements a flexible and extensible set of strategies for
00398  * actively establishing connections with clients.  There are
00399  * three main strategies: (1) creating a SVC_HANDLER, (2)
00400  * actively initiating a new connection from the client,
00401  * and (3) activating the SVC_HANDLER with a
00402  * particular concurrency mechanism after the connection is established.
00403  */
00404 template <class SVC_HANDLER, ACE_PEER_CONNECTOR_1>
00405 class ACE_Strategy_Connector
00406   : public ACE_Connector <SVC_HANDLER, ACE_PEER_CONNECTOR_2>
00407 {
00408 public:
00409 
00410   // Useful STL-style traits.
00411   typedef ACE_Creation_Strategy<SVC_HANDLER>
00412   creation_strategy_type;
00413   typedef ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2>
00414   connect_strategy_type;
00415   typedef ACE_Concurrency_Strategy<SVC_HANDLER>
00416   concurrency_strategy_type;
00417   typedef ACE_Connector <SVC_HANDLER, ACE_PEER_CONNECTOR_2>
00418   base_type;
00419 
00420   // = Define some useful (old style) traits.
00421   typedef ACE_Creation_Strategy<SVC_HANDLER>
00422   CREATION_STRATEGY;
00423   typedef ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2>
00424   CONNECT_STRATEGY;
00425   typedef ACE_Concurrency_Strategy<SVC_HANDLER>
00426   CONCURRENCY_STRATEGY;
00427   typedef ACE_Connector <SVC_HANDLER, ACE_PEER_CONNECTOR_2>
00428   SUPER;
00429 
00430   /**
00431    * Initialize a connector.  @a flags indicates how <SVC_HANDLER>'s
00432    * should be initialized prior to being activated.  Right now, the
00433    * only flag that is processed is ACE_NONBLOCK, which enabled
00434    * non-blocking I/O on the <SVC_HANDLER> when it is opened.
00435    */
00436   ACE_Strategy_Connector (ACE_Reactor *r = ACE_Reactor::instance (),
00437                           ACE_Creation_Strategy<SVC_HANDLER> * = 0,
00438                           ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2> * = 0,
00439                           ACE_Concurrency_Strategy<SVC_HANDLER> * = 0,
00440                           int flags = 0);
00441 
00442   /**
00443    * Initialize a connector.  @a flags indicates how <SVC_HANDLER>'s
00444    * should be initialized prior to being activated.  Right now, the
00445    * only flag that is processed is ACE_NONBLOCK, which enabled
00446    * non-blocking I/O on the <SVC_HANDLER> when it is opened.
00447    * Default strategies would be created and used.
00448    */
00449   virtual int open (ACE_Reactor *r,
00450                     int flags);
00451 
00452   /**
00453    * Initialize a connector.  @a flags indicates how <SVC_HANDLER>'s
00454    * should be initialized prior to being activated.  Right now, the
00455    * only flag that is processed is ACE_NONBLOCK, which enabled
00456    * non-blocking I/O on the <SVC_HANDLER> when it is opened.
00457    */
00458   virtual int open (ACE_Reactor *r = ACE_Reactor::instance (),
00459                     ACE_Creation_Strategy<SVC_HANDLER> * = 0,
00460                     ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2> * = 0,
00461                     ACE_Concurrency_Strategy<SVC_HANDLER> * = 0,
00462                     int flags = 0);
00463 
00464   /// Shutdown a connector and release resources.
00465   virtual ~ACE_Strategy_Connector (void);
00466 
00467   /// Close down the Connector
00468   virtual int close (void);
00469 
00470   // = Strategies accessors
00471   virtual ACE_Creation_Strategy<SVC_HANDLER> *creation_strategy (void) const;
00472   virtual ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2> *connect_strategy (void) const;
00473   virtual ACE_Concurrency_Strategy<SVC_HANDLER> *concurrency_strategy (void) const;
00474 
00475 protected:
00476   // = The following three methods define the <Connector>'s strategies
00477   // for creating, connecting, and activating <SVC_HANDLER>'s,
00478   // respectively.
00479 
00480   /**
00481    * Bridge method for creating a <SVC_HANDLER>.  The strategy for
00482    * creating a <SVC_HANDLER> are configured into the Connector via
00483    * it's <creation_strategy_>.  The default is to create a new
00484    * <SVC_HANDLER> only if <sh> == 0, else <sh> is unchanged.
00485    * However, subclasses can override this policy to perform
00486    * <SVC_HANDLER> creation in any way that they like (such as
00487    * creating subclass instances of <SVC_HANDLER>, using a singleton,
00488    * dynamically linking the handler, etc.).  Returns -1 if failure,
00489    * else 0.
00490    */
00491   virtual int make_svc_handler (SVC_HANDLER *&sh);
00492 
00493   /**
00494    * Bridge method for connecting the new connection into the
00495    * <SVC_HANDLER>.  The default behavior delegates to the
00496    * <PEER_CONNECTOR::connect> in the <Connect_Strategy>.
00497    */
00498   virtual int connect_svc_handler (SVC_HANDLER *&sh,
00499                                    const ACE_PEER_CONNECTOR_ADDR &remote_addr,
00500                                    ACE_Time_Value *timeout,
00501                                    const ACE_PEER_CONNECTOR_ADDR &local_addr,
00502                                    int reuse_addr,
00503                                    int flags,
00504                                    int perms);
00505 
00506   /**
00507    * Bridge method for connecting the new connection into the
00508    * <SVC_HANDLER>.  The default behavior delegates to the
00509    * <PEER_CONNECTOR::connect> in the <Connect_Strategy>.
00510    * <sh_copy> is used to obtain a copy of the <sh> pointer, but that
00511    * can be kept in the stack; the motivation is a bit too long to
00512    * include here, but basically we want to modify <sh> safely, using
00513    * the internal locks in the Connect_Strategy, while saving a TSS
00514    * copy in <sh_copy>, usually located in the stack.
00515    */
00516   virtual int connect_svc_handler (SVC_HANDLER *&sh,
00517                                    SVC_HANDLER *&sh_copy,
00518                                    const ACE_PEER_CONNECTOR_ADDR &remote_addr,
00519                                    ACE_Time_Value *timeout,
00520                                    const ACE_PEER_CONNECTOR_ADDR &local_addr,
00521                                    int reuse_addr,
00522                                    int flags,
00523                                    int perms);
00524 
00525   /**
00526    * Bridge method for activating a <SVC_HANDLER> with the appropriate
00527    * concurrency strategy.  The default behavior of this method is to
00528    * activate the <SVC_HANDLER> by calling its <open> method (which
00529    * allows the <SVC_HANDLER> to define its own concurrency strategy).
00530    * However, subclasses can override this strategy to do more
00531    * sophisticated concurrency activations (such as creating the
00532    * <SVC_HANDLER> as an "active object" via multi-threading or
00533    * multi-processing).
00534    */
00535   virtual int activate_svc_handler (SVC_HANDLER *svc_handler);
00536 
00537   // = Strategy objects.
00538 
00539   /// Creation strategy for an <Connector>.
00540   CREATION_STRATEGY *creation_strategy_;
00541 
00542   /// 1 if <Connector> created the creation strategy and thus should
00543   /// delete it, else 0.
00544   int delete_creation_strategy_;
00545 
00546   /// Connect strategy for a <Connector>.
00547   CONNECT_STRATEGY *connect_strategy_;
00548 
00549   /// 1 if <Connector> created the connect strategy and thus should
00550   /// delete it, else 0.
00551   int delete_connect_strategy_;
00552 
00553   /// Concurrency strategy for an <Connector>.
00554   CONCURRENCY_STRATEGY *concurrency_strategy_;
00555 
00556   /// 1 if <Connector> created the concurrency strategy and thus should
00557   /// delete it, else 0.
00558   int delete_concurrency_strategy_;
00559 };
00560 
00561 ACE_END_VERSIONED_NAMESPACE_DECL
00562 
00563 #if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
00564 #include "ace/Connector.cpp"
00565 #endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
00566 
00567 #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
00568 #pragma implementation ("Connector.cpp")
00569 #endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
00570 
00571 #include /**/ "ace/post.h"
00572 
00573 #endif /* ACE_CONNECTOR_H */

Generated on Thu Nov 9 09:41:49 2006 for ACE by doxygen 1.3.6