Supplies common server operations for dynamic and static configuration of service.
More...
|
static ACE_Service_Config * | singleton (void) |
| = Static interfaces More...
|
|
static void | current (ACE_Service_Gestalt *) |
| A mutator to set the "current" (TSS) gestalt instance. More...
|
|
static ACE_Service_Gestalt * | current (void) |
|
static ACE_Service_Gestalt * | instance (void) |
|
static ACE_Service_Gestalt * | global (void) |
|
static int | open (const ACE_TCHAR program_name[], const ACE_TCHAR *logger_key=ACE_DEFAULT_LOGGER_KEY, bool ignore_static_svcs=true, bool ignore_default_svc_conf_file=false, bool ignore_debug_flag=false) |
|
static int | open (int argc, ACE_TCHAR *argv[], const ACE_TCHAR *logger_key=ACE_DEFAULT_LOGGER_KEY, bool ignore_static_svcs=true, bool ignore_default_svc_conf_file=false, bool ignore_debug_flag=false) |
|
static int | close (void) |
|
static int | fini_svcs (void) |
|
static int | reconfig_occurred (void) |
| True if reconfiguration occurred. More...
|
|
static void | reconfig_occurred (int) |
| Indicate that reconfiguration occurred. More...
|
|
static void | reconfigure (void) |
| Perform the reconfiguration process. More...
|
|
static ACE_Service_Gestalt * | static_svcs (void) |
|
static int | insert (ACE_Static_Svc_Descriptor *svc) |
|
static int | initialize (const ACE_Service_Type *, const ACE_TCHAR *parameters) |
|
static int | initialize (const ACE_TCHAR *svc_name, const ACE_TCHAR *parameters) |
| Initialize and activate a statically svc_name service. More...
|
|
static int | resume (const ACE_TCHAR svc_name[]) |
|
static int | suspend (const ACE_TCHAR svc_name[]) |
|
static int | remove (const ACE_TCHAR svc_name[]) |
|
static void | signal_handler (ACE_Sig_Adapter *) |
| Set the signal_handler;for internal use by ACE_Object_Manager only. More...
|
|
static int | process_file (const ACE_TCHAR file[]) |
|
static int | process_directive (const ACE_TCHAR directive[]) |
|
static int | process_directive (const ACE_Static_Svc_Descriptor &ssd, bool force_replace=false) |
|
static int | process_directives (void) |
|
static void | handle_signal (int sig, siginfo_t *, ucontext_t *) |
| Handles signals to trigger reconfigurations. More...
|
|
static int | parse_args (int, ACE_TCHAR *argv[]) |
|
static ACE_Service_Type * | create_service_type (const ACE_TCHAR *n, ACE_Service_Type_Impl *o, ACE_DLL &dll, int active) |
|
static ACE_Service_Type_Impl * | create_service_type_impl (const ACE_TCHAR *name, int type, void *symbol, u_int flags, ACE_Service_Object_Exterminator gobbler) |
|
static int | process_commandline_directives (void) |
|
static int | start_daemon (void) |
| Become a daemon. More...
|
|
static int | load_static_svcs (void) |
|
Supplies common server operations for dynamic and static configuration of service.
The ACE_Service_Config uses the Monostate pattern. Therefore, you can only have one of these instantiated per-process. It represents the process-wide collection of services, which is typicaly shared among all other configurable entities. The only ACE_Service_Config instance is registered with and owned by the ACE_Object_Manager.
By contrast, the ACE_Service_Gestalt represents the collection of services, pertaining to a configurable entity. Typicaly, a "configurable entity" is an instance, which owns an instance of ACE_Service_Gestalt in order to ensure full controll over the services it needs.
Another facet of ACE_Service_Config is that for a given thread, it provides access to its current, process-global ACE_Service_Gestalt instance through its curent() method.
- 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.
This is what the static service initializators are hard-wired to use, so in order to avoid interface changes this method merely forwards to ACE_Service_Config::current
. This enables us to enforce which Service Gestalt is used for services registering through static initializers. Especially important for DLL-based dynamic services, which can contain their own static services and static initializers.
- Deprecated:
- Use current() instead.
Return the configuration instance, considered "global" in the current thread. This may be the same as instance(), but on some occasions, it may be a different one. For example, ACE_Service_Config_Guard provides a way of temporarily replacing the "current" configuration instance in the context of a thread.
int ACE_Service_Config::open |
( |
int |
argc, |
|
|
ACE_TCHAR * |
argv[], |
|
|
const ACE_TCHAR * |
logger_key = ACE_DEFAULT_LOGGER_KEY , |
|
|
bool |
ignore_static_svcs = true , |
|
|
bool |
ignore_default_svc_conf_file = false , |
|
|
bool |
ignore_debug_flag = false |
|
) |
| |
|
inlinestatic |
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. Note that when this option is used, the process will be daemonized before the service configuration file(s) are read. During daemonization, (on POSIX systems) the current directory will be changed to "/" so the caller should either fully specify the file names, or execute a
chroot()
to the appropriate directory. - See also
- ACE::daemonize().
- '-d' Turn on debugging mode
- '-f' Specifies a configuration file name other than the default svc.conf. Can be specified multiple times to use multiple files. If any configuration file is provided with this option then the default svc.conf will be ignored.
- '-k' Specifies the rendezvous point to use for the ACE distributed logger.
- '-y' Explicitly enables the use of static services. This flag overrides the ignore_static_svcs parameter value.
- '-n' Explicitly disables the use of static services. This flag overrides the ignore_static_svcs parameter value.
- '-p' Specifies a pathname which is used to store the process id.
- '-s' Specifies a signal number other than SIGHUP to trigger reprocessing of the configuration file(s). Ignored for platforms that do not have POSIX signals, such as Windows.
- '-S' Specifies a service directive string. Enclose the string in quotes and escape any embedded quotes with a backslash. This option specifies service directives without the need for a configuration file. Can be specified multiple times.
Note: Options '-f' and '-S' complement each other. Directives from files and from '-S' option are processed together in the following order. First, all files are processed in the order they are specified in argv parameter. Second, all directive strings are executed in the order the directives appear in argv parameter.
- Parameters
-
argc | The number of commandline arguments. |
argv | The array with commandline arguments |
logger_key | Indicates where to write the logging output, which is typically either a STREAM pipe or a socket address. |
ignore_static_svcs | If true then static services are not loaded, otherwise, they are loaded. |
ignore_default_svc_conf_file | If non-0 then the svc.conf configuration file will be ignored. |
ignore_debug_flag | If true then the application is responsible for setting the ACE_Log_Msg::priority_mask appropriately. |
- Return values
-
-1 | The configuration file is not found or cannot be opened (errno is set accordingly). |
0 | Success. |
>0 | The number of errors encountered while processing the service configuration file(s). |
Pointer to the Singleton (ACE_Cleanup) Gestalt instance. There is thread-specific global instance pointer, which is used to temporarily change which Gestalt instance is used for static service registrations.
A specific use case is a thread, which loads a dynamic service from a DLL. If the said DLL also contains additional static services, those must be registered with the same configuration repository as the dynamic service. Otherwise, the DLL's static services would be registered with the global Gestalt and may outlive the DLL that contains their code and perhaps the memory in which they are in. This is a problem because if the DLL gets unloaded (as it will, if it was loaded in an instance of Gestalt), the DLL's memory will be deallocated, but the global service repository will still "think" it must finalize the (DLL's) static services - with disastrous consequences, occurring in the post-main code (at_exit()). This class needs the intimate access to be able to swap the current TSS pointer for the global Gestalt.