Files
azerothcore-wotlk-pbot/modules/dep/acelite/ace/Strategies_T.h

1075 lines
33 KiB
C++

// -*- C++ -*-
//=============================================================================
/**
* @file Strategies_T.h
*
* @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
*/
//=============================================================================
#ifndef ACE_STRATEGIES_T_H
#define ACE_STRATEGIES_T_H
#include /**/ "ace/pre.h"
#include "ace/Hash_Map_Manager_T.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
#include "ace/Reactor.h"
#include "ace/Thread_Manager.h"
#include "ace/Connection_Recycling_Strategy.h"
#include "ace/Refcountable_T.h"
#include "ace/Hashable.h"
#include "ace/Recyclable.h"
#include "ace/Reverse_Lock_T.h"
// Needed for broken linkers that can't grok long symbols.
#define ACE_Refcounted_Hash_Recyclable ARHR
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
class ACE_Service_Repository;
/**
* @class ACE_Recycling_Strategy
*
* @brief Defines the interface (and default implementation) for
* specifying a recycling strategy for a SVC_HANDLER.
*
* Acts as a consular to the Svc_Handler, preparing it for the
* tough times ahead when the Svc_Handler will be recycled.
*/
template<class SVC_HANDLER>
class ACE_Recycling_Strategy
{
public:
// Useful STL-style traits.
typedef typename SVC_HANDLER::addr_type addr_type;
typedef SVC_HANDLER handler_type;
typedef typename SVC_HANDLER::stream_type stream_type;
/// Virtual Destructor
virtual ~ACE_Recycling_Strategy (void);
/// Tell the Svc_Handler something about the recycler, so that it can
/// reach the recycler when necessary.
virtual int assign_recycler (SVC_HANDLER *svc_handler,
ACE_Connection_Recycling_Strategy *recycler,
const void *recycling_act);
/// This allows us to prepare the svc_handler for recycling.
virtual int prepare_for_recycling (SVC_HANDLER *svc_handler);
};
/**
* @class ACE_Creation_Strategy
*
* @brief Defines the interface for specifying a creation strategy for
* a SVC_HANDLER.
*
* The default behavior is to make a new SVC_HANDLER. However,
* subclasses can override this strategy to perform SVC_HANDLER
* creation in any way that they like (such as creating subclass
* instances of SVC_HANDLER, using a singleton, dynamically
* linking the handler, etc.).
*/
template <class SVC_HANDLER>
class ACE_Creation_Strategy
{
public:
// Useful STL-style traits.
typedef typename SVC_HANDLER::addr_type addr_type;
typedef SVC_HANDLER handler_type;
typedef typename SVC_HANDLER::stream_type stream_type;
// = Initialization and termination methods.
/// Default constructor.
ACE_Creation_Strategy (ACE_Thread_Manager * = 0,
ACE_Reactor * = ACE_Reactor::instance ());
/// An ACE_Thread_Manager is useful when creating active objects and
/// the ACE_Reactor is used to initialize the service handler's reactor.
int open (ACE_Thread_Manager * = 0,
ACE_Reactor * = ACE_Reactor::instance ());
virtual ~ACE_Creation_Strategy (void);
// = Factory method.
/**
* Create a SVC_HANDLER with the appropriate creation strategy. The
* default behavior of this method is to make a new SVC_HANDLER if
* @a sh == 0 (passing in the Thread_Manager), else @a sh is
* unchanged. Returns -1 on failure, else 0.
*/
virtual int make_svc_handler (SVC_HANDLER *&sh);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
/// Pointer to a thread manager.
ACE_Thread_Manager *thr_mgr_;
/// Pointer to an ACE_Reactor.
ACE_Reactor *reactor_;
};
/**
* @class ACE_Singleton_Strategy
*
* @brief Defines the interface for specifying a creation strategy for
* a SVC_HANDLER that always returns the same SVC_HANDLER (i.e.,
* it's a Singleton).
*
* Note that this class takes over the ownership of the
* SVC_HANDLER passed into it as a parameter and it becomes
* responsible for deleting this object.
*/
template <class SVC_HANDLER>
class ACE_Singleton_Strategy : public ACE_Creation_Strategy<SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Creation_Strategy<SVC_HANDLER> base_type;
// = Initialization and termination methods.
ACE_Singleton_Strategy (SVC_HANDLER * = 0,
ACE_Thread_Manager * = 0);
int open (SVC_HANDLER *,
ACE_Thread_Manager * = 0);
virtual ~ACE_Singleton_Strategy (void);
// = Factory method.
/// Create a Singleton SVC_HANDLER by always returning the same
/// SVC_HANDLER. Returns -1 on failure, else 0.
virtual int make_svc_handler (SVC_HANDLER *&);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
/// Pointer to the Singleton svc_handler.
SVC_HANDLER *svc_handler_;
/// Keep track of whether we need to delete the SVC_HANDLER.
bool delete_svc_handler_;
};
/**
* @class ACE_DLL_Strategy
*
* @brief Defines the interface for specifying a creation strategy for
* a SVC_HANDLER based on dynamic linking of the SVC_HANDLER.
*/
template <class SVC_HANDLER>
class ACE_DLL_Strategy : public ACE_Creation_Strategy<SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Creation_Strategy<SVC_HANDLER> base_type;
// = Intialization and termination methods.
/// "Do-nothing" constructor.
ACE_DLL_Strategy (void);
/// Initialize the DLL strategy based upon the service's DLL
/// information contained in the <svc_dll_info> string.
ACE_DLL_Strategy (const ACE_TCHAR dll_name[],
const ACE_TCHAR factory_function[],
const ACE_TCHAR svc_name[],
ACE_Service_Repository *,
ACE_Thread_Manager * = 0);
/// Initialize the DLL strategy based upon the service's DLL
/// information contained in the <svc_dll_info> string.
int open (const ACE_TCHAR dll_name[],
const ACE_TCHAR factory_function[],
const ACE_TCHAR svc_name[],
ACE_Service_Repository *,
ACE_Thread_Manager * = 0);
// = Factory method.
/// Create a SVC_HANDLER by dynamically linking it from a DLL.
/// Returns -1 on failure, else 0.
virtual int make_svc_handler (SVC_HANDLER *&);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
typedef ACE_Creation_Strategy<SVC_HANDLER> inherited;
/// Name of the DLL to dynamically link.
ACE_TCHAR dll_name_[MAXPATHLEN + 1];
/// Name of the factory function in the shared library to use to
/// obtain a pointer to the new SVC_HANDLER.
ACE_TCHAR factory_function_[MAXPATHLEN + 1];
/// Name of the service.
ACE_TCHAR svc_name_[MAXNAMELEN + 1];
/// Pointer to the <Service_Repository>.
ACE_Service_Repository *svc_rep_;
};
/**
* @class ACE_Concurrency_Strategy
*
* @brief Defines the interface for specifying a concurrency strategy
* for a SVC_HANDLER.
*
* Default behavior is to activate the SVC_HANDLER by calling
* its <open> method (which allows the SVC_HANDLER to define its
* own concurrency strategy). However, subclasses can override
* this default strategy to do more sophisticated concurrency
* activations (such as creating the SVC_HANDLER as an active
* object via multi-threading or multi-processing).
*/
template <class SVC_HANDLER>
class ACE_Concurrency_Strategy
{
public:
// Useful STL-style traits.
typedef typename SVC_HANDLER::addr_type addr_type;
typedef SVC_HANDLER handler_type;
typedef typename SVC_HANDLER::stream_type stream_type;
/// Constructor
ACE_Concurrency_Strategy (int flags = 0);
// = Factory method.
/**
* Activate the @a svc_handler with an appropriate concurrency
* strategy. The default behavior of this method is to activate the
* SVC_HANDLER by calling its <open> method (which allows the
* SVC_HANDLER to define its own concurrency strategy).
*/
virtual int activate_svc_handler (SVC_HANDLER *svc_handler,
void *arg = 0);
virtual ~ACE_Concurrency_Strategy (void);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
/// Flags that are parsed to set options for the connected
/// SVC_HANDLER.
int flags_;
};
/**
* @class ACE_Reactive_Strategy
*
* @brief Defines the interface for specifying a reactive concurrency
* strategy for a SVC_HANDLER, where all upcalls to @c handle_*()
* methods run in the reactor's thread of control.
*
* This class provides a strategy that registers the
* SVC_HANDLER with a <Reactor>.
*/
template <class SVC_HANDLER>
class ACE_Reactive_Strategy : public ACE_Concurrency_Strategy <SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Concurrency_Strategy<SVC_HANDLER> base_type;
// = Intialization and termination methods.
/// "Do-nothing constructor"
ACE_Reactive_Strategy (int flags = 0);
/// Initialize the strategy.
ACE_Reactive_Strategy (ACE_Reactor *reactor,
ACE_Reactor_Mask = ACE_Event_Handler::READ_MASK,
int flags = 0);
/// Initialize the strategy.
virtual int open (ACE_Reactor *reactor,
ACE_Reactor_Mask = ACE_Event_Handler::READ_MASK,
int flags = 0);
/// Destructor.
virtual ~ACE_Reactive_Strategy (void);
// = Factory method.
/// Activate the @a svc_handler by registering it with the <Reactor>
/// and then calling it's <open> hook.
virtual int activate_svc_handler (SVC_HANDLER *svc_handler,
void *arg = 0);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
typedef ACE_Concurrency_Strategy<SVC_HANDLER> inherited;
/// Pointer to the Reactor we'll use to register the SVC_HANDLER.
ACE_Reactor *reactor_;
/// The mask that we pass to the <Reactor> when we register the
/// SVC_HANDLER.
ACE_Reactor_Mask mask_;
};
/**
* @class ACE_Thread_Strategy
*
* @brief Defines the interface for specifying a concurrency strategy
* for a SVC_HANDLER based on multithreading.
*
* This class provides a strategy that manages the creation of threads
* to handle requests from clients concurrently via a
* thread-per-connection model. It behaves as a "thread factory",
* spawning threads "on-demand" to run the service specified by a
* user-supplied SVC_HANDLER.
*/
template <class SVC_HANDLER>
class ACE_Thread_Strategy : public ACE_Concurrency_Strategy<SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Concurrency_Strategy<SVC_HANDLER> base_type;
// = Intialization and termination methods.
/// "Do-nothing constructor"
ACE_Thread_Strategy (int flags = 0);
/// Initialize the strategy.
ACE_Thread_Strategy (ACE_Thread_Manager *tm,
long thr_flags,
int n_threads = 1,
int flags = 0);
/// Initialize the strategy.
virtual int open (ACE_Thread_Manager *tm,
long thr_flags,
int n_threads = 1,
int flags = 0);
virtual ~ACE_Thread_Strategy (void);
// = Factory method.
/**
* Activate the @a svc_handler with an appropriate concurrency
* strategy. This method activates the SVC_HANDLER by first calling
* its <open> method and then calling its <activate> method to turn
* it into an active object.
*/
virtual int activate_svc_handler (SVC_HANDLER *svc_handler,
void *arg = 0);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
typedef ACE_Concurrency_Strategy<SVC_HANDLER> inherited;
/// Thread manager for this class (must be provided).
ACE_Thread_Manager *thr_mgr_;
/// Flags to pass into the <SVC_HANDLER::activate> method.
long thr_flags_;
/// Number of threads to spawn.
int n_threads_;
};
/**
* @class ACE_Process_Strategy
*
* @brief Defines the interface for specifying a concurrency strategy
* for a @c SVC_HANDLER based on multiprocessing.
*
* This class provides a strategy that manages the creation of
* processes to handle requests from clients concurrently using a
* process-per-connection model. It behaves as a "process factory",
* using @c ACE::fork() to fork threads "on-demand" to run the service
* specified by a user-supplied @c SVC_HANDLER in a separate process.
*/
template <class SVC_HANDLER>
class ACE_Process_Strategy : public ACE_Concurrency_Strategy<SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Concurrency_Strategy<SVC_HANDLER> base_type;
// = Intialization and termination methods.
/// Initialize the strategy. If @a avoid_zombies is non-0 then set a
/// flag to ACE::fork() to avoid zombies.
ACE_Process_Strategy (size_t n_processes = 1,
ACE_Event_Handler *acceptor = 0,
ACE_Reactor * = 0,
int avoid_zombies = 0);
/// Initialize the strategy. If @a avoid_zombies is non-0 then set a
/// flag to ACE::fork() to avoid zombies.
virtual int open (size_t n_processes = 1,
ACE_Event_Handler *acceptor = 0,
ACE_Reactor * = 0,
int avoid_zombies = 0);
virtual ~ACE_Process_Strategy (void);
// = Factory method.
/**
* Activate the @a svc_handler with an appropriate concurrency
* strategy. This method activates the SVC_HANDLER by first forking
* and then calling the @c open() method of the SVC_HANDLER in the
* child.
*/
virtual int activate_svc_handler (SVC_HANDLER *svc_handler,
void *arg = 0);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
typedef ACE_Concurrency_Strategy<SVC_HANDLER> inherited;
/// Number of processes to spawn.
size_t n_processes_;
/**
* This is the @c Acceptor in the parent is listening on. We need to
* make sure that we remove it from the Reactor and close it down in
* the child.
*/
ACE_Event_Handler *acceptor_;
/**
* This is the reactor the child is using in conjunction with the
* acceptor. We need to remove the acceptor from this reactor
* in the child.
*/
ACE_Reactor *reactor_;
};
/**
* @class ACE_Accept_Strategy
*
* @brief Defines the interface for specifying a passive connection
* acceptance strategy for a SVC_HANDLER.
*
* This class provides a strategy that manages passive
* connection acceptance of a client.
*/
template <class SVC_HANDLER, ACE_PEER_ACCEPTOR_1>
class ACE_Accept_Strategy
{
public:
// Useful STL-style traits.
typedef ACE_PEER_ACCEPTOR_ADDR addr_type;
typedef ACE_PEER_ACCEPTOR acceptor_type;
typedef SVC_HANDLER handler_type;
typedef typename SVC_HANDLER::stream_type stream_type;
// = Initialization and termination methods.
/// Default constructor.
ACE_Accept_Strategy (ACE_Reactor *reactor = ACE_Reactor::instance ());
/// Initialize the @c peer_acceptor_ with @a local_addr.
ACE_Accept_Strategy (const ACE_PEER_ACCEPTOR_ADDR &local_addr,
bool restart = false,
ACE_Reactor *reactor = ACE_Reactor::instance ());
/// Initialize the <peer_acceptor_> with @a local_addr, indicating
/// whether to @a reuse_addr if it's already in use.
virtual int open (const ACE_PEER_ACCEPTOR_ADDR &local_addr,
bool reuse_addr = false);
/// Return the underlying ACE_HANDLE of the <peer_acceptor_>.
virtual ACE_HANDLE get_handle (void) const;
/// Return a reference to the <peer_acceptor_>.
virtual ACE_PEER_ACCEPTOR &acceptor (void) const;
virtual ~ACE_Accept_Strategy (void);
// = Factory method.
/// The default behavior delegates to the <accept> method of the
/// PEER_ACCEPTOR.
virtual int accept_svc_handler (SVC_HANDLER *);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
/// Factory that establishes connections passively.
ACE_PEER_ACCEPTOR peer_acceptor_;
/// Pointer to the reactor used by the Acceptor.
ACE_Reactor *reactor_;
/// Needed to reopen the socket if <accept> fails.
bool reuse_addr_;
/// Needed to reopen the socket if <accept> fails.
ACE_PEER_ACCEPTOR_ADDR peer_acceptor_addr_;
};
/**
* @class ACE_Connect_Strategy
*
* @brief Defines the interface for specifying an active
* connection establishment strategy for a SVC_HANDLER.
*
* This class provides a strategy that manages active
* connection establishment to a server.
*/
template <class SVC_HANDLER, ACE_PEER_CONNECTOR_1>
class ACE_Connect_Strategy
{
public:
// Useful STL-style traits.
typedef ACE_PEER_CONNECTOR_ADDR addr_type;
typedef ACE_PEER_CONNECTOR connector_type;
typedef SVC_HANDLER handler_type;
typedef typename SVC_HANDLER::stream_type stream_type;
// = Initialization and termination methods.
/// Default constructor.
ACE_Connect_Strategy (void);
/// Return a reference to the <peer_connector_>.
virtual ACE_PEER_CONNECTOR &connector (void) const;
virtual ~ACE_Connect_Strategy (void);
// = Factory method.
/// The default behavior delegates to the <connect> method of the
/// <PEER_CONNECTOR::connect>.
virtual int connect_svc_handler (SVC_HANDLER *&sh,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
ACE_Time_Value *timeout,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
bool reuse_addr,
int flags,
int perms);
/**
* The default behavior delegates to the <connect> method of the
* <PEER_CONNECTOR::connect>.
* Please check the documentation in Connector.h for more details.
*/
virtual int connect_svc_handler (SVC_HANDLER *&sh,
SVC_HANDLER *&sh_copy,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
ACE_Time_Value *timeout,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
bool reuse_addr,
int flags,
int perms);
/// Dump the state of an object.
void dump (void) const;
/// Declare the dynamic allocation hooks.
ACE_ALLOC_HOOK_DECLARE;
protected:
/// Factory that establishes connections actively.
ACE_PEER_CONNECTOR connector_;
};
/**
* @class ACE_Scheduling_Strategy
*
* @brief Defines the interface for specifying how to suspend and
* resume a service .
*
* This class provides a strategy that allows arbitrarily
* sophisticated service suspension and resumption. The default
* behavior is to do nothing...
*/
template <class SVC_HANDLER>
class ACE_Scheduling_Strategy
{
public:
// Useful STL-style traits.
typedef typename SVC_HANDLER::addr_type addr_type;
typedef SVC_HANDLER handler_type;
typedef typename SVC_HANDLER::stream_type stream_type;
// = Initialization and termination methods.
/// Constructor
ACE_Scheduling_Strategy (SVC_HANDLER * = 0);
/// Destructor
virtual ~ACE_Scheduling_Strategy (void);
// = Scheduling methods
/// Suspend hook.
virtual int suspend (void);
/// Resume hook.
virtual int resume (void);
/// Dump the state of the object.
virtual void dump (void) const;
};
/**
* @class ACE_Schedule_All_Reactive_Strategy
*
* @brief Defines the interface for specifying how to suspend and
* resume a single-threaded reactive service .
*
* This class provides a strategy that suspends and resumes all
* the Event_Handlers in a Reactor in one fell swoop.
*/
template <class SVC_HANDLER>
class ACE_Schedule_All_Reactive_Strategy
: public ACE_Scheduling_Strategy<SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Scheduling_Strategy<SVC_HANDLER> base_type;
// = Initialization and termination methods.
/// Constructor
ACE_Schedule_All_Reactive_Strategy (SVC_HANDLER * = 0);
// = Scheduling methods
/// Suspend hook.
virtual int suspend (void);
/// Resume hook.
virtual int resume (void);
/// Dump the state of the object.
virtual void dump (void) const;
protected:
/// Reactor
ACE_Reactor *reactor_;
};
/**
* @class ACE_Schedule_All_Threaded_Strategy
*
* @brief Defines the interface for specifying how to suspend and
* resume a multithreaded service .
*
* This class provides a strategy that suspends and resumes all
* the Event_Handlers controlled by a Thread_Manager in one fell swoop.
*/
template <class SVC_HANDLER>
class ACE_Schedule_All_Threaded_Strategy
: public ACE_Scheduling_Strategy<SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Scheduling_Strategy<SVC_HANDLER> base_type;
// = Initialization and termination methods.
/// Constructor
ACE_Schedule_All_Threaded_Strategy (SVC_HANDLER * = 0);
// = Scheduling methods
/// Suspend hook.
virtual int suspend (void);
/// Resume hook.
virtual int resume (void);
/// Dump the state of the object.
virtual void dump (void) const;
protected:
/// Thread Manager
ACE_Thread_Manager *thr_mgr_;
};
/**
* @class ACE_NOOP_Creation_Strategy
*
* @brief Implements a no-op creation strategy in order to defer
* decisions regarding creation to some later point in time, such
* as in connect or accept strategy.
*
* An example of the use of this is in the
* ACE_Cached_Connect_Strategy, which only returns a single
* connection for a given endpoint.
*/
template <class SVC_HANDLER>
class ACE_NOOP_Creation_Strategy : public ACE_Creation_Strategy<SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Creation_Strategy<SVC_HANDLER> base_type;
/// This is a no-op.
virtual int make_svc_handler (SVC_HANDLER *&);
};
/**
* @class ACE_NOOP_Concurrency_Strategy
*
* @brief Implements a no-op activation strategy in order to avoid
* calling open on a svc_handler multiple times.
*
* An example of the use of this is in the
* ACE_Cached_Connect_Strategy, which reuses svc_handlers.
* Therefore we don't want to call open on the recycled
* svc_handler more than once.
*/
template <class SVC_HANDLER>
class ACE_NOOP_Concurrency_Strategy
: public ACE_Concurrency_Strategy<SVC_HANDLER>
{
public:
// Useful STL-style traits.
typedef ACE_Concurrency_Strategy<SVC_HANDLER> base_type;
// = Factory method.
/// This is a no-op.
virtual int activate_svc_handler (SVC_HANDLER *svc_handler,
void *arg = 0);
};
template <class T>
class ACE_Refcounted_Hash_Recyclable : public ACE_Refcountable_T<ACE_Null_Mutex>,
public ACE_Hashable,
public ACE_Recyclable
{
public:
/// Default constructor.
ACE_Refcounted_Hash_Recyclable (void);
/// Constructor.
ACE_Refcounted_Hash_Recyclable (const T &t,
long refcount = 0,
ACE_Recyclable_State state = ACE_RECYCLABLE_UNKNOWN);
/// Destructor
virtual ~ACE_Refcounted_Hash_Recyclable (void);
/// Compares two instances.
bool operator== (const ACE_Refcounted_Hash_Recyclable<T> &rhs) const;
bool operator!= (const ACE_Refcounted_Hash_Recyclable<T> &rhs) const;
T &subject ();
protected:
/// Computes and returns hash value.
u_long hash_i (void) const;
T t_;
};
/**
* @class ACE_Cached_Connect_Strategy
*
* @brief A connection strategy which caches connections to peers
* (represented by SVC_HANDLER instances), thereby allowing
* subsequent re-use of unused, but available, connections.
*
* <ACE_Cached_Connect_Strategy> is intended to be used as a
* plug-in connection strategy for ACE_Strategy_Connector.
* It's added value is re-use of established connections.
*/
template <class SVC_HANDLER, ACE_PEER_CONNECTOR_1, class MUTEX>
class ACE_Cached_Connect_Strategy
: public ACE_Connection_Recycling_Strategy,
public ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2>
{
public:
// Useful STL-style traits.
typedef ACE_Creation_Strategy<SVC_HANDLER>
creation_strategy_type;
typedef ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2>
connect_strategy_type;
typedef ACE_Concurrency_Strategy<SVC_HANDLER>
concurrency_strategy_type;
typedef ACE_Recycling_Strategy<SVC_HANDLER> recycling_strategy_type;
// = Define some useful (old style) traits.
typedef ACE_Creation_Strategy<SVC_HANDLER>
CREATION_STRATEGY;
typedef ACE_Concurrency_Strategy<SVC_HANDLER>
CONCURRENCY_STRATEGY;
typedef ACE_Recycling_Strategy<SVC_HANDLER>
RECYCLING_STRATEGY;
// = Super class
typedef ACE_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2>
CONNECT_STRATEGY;
typedef ACE_Cached_Connect_Strategy<SVC_HANDLER, ACE_PEER_CONNECTOR_2, MUTEX> SELF;
/// Constructor
ACE_Cached_Connect_Strategy (ACE_Creation_Strategy<SVC_HANDLER> *cre_s = 0,
ACE_Concurrency_Strategy<SVC_HANDLER> *con_s = 0,
ACE_Recycling_Strategy<SVC_HANDLER> *rec_s = 0,
MUTEX *mutex = 0,
bool delete_lock = false);
/// Destructor
virtual ~ACE_Cached_Connect_Strategy (void);
/// This methods allow you to change the strategies used by the
/// cached connector.
virtual int open (ACE_Creation_Strategy<SVC_HANDLER> *cre_s,
ACE_Concurrency_Strategy<SVC_HANDLER> *con_s,
ACE_Recycling_Strategy<SVC_HANDLER> *rec_s);
/// Template method for making a new <svc_handler>
virtual int make_svc_handler (SVC_HANDLER *&sh);
/// Template method for activating a new @a svc_handler
virtual int activate_svc_handler (SVC_HANDLER *svc_handler);
/// Template method for setting the recycler information of the
/// svc_handler.
virtual int assign_recycler (SVC_HANDLER *svc_handler,
ACE_Connection_Recycling_Strategy *recycler,
const void *recycling_act);
/// Template method for preparing the svc_handler for recycling.
virtual int prepare_for_recycling (SVC_HANDLER *svc_handler);
/**
* Checks to see if there is already a <SVC_HANDLER> in the cache
* connected to the <remote_addr>. If so, we return this pointer.
* Otherwise we establish the connection, put it into the cache, and
* return the SVC_HANDLER pointer. <[NOTE]>: the <{reuse_addr}>
* argument does NOT control re-use of addresses in the cache.
* Rather, if the underlying protocol requires a "dead time" prior
* to re-use of its addresses (TCP is a classic example of this),
* <{and}> the protocol provides a means by which to defeat the dead
* time, setting this argument to non-zero will defeat the dead-time
* requirement. <{Dev. Note: We might want to consider enhancing
* the interface at some point so that this also controls re-use of
* the cache.}>
*/
virtual int connect_svc_handler (SVC_HANDLER *&sh,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
ACE_Time_Value *timeout,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
bool reuse_addr,
int flags,
int perms);
virtual int connect_svc_handler (SVC_HANDLER *&sh,
SVC_HANDLER *&sh_copy,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
ACE_Time_Value *timeout,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
bool reuse_addr,
int flags,
int perms);
/// Remove from cache.
virtual int purge (const void *recycling_act);
/// Add to cache.
virtual int cache (const void *recycling_act);
/// Get/Set <recycle_state>.
virtual int recycle_state (const void *recycling_act,
ACE_Recyclable_State new_state);
virtual ACE_Recyclable_State recycle_state (const void *recycling_act) const;
/// Mark as closed.
virtual int mark_as_closed (const void *recycling_act);
/**
* Mark as closed (non-locking version). This method needs to be public
* as it is used in the cleanup of handlers where teh locked version causes
* a deadlock.
*/
virtual int mark_as_closed_i (const void *recycling_act);
/// Cleanup hint and reset <*act_holder> to zero if <act_holder != 0>.
virtual int cleanup_hint (const void *recycling_act,
void **act_holder = 0);
// = Traits for managing the map
typedef ACE_Refcounted_Hash_Recyclable<ACE_PEER_CONNECTOR_ADDR>
REFCOUNTED_HASH_RECYCLABLE_ADDRESS;
typedef ACE_Hash_Map_Manager_Ex<REFCOUNTED_HASH_RECYCLABLE_ADDRESS, SVC_HANDLER *, ACE_Hash<REFCOUNTED_HASH_RECYCLABLE_ADDRESS>, ACE_Equal_To<REFCOUNTED_HASH_RECYCLABLE_ADDRESS>, ACE_Null_Mutex>
CONNECTION_MAP;
typedef typename CONNECTION_MAP::ITERATOR CONNECTION_MAP_ITERATOR;
typedef typename CONNECTION_MAP::ENTRY CONNECTION_MAP_ENTRY;
typedef ACE_Reverse_Lock<MUTEX> REVERSE_MUTEX;
// = Strategy accessors
virtual ACE_Creation_Strategy<SVC_HANDLER> *creation_strategy (void) const;
virtual ACE_Recycling_Strategy<SVC_HANDLER> *recycling_strategy (void) const;
virtual ACE_Concurrency_Strategy<SVC_HANDLER> *concurrency_strategy (void) const;
protected:
/// Creates a new connection.
virtual int new_connection (SVC_HANDLER *&sh,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
ACE_Time_Value *timeout,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
bool reuse_addr,
int flags,
int perms);
/// Find an idle handle.
int find (REFCOUNTED_HASH_RECYCLABLE_ADDRESS &search_addr,
CONNECTION_MAP_ENTRY *&entry);
/// Remove from cache (non-locking version).
virtual int purge_i (const void *recycling_act);
/// Add to cache (non-locking version).
virtual int cache_i (const void *recycling_act);
/// Set <recycle_state> (non-locking version).
virtual int recycle_state_i (const void *recycling_act,
ACE_Recyclable_State new_state);
/// Get <recycle_state> (non-locking version).
virtual ACE_Recyclable_State recycle_state_i (const void *recycling_act) const;
/// Cleanup hint and reset <*act_holder> to zero if <act_holder != 0>.
virtual int cleanup_hint_i (const void *recycling_act,
void **act_holder);
// = Helpers
int check_hint_i (SVC_HANDLER *&sh,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
ACE_Time_Value *timeout,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
bool reuse_addr,
int flags,
int perms,
CONNECTION_MAP_ENTRY *&entry,
int &found);
int find_or_create_svc_handler_i (SVC_HANDLER *&sh,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
ACE_Time_Value *timeout,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
bool reuse_addr,
int flags,
int perms,
CONNECTION_MAP_ENTRY *&entry,
int &found);
virtual int connect_svc_handler_i (
SVC_HANDLER *&sh,
const ACE_PEER_CONNECTOR_ADDR &remote_addr,
ACE_Time_Value *timeout,
const ACE_PEER_CONNECTOR_ADDR &local_addr,
bool reuse_addr,
int flags,
int perms,
int &found);
/// Table that maintains the cache of connected SVC_HANDLERs.
CONNECTION_MAP connection_map_;
/// Mutual exclusion for this object.
MUTEX *lock_;
/// Mutual exclusion for this object.
bool delete_lock_;
/// Reverse lock.
REVERSE_MUTEX *reverse_lock_;
// = Strategy objects.
/// Creation strategy for an <Connector>.
CREATION_STRATEGY *creation_strategy_;
/// true if <Connector> created the creation strategy and thus should
/// delete it, else false.
bool delete_creation_strategy_;
/// Concurrency strategy for an <Connector>.
CONCURRENCY_STRATEGY *concurrency_strategy_;
/// true if <Connector> created the concurrency strategy and thus should
/// delete it, else false.
bool delete_concurrency_strategy_;
/// Recycling strategy for an <Connector>.
RECYCLING_STRATEGY *recycling_strategy_;
/// true if <Connector> created the recycling strategy and thus should
/// delete it, else false.
bool delete_recycling_strategy_;
};
ACE_END_VERSIONED_NAMESPACE_DECL
#if defined (__ACE_INLINE__)
#include "ace/Strategies_T.inl"
#endif /* __ACE_INLINE__ */
#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
#include "ace/Strategies_T.cpp"
#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
#pragma implementation ("Strategies_T.cpp")
#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
#include /**/ "ace/post.h"
#endif /* ACE_STRATEGIES_T_H */