diff options
Diffstat (limited to 'ace/Service_Config.h')
-rw-r--r-- | ace/Service_Config.h | 517 |
1 files changed, 0 insertions, 517 deletions
diff --git a/ace/Service_Config.h b/ace/Service_Config.h deleted file mode 100644 index 5e207e13d00..00000000000 --- a/ace/Service_Config.h +++ /dev/null @@ -1,517 +0,0 @@ -/* -*- C++ -*- */ - -//============================================================================= -/** - * @file Service_Config.h - * - * $Id$ - * - * @author Douglas C. Schmidt <schmidt@cs.wustl.edu> - */ -//============================================================================= - -#ifndef ACE_SERVICE_CONFIG_H -#define ACE_SERVICE_CONFIG_H -#include "ace/pre.h" - -#include "ace/Service_Object.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#include "ace/Signal.h" -#include "ace/Unbounded_Queue.h" -#include "ace/Unbounded_Set.h" -#include "ace/SString.h" - -// Forward decl. -class ACE_Service_Repository; -class ACE_Service_Type; -class ACE_Allocator; -class ACE_Reactor; -class ACE_Thread_Manager; - -extern "C" -{ - typedef ACE_Service_Object *(*ACE_SERVICE_ALLOCATOR) (ACE_Service_Object_Exterminator *); -} - -/** - * @class ACE_Static_Svc_Descriptor - * - * @brief Holds the information necessary to describe a statically linked - * Svc. - */ -class ACE_Static_Svc_Descriptor -{ -public: - /// Name of the service. - const ACE_TCHAR *name_; - - /// Type of service. - int type_; - - /// Factory function that allocates the service. - ACE_SERVICE_ALLOCATOR alloc_; - - /// Bitmask flags indicating how the framework should delete memory. - u_int flags_; - - /// Flag indicating whether the service starts out active. - int active_; - - /// Dump the state of an object. - void dump (void) const; - - /// Declare the dynamic allocation hooks. - ACE_ALLOC_HOOK_DECLARE; - -public: - /// Compare two service descriptors for equality. - int operator== (ACE_Static_Svc_Descriptor &) const; - - /// Compare two service descriptors for inequality. - int operator!= (ACE_Static_Svc_Descriptor &) const; -}; - -// Maintain a set of the statically linked service descriptors. -typedef ACE_Unbounded_Set<ACE_Static_Svc_Descriptor *> - ACE_STATIC_SVCS; -typedef ACE_Unbounded_Set_Iterator<ACE_Static_Svc_Descriptor *> - ACE_STATIC_SVCS_ITERATOR; - -// Maintain a queue of services to be configured from the -// command-line. -typedef ACE_Unbounded_Queue<ACE_TString> - ACE_SVC_QUEUE; -typedef ACE_Unbounded_Queue_Iterator<ACE_TString> - ACE_SVC_QUEUE_ITERATOR; - -#define ACE_Component_Config ACE_Service_Config -/** - * @class ACE_Service_Config - * - * @brief Supplies common server operations for dynamic and static - * configuration of services. - * - * The <ACE_Service_Config> uses the Monostate pattern. Therefore, - * you can only have one of these instantiated per-process. - * NOTE: the signal_handler_ static member is allocated by the - * <ACE_Object_Manager>. The <ACE_Service_Config> constructor - * uses signal_handler_. Therefore, if the program has any - * static <ACE_Service_Config> objects, there might be - * initialization order problems. They can be minimized, but - * not eliminated, by _not_ #defining - * <ACE_HAS_NONSTATIC_OBJECT_MANAGER>. - */ -class ACE_Export ACE_Service_Config -{ -public: - enum - { - MAX_SERVICES = ACE_DEFAULT_SERVICE_REPOSITORY_SIZE - }; - - // = Initialization and termination methods. - - /// Initialize the Service Repository. - ACE_Service_Config (int ignore_static_svcs = 1, - size_t size = ACE_Service_Config::MAX_SERVICES, - int signum = SIGHUP); - - /** - * Performs an open without parsing command-line arguments. The - * <logger_key> indicates where to write the logging output, which - * is typically either a STREAM pipe or a socket address. - */ - ACE_Service_Config (const ACE_TCHAR program_name[], - const ACE_TCHAR *logger_key = ACE_DEFAULT_LOGGER_KEY); - - /** - * Performs an open without parsing command-line arguments. The - * <logger_key> indicates where to write the logging output, which - * is typically either a STREAM pipe or a socket address. If - * <ignore_default_svc_conf_file> is non-0 then the "svc.conf" file - * will be ignored. If <ignore_debug_flag> is non-0 then the - * application is responsible for setting the - * <ACE_Log_Msg::priority_mask> appropriately. Returns number of - * errors that occurred on failure and 0 otherwise. - */ - static int open_i (const ACE_TCHAR program_name[], - const ACE_TCHAR *logger_key = ACE_DEFAULT_LOGGER_KEY, - int ignore_default_svc_conf_file = 0, - int ignore_debug_flag = 0); - - /** - * Performs an open without parsing command-line arguments. The - * <logger_key> indicates where to write the logging output, which - * is typically either a STREAM pipe or a socket address. If - * <ignore_static_svcs> is 1 then static services are not loaded, - * otherwise, they are loaded. If <ignore_default_svc_conf_file> is - * non-0 then the <svc.conf> configuration file will be ignored. - * Returns zero upon success, -1 if the file is not found or cannot - * be opened (errno is set accordingly), otherwise returns the - * number of errors encountered loading the services in the - * specified svc.conf configuration file. If <ignore_debug_flag> is - * non-0 then the application is responsible for setting the - * <ACE_Log_Msg::priority_mask> appropriately. - */ - static int open (const ACE_TCHAR program_name[], - const ACE_TCHAR *logger_key = ACE_DEFAULT_LOGGER_KEY, - int ignore_static_svcs = 1, - int ignore_default_svc_conf_file = 0, - int ignore_debug_flag = 0); - - /** - * This is the primary entry point into the ACE_Service_Config (the - * constructor just handles simple initializations). It parses - * arguments passed in from <argc> and <argv> parameters. The - * arguments that are valid in a call to this method include: - * - * - '-b' Option to indicate that we should be a daemon - * - '-d' Turn on debugging mode - * - '-f' Option to read in the list of svc.conf file names - * - '-k' Option to read a wide string where in the logger output can - * be written - * - '-y' Option required to use statically linked services. - * A static service repostory will be constructed if the flag - * is used. Use this flag to override the default - * <ignore_static_svcs> flag at run-time. - * - '-n' Option to avoid using any statically linked services, which - * eliminates the need to construct the static service repository. - * - '-S' Option to read in the list of services on the command-line - * Please observe the difference between options '-f' that looks - * for a list of files and here a list of services. - * - * Returns number of errors that occurred on failure and 0 - * otherwise. - * - * The <logger_key> indicates where to write the logging output, - * which is typically either a STREAM pipe or a socket address. If - * <ignore_static_svcs> is 1 then static services are not loaded, - * otherwise, they are loaded. If <ignore_default_svc_conf_file> is - * non-0 then the <svc.conf> configuration file will be ignored. - * Returns zero upon success, -1 if the file is not found or cannot - * be opened (errno is set accordingly), otherwise returns the - * number of errors encountered loading the services in the - * specified svc.conf configuration file. If <ignore_debug_flag> is - * non-0 then the application is responsible for setting the - * <ACE_Log_Msg::priority_mask> appropriately. - */ - static int open (int argc, - ACE_TCHAR *argv[], - const ACE_TCHAR *logger_key = ACE_DEFAULT_LOGGER_KEY, - int ignore_static_svcs = 1, - int ignore_default_svc_conf = 0, - int ignore_debug_flag = 0); - - /// Perform user-specified close activities and remove dynamic - /// memory. - virtual ~ACE_Service_Config (void); - - /// Tidy up and perform last rites when ACE_Service_Config is shut - /// down. This method calls <close_svcs>. Returns 0. - static int close (void); - - /// Perform user-specified close hooks and possibly delete all of the - /// configured services in the <Service_Repository>. - static int fini_svcs (void); - - /** - * Perform user-specified close hooks on all of the configured - * services in the <Service_Repository>, then delete the - * <Service_Repository> itself. Returns 0. - */ - static int close_svcs (void); - - /** - * Delete the dynamically allocated Singletons (i.e., the <Reactor>, - * <Proactor>, <ReactorEx>, and <Thread_Manager>. - * Returns 0. - */ - static int close_singletons (void); - - // = Reactor event loop management methods. - /** - * Run the event loop until the <ACE_Reactor::handle_events> method - * returns -1 or the <end_reactor_event_loop> method is invoked. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Reactor::run_event_loop> instead. - */ - static int run_reactor_event_loop (void); - - /** - * Run the event loop until the <ACE_Reactor::handle_events> method - * returns -1, the <end_reactor_event_loop> method is invoked, or the - * <ACE_Time_Value> expires. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * <Use ACE_Reactor::run_event_loop> instead. - */ - static int run_reactor_event_loop (ACE_Time_Value &tv); - - /** - * Instruct the <ACE_Service_Config> to terminate its event loop and - * notifies the <ACE_Reactor::instance> so that it can wake up - * and close down gracefully. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Reactor::end_event_loop> instead. - */ - static int end_reactor_event_loop (void); - - /** - * Report if the Reactor's event loop is finished. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Reactor::event_loop_done> instead. - */ - static int reactor_event_loop_done (void); - - /// True if reconfiguration occurred. - static int reconfig_occurred (void); - - /// Indicate that reconfiguration occurred. - static void reconfig_occurred (int); - - /// Perform the reconfiguration process. - static void reconfigure (void); - - // = The following methods are static in order to enforce Singleton - // semantics for the Reactor, Service_Repository, Thread_Manager, - // and Acceptor/Connector Strategy factory. Other portions of the - // system may need to access them at some point or another... - - // = Accessors and mutators for process-wide Singletons. - - /// Returns a pointer to the list of statically linked services. - static ACE_STATIC_SVCS *static_svcs (void); - - /** - * Get pointer to a process-wide <ACE_Reactor>. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Reactor::instance> instead. - */ - static ACE_Reactor *reactor (void); - - /** - * Set pointer to a process-wide <ACE_Reactor> and return existing - * pointer. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Reactor::instance> instead. - */ - static ACE_Reactor *reactor (ACE_Reactor *); - - /** - * Get pointer to a process-wide <ACE_Service_Repository>. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Service_Repository::instance> instead. - */ - static ACE_Service_Repository *svc_rep (void); - - /** - * Set pointer to a process-wide <ACE_Service_Repository> and return - * existing pointer. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Service_Repository::instance> instead. - */ - static ACE_Service_Repository *svc_rep (ACE_Service_Repository *); - - /** - * Get pointer to a process-wide <ACE_Thread_Manager>. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Thread_Manager::instance> instead. - */ - static ACE_Thread_Manager *thr_mgr (void); - -#if ! defined (ACE_THREAD_MANAGER_LACKS_STATICS) - /** - * Set pointer to a process-wide <ACE_Thread_Manager> and return - * existing pointer. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use ACE_Thread_Manager::instance() instead. - */ - static ACE_Thread_Manager *thr_mgr (ACE_Thread_Manager *); -#endif /* ! defined (ACE_THREAD_MANAGER_LACKS_STATICS) */ - - /** - * Get pointer to a default <ACE_Allocator>. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Allocator::instance> instead. - */ - static ACE_Allocator *alloc (void); - - /** - * Set pointer to a process-wide <ACE_Allocator> and return existing - * pointer. - * DO NOT USE THIS METHOD. It may be unsupported in future releases. - * Use <ACE_Allocator::instance> instead. - */ - static ACE_Allocator *alloc (ACE_Allocator *); - - // = Utility methods. - /// Dynamically link the shared object file and retrieve a pointer to - /// the designated shared object in this file. - static int initialize (const ACE_Service_Type *, - ACE_TCHAR parameters[]); - - /// Initialize and activate a statically <svc_name> service. - static int initialize (const ACE_TCHAR svc_name[], - ACE_TCHAR parameters[]); - - /// Resume a <svc_name> that was previously suspended or has not yet - /// been resumed (e.g., a static service). - static int resume (const ACE_TCHAR svc_name[]); - - /** - * Suspend <svc_name>. Note that this will not unlink the service - * from the daemon if it was dynamically linked, it will mark it as - * being suspended in the Service Repository and call the <suspend> - * member function on the appropriate <ACE_Service_Object>. A - * service can be resumed later on by calling the <RESUME> member - * function... - */ - static int suspend (const ACE_TCHAR svc_name[]); - - /// Totally remove <svc_name> from the daemon by removing it - /// from the ACE_Reactor, and unlinking it if necessary. - static int remove (const ACE_TCHAR svc_name[]); - -#if defined (ACE_HAS_WINCE) - // We must provide these function to bridge the <Svc_Conf> parser - // with ACE. - static int initialize (const ACE_Service_Type *, char parameters[]); - static int initialize (const char svc_name[], char parameters[]); - static int resume (const char svc_name[]); - static int suspend (const char svc_name[]); - static int remove (const char svc_name[]); -#endif /* ACE_HAS_WINCE */ - - /// Dump the state of an object. - void dump (void) const; - - /// Set the signal_handler;for internal use by ACE_Object_Manager only. - static ACE_INLINE void signal_handler (ACE_Sig_Adapter *); - - /// Declare the dynamic allocation hooks. - ACE_ALLOC_HOOK_DECLARE; - - /// Process one service configuration <directive>, which is passed as - /// a string. Returns the number of errors that occurred. - static int process_directive (const ACE_TCHAR directive[]); - - /// Process one static service definition. - /** - * Load a new static service into the ACE_Service_Repository. - * - * @param ssd Service descriptor, see the document of - * ACE_Static_Svc_Descriptor for more details. - * - * @param force_replace If set the new service descriptor replaces - * any previous instance in the ACE_Service_Repository. - * - * @return Returns -1 if the service cannot be 'loaded'. - */ - static int process_directive (const ACE_Static_Svc_Descriptor &ssd, - int force_replace = 0); - - /** - * Process (or re-process) service configuration requests that are - * provided in the svc.conf file(s). Returns the number of errors - * that occurred. - */ - static int process_directives (void); - - /// Handles signals to trigger reconfigurations. - static void handle_signal (int sig, siginfo_t *, ucontext_t *); - - /** - * Handle the command-line options intended for the - * <ACE_Service_Config>. Note that <argv[0]> is assumed to be the - * program name. - * The arguments that are valid in a call to this method are - * - '-b' Option to indicate that we should be a daemon - * - '-d' Turn on debugging mode - * - '-f' Option to read in the list of svc.conf file names - * - '-k' Option to read a wide string where in the logger output can - * be written - * - '-y' Turn on the flag for a repository of statically - * linked services - * - '-n' Need not have a repository of statically linked services - * - '-S' Option to read in the list of services on the command-line - * Please observe the difference between options '-f' that looks - * for a list of files and here a list of services. - */ - static int parse_args (int, ACE_TCHAR *argv[]); -protected: - /// Process service configuration requests that were provided on the - /// command-line. Returns the number of errors that occurred. - static int process_commandline_directives (void); - - /** - * This is the implementation function that <process_directives> and - * <process_directive> both call. Returns the number of errors that - * occurred. - */ - static int process_directives_i (void); - - /// Become a daemon. - static int start_daemon (void); - - /// Add the default statically-linked services to the - /// <ACE_Service_Repository>. - static int load_static_svcs (void); - -private: - /// Indicates where to write the logging output. This is typically - /// either a STREAM pipe or a socket address. - static const ACE_TCHAR *logger_key_; - - /// Singleton repository of statically linked services. - static ACE_STATIC_SVCS *static_svcs_; - - /// Queue of services specified on the command-line. - static ACE_SVC_QUEUE *svc_queue_; - - /// Queue of svc.conf files specified on the command-line. - /// @@ This should probably be made to handle unicode filenames... - static ACE_SVC_QUEUE *svc_conf_file_queue_; - - /// Initialize the <svc_conf_file_queue_> if necessary. - static int init_svc_conf_file_queue (void); - - /// True if reconfiguration occurred. - static sig_atomic_t reconfig_occurred_; - - // = Set by command-line options. - /// Shall we become a daemon process? - static char be_a_daemon_; - - /// Should we avoid loading the static services? - static char no_static_svcs_; - - /// Number of the signal used to trigger reconfiguration. - static int signum_; - - /// Handles the reconfiguration signals. - static ACE_Sig_Adapter *signal_handler_; - - /** - * Keep track of whether the <ACE_Service_Config> is already - * initialized. If so, we can't allow <yyparse> to be called since - * it's not reentrant. This variable is incremented by the - * <ACE_Service_Config::open> method and decremented by the - * <ACE_Service_Config::close> method. - */ - static int is_initialized_; -}; - -#if defined (__ACE_INLINE__) -#include "ace/Service_Config.i" -#endif /* __ACE_INLINE__ */ - -// These must go here to avoid circular includes... (only left here -// for to not break applications which rely on this - no real need any -// longer) -#include "ace/Reactor.h" -#include "ace/Svc_Conf_Tokens.h" -#include "ace/post.h" -#endif /* ACE_SERVICE_CONFIG_H */ |