summaryrefslogtreecommitdiff
path: root/ACE/ace/Log_Msg.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/Log_Msg.h')
-rw-r--r--ACE/ace/Log_Msg.h751
1 files changed, 751 insertions, 0 deletions
diff --git a/ACE/ace/Log_Msg.h b/ACE/ace/Log_Msg.h
new file mode 100644
index 00000000000..3e96567f658
--- /dev/null
+++ b/ACE/ace/Log_Msg.h
@@ -0,0 +1,751 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Log_Msg.h
+ *
+ * $Id$
+ *
+ * @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
+ */
+//=============================================================================
+
+#ifndef ACE_LOG_MSG_H
+#define ACE_LOG_MSG_H
+#include /**/ "ace/pre.h"
+
+// This stuff must come first to avoid problems with circular
+// headers...
+// ... but ACE_NDEBUG and ACE_NLOGGING can come from the config.h file, so
+// pull that one early.
+#include /**/ "ace/config-all.h"
+#include /**/ "ace/ACE_export.h"
+#include "ace/Global_Macros.h"
+#include "ace/Default_Constants.h"
+#include "ace/Log_Priority.h"
+#include "ace/os_include/os_limits.h"
+#include "ace/Synch_Traits.h"
+
+// The ACE_ASSERT macro used to be defined here, include ace/Assert.h
+// for backwards compatibility.
+#include "ace/Assert.h"
+
+#if defined (ACE_NLOGGING)
+#if !defined (ACE_HEX_DUMP)
+# define ACE_HEX_DUMP(X) do {} while (0)
+#endif
+#if !defined (ACE_RETURN)
+# define ACE_RETURN(Y) do { return (Y); } while (0)
+#endif
+#if !defined (ACE_ERROR_RETURN)
+# define ACE_ERROR_RETURN(X, Y) return (Y)
+#endif
+#if !defined (ACE_ERROR_BREAK)
+# define ACE_ERROR_BREAK(X) { break; }
+#endif
+#if !defined (ACE_ERROR)
+# define ACE_ERROR(X) do {} while (0)
+#endif
+#if !defined (ACE_DEBUG)
+# define ACE_DEBUG(X) do {} while (0)
+#endif
+#if !defined (ACE_ERROR_INIT)
+# define ACE_ERROR_INIT(VALUE, FLAGS)
+#endif
+#else
+#if !defined (ACE_HEX_DUMP)
+#define ACE_HEX_DUMP(X) \
+ do { \
+ int const __ace_error = ACE_Log_Msg::last_error_adapter (); \
+ ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \
+ ace___->conditional_set (__FILE__, __LINE__, 0, __ace_error); \
+ ace___->log_hexdump X; \
+ } while (0)
+#endif
+#if !defined (ACE_RETURN)
+#define ACE_RETURN(Y) \
+ do { \
+ int const __ace_error = ACE_Log_Msg::last_error_adapter (); \
+ ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \
+ ace___->set (__FILE__, __LINE__, Y, __ace_error, ace___->restart (), \
+ ace___->msg_ostream (), ace___->msg_callback ()); \
+ return Y; \
+ } while (0)
+#endif
+#if !defined (ACE_ERROR_RETURN)
+#define ACE_ERROR_RETURN(X, Y) \
+ do { \
+ int const __ace_error = ACE_Log_Msg::last_error_adapter (); \
+ ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \
+ ace___->conditional_set (__FILE__, __LINE__, Y, __ace_error); \
+ ace___->log X; \
+ return Y; \
+ } while (0)
+#endif
+#if !defined (ACE_ERROR)
+#define ACE_ERROR(X) \
+ do { \
+ int const __ace_error = ACE_Log_Msg::last_error_adapter (); \
+ ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \
+ ace___->conditional_set (__FILE__, __LINE__, -1, __ace_error); \
+ ace___->log X; \
+ } while (0)
+#endif
+#if !defined (ACE_DEBUG)
+#define ACE_DEBUG(X) \
+ do { \
+ int const __ace_error = ACE_Log_Msg::last_error_adapter (); \
+ ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \
+ ace___->conditional_set (__FILE__, __LINE__, 0, __ace_error); \
+ ace___->log X; \
+ } while (0)
+#endif
+#if !defined (ACE_ERROR_INIT)
+#define ACE_ERROR_INIT(VALUE, FLAGS) \
+ do { \
+ ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \
+ ace___->set_flags (FLAGS); \
+ ace___->op_status (VALUE); \
+ } while (0)
+#endif
+#if !defined (ACE_ERROR_BREAK)
+#define ACE_ERROR_BREAK(X) { ACE_ERROR (X); break; }
+#endif
+#endif /* ACE_NLOGGING */
+
+#include "ace/OS_Log_Msg_Attributes.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+// These workarounds are necessary for nasty libraries or platforms
+// that #define STDERR or THREAD (e.g. LynxOS). We simply #undef
+// these macros as there is no way to save the macro definition using
+// the pre-processor. See Bugzilla Bug #299 for more info.
+#if defined (STDERR)
+# undef STDERR
+#endif /* STDERR */
+
+#if defined (THREAD)
+# undef THREAD
+#endif /* THREAD */
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+class ACE_Log_Msg_Callback;
+class ACE_Log_Msg_Backend;
+
+// ****************************************************************
+
+#define ACE_LOG_MSG ACE_Log_Msg::instance ()
+
+// Forward declaration
+class ACE_Thread_Descriptor;
+class ACE_Log_Record;
+template<typename M, typename T> class ACE_Atomic_Op;
+
+/**
+ * @class ACE_Log_Msg
+ *
+ * @brief Provides a variable length argument message logging
+ * abstraction.
+ *
+ * This class is very flexible since it allows formatted error
+ * messages to be printed in a thread-safe manner to various
+ * locations, such as stderr, cerr, a distributed logger, etc. The
+ * current message is also kept in a thread-specific storage location
+ * (threads spawned using ACE_Thread_Manager automatically get an
+ * ACE_Log_Msg object that inherits the spawning thread's settings),
+ * which can be used to communicate errors between framework methods
+ * and callers. A message is logged by the log() method, only if the
+ * message priority is currently enabled. Moreover, only the current
+ * log message is stored here -- it will be overwritten by the
+ * subsequent call to log().
+ *
+ * The ACE_Log_Msg class uses two priority masks to control its
+ * logging behavior. The @c priority_mask_ object attribute is
+ * thread- specific and specifies the priority levels logged by the
+ * thread. The @c process_priority_mask_ class attribute is not
+ * thread-specific and specifies the priority levels that will be
+ * logged by all threads in the process. By default, all levels are
+ * disabled for @c priority_mask_ and all levels are enabled for @c
+ * process_priority_mask_ (i.e. the process-wide mask controls the
+ * settings, and each instance can expand on it if desired). Both
+ * priority masks can be modified using the priority_mask() method of
+ * this class.
+ */
+class ACE_Export ACE_Log_Msg
+{
+public:
+ // Logger Flags.
+ enum
+ {
+ /// Write messages to stderr.
+ STDERR = 1,
+ /// Write messages to the local client logger daemon.
+ LOGGER = 2,
+ /// Write messages to the ostream * stored in thread-specific
+ /// storage.
+ OSTREAM = 4,
+ /// Write messages to the callback object.
+ MSG_CALLBACK = 8,
+ /// Display messages in a verbose manner.
+ VERBOSE = 16,
+ /// Display messages in a less verbose manner (i.e., only print
+ /// information that can change between calls).
+ VERBOSE_LITE = 32,
+ /// Do not print messages at all (just leave in thread-specific
+ /// storage for later inspection).
+ SILENT = 64,
+ /// Write messages to the system's event log.
+ SYSLOG = 128,
+ /// Write messages to the user provided backend
+ CUSTOM = 256
+ };
+
+ // = Initialization and termination routines.
+
+ /// Returns a pointer to the Singleton.
+ static ACE_Log_Msg *instance (void);
+
+ /// Returns last error.
+ static int last_error_adapter (void);
+
+ /// Returns non-null if an ACE_Log_Msg exists for the calling thread.
+ static int exists (void);
+
+ /// Returns the current program name used for logging.
+ static const ACE_TCHAR * program_name (void);
+
+ /// Clears the flag from the default priority mask used to
+ /// initialize ACE_Log_Msg instances.
+ static void disable_debug_messages (ACE_Log_Priority priority = LM_DEBUG);
+
+ /// Sets the flag in the default priority mask used to initialize
+ /// ACE_Log_Msg instances.
+ static void enable_debug_messages (ACE_Log_Priority priority = LM_DEBUG);
+
+ /// Initialize logger.
+ ACE_Log_Msg (void);
+
+ /// cleanup logger.
+ ~ACE_Log_Msg (void);
+
+ /// Initialize the ACE logging facility.
+ /**
+ * Initialize the ACE logging facility. Supplies the program name
+ * that is available to each logging message call. Default arguments
+ * set up logging to STDERR only.
+ *
+ * @param prog_name The name of the calling program.
+ * @param options_flags A bitwise-or of options flags used to set the
+ * initial behavior and logging sink(s). (see the
+ * enum above for the valid values).
+ * @param logger_key The name of ACE_FIFO rendezvous point where the
+ * local client logger daemon is listening for logging
+ * messages if the LOGGER bit is set in the @a flags
+ * argument. If the SYSLOG bit is set in @a flags,
+ * @a logger_key is the source/program name specified
+ * in the syslog facility (UNIX/Linux) or the Windows
+ * event log (Windows). In the SYSLOG case, if
+ * @a logger_key is 0, @a prog_name is used.
+ */
+ int open (const ACE_TCHAR *prog_name,
+ u_long options_flags = ACE_Log_Msg::STDERR,
+ const ACE_TCHAR *logger_key = 0);
+
+ // = Set/get the options flags.
+
+ /**
+ * Enable the bits in the logger's options flags.
+ */
+ void set_flags (u_long f);
+
+ /**
+ * Disable the bits in the logger's options flags.
+ */
+ void clr_flags (u_long f);
+
+ /**
+ * Return the bits in the logger's options flags.
+ */
+ u_long flags (void);
+
+ /** @name Allow apps to acquire and release internal synchronization
+ * lock
+ *
+ * This lock is used internally by the ACE_Log_Msg
+ * implementation. By exporting the lock, applications can hold the
+ * lock atomically over a number of calls to ACE_Log_Msg.
+ */
+ //@{
+
+ /// Acquire the internal lock.
+ int acquire (void);
+
+ /// Release the internal lock.
+ int release (void);
+ //@}
+
+ /// Call after doing a @c fork() to resynchronize the process id and
+ /// @c program_name_ variables.
+ void sync (const ACE_TCHAR *program_name);
+
+ // = Set/get methods. Note that these are non-static and thus will
+ // be thread-specific.
+
+ /// Set the result of the operation status (by convention, -1 means
+ /// error).
+ void op_status (int status);
+
+ /// Get the result of the operation status (by convention, -1 means
+ /// error).
+ int op_status (void) const;
+
+ /// Set the value of the errnum (by convention this corresponds to
+ /// errno).
+ void errnum (int);
+
+ /// Get the value of the errnum (by convention this corresponds to
+ /// errno).
+ int errnum (void) const;
+
+ /// Set the line number where an error occurred.
+ void linenum (int);
+
+ /// Get the line number where an error occurred.
+ int linenum (void) const;
+
+ /// Set the file name where an error occurred.
+ void file (const char *);
+
+ /// Get the file name where an error occurred.
+ const char *file (void);
+
+ /// Set the message that describes what type of error occurred.
+ void msg (const ACE_TCHAR *);
+
+ /// Get the message that describes what type of error occurred.
+ const ACE_TCHAR *msg (void);
+
+ /// Set the field that indicates whether interrupted calls should be
+ /// restarted.
+ void restart (bool r);
+
+ /// Get the field that indicates whether interrupted calls should be
+ /// restarted.
+ bool restart (void) const;
+
+ // = Notice that the following two function is equivalent to
+ // "void msg_ostream (HANDLE)" and "HANDLE msg_ostream (void)"
+ // on Windows CE. There is no <iostream.h> support on CE.
+
+ /// Update the ostream without overwriting the delete_ostream_ flag.
+ void msg_ostream (ACE_OSTREAM_TYPE *);
+
+ /**
+ * delete_stream == true, forces Log_Msg.h to delete the stream in
+ * its own ~dtor (assumes control of the stream)
+ * use only with proper ostream (eg: fstream), not (cout, cerr)
+ */
+ void msg_ostream (ACE_OSTREAM_TYPE *, bool delete_ostream);
+
+ /// Get the ostream that is used to print error messages.
+ ACE_OSTREAM_TYPE *msg_ostream (void) const;
+
+ /**
+ * Set a new callback object and return the existing callback to
+ * allow "chaining". Note that ACE_Log_Msg_Callback objects are not
+ * inherited when spawning a new thread, so you'll need to reset
+ * them in each thread.
+ */
+ ACE_Log_Msg_Callback *msg_callback (ACE_Log_Msg_Callback *c);
+ ACE_Log_Msg_Callback *msg_callback (void) const;
+
+ /**
+ * Set a new backend object and return the existing backend to
+ * allow "chaining". Note that as opposed to ACE_Log_Msg_Callback,
+ * ACE_Log_Msg_Backend is a per-process entity.
+ *
+ * @note Be aware that because of the current architecture there is
+ * no guarantee that open (), reset () and close () will be called
+ * on a backend object.
+ *
+ */
+ static ACE_Log_Msg_Backend *msg_backend (ACE_Log_Msg_Backend *b);
+ static ACE_Log_Msg_Backend *msg_backend (void);
+
+ /// Nesting depth increment.
+ int inc (void);
+
+ /// Nesting depth decrement.
+ int dec (void);
+
+ /// Get trace depth.
+ int trace_depth (void) const;
+
+ /// Set trace depth.
+ void trace_depth (int);
+
+ /// Get trace active status.
+ bool trace_active (void) const;
+
+ /// Set trace active status.
+ void trace_active (bool value);
+
+ /// Get the TSS thread descriptor.
+ ACE_Thread_Descriptor *thr_desc (void) const;
+
+ /**
+ * Set the TSS thread descriptor. This method will call
+ * td->acquire_release to block execution until this call
+ * return.
+ */
+ void thr_desc (ACE_Thread_Descriptor *td);
+
+ /// Stop tracing status on a per-thread basis...
+ void stop_tracing (void);
+
+ /// Start tracing status on a per-thread basis...
+ void start_tracing (void);
+
+ /// Query tracing status on a per-thread basis...
+ bool tracing_enabled (void) const;
+
+ typedef enum
+ {
+ PROCESS = 0,
+ THREAD = 1
+ } MASK_TYPE;
+
+ // = Get/set the priority mask.
+ /// Get the current ACE_Log_Priority mask.
+ u_long priority_mask (MASK_TYPE = THREAD);
+
+ /// Set the ACE_Log_Priority mask, returns original mask.
+ u_long priority_mask (u_long, MASK_TYPE = THREAD);
+
+ /// Return true if the requested priority is enabled.
+ int log_priority_enabled (ACE_Log_Priority log_priority);
+
+ /// Return true if the requested priority is enabled.
+ int log_priority_enabled (ACE_Log_Priority log_priority,
+ const char *,
+ ...);
+
+#if defined (ACE_USES_WCHAR)
+ // We are not using ACE_TCHAR for this since ACE_HEX_DUMP
+ // doesn't take in a ACE_TCHAR. log_hexdump takes in a char
+ // string, so this must be able to take in a char string even
+ // when using ACE_USES_WCHAR.
+ /// Return true if the requested priority is enabled.
+ int log_priority_enabled (ACE_Log_Priority log_priority,
+ const wchar_t *,
+ ...);
+#endif /* ACE_USES_WCHAR */
+
+ /// Optimize reading of the pid (avoids a system call if the value is
+ /// cached...).
+ pid_t getpid (void) const;
+
+ /// Get the name of the local host.
+ const ACE_TCHAR *local_host (void) const;
+
+ /// Set the name of the local host.
+ void local_host (const ACE_TCHAR *);
+
+ /**
+ * Set the line number, file name, operational status, error number,
+ * restart flag, ostream, and the callback object. This combines
+ * all the other set methods into a single method.
+ */
+ void set (const char *file,
+ int line,
+ int op_status = -1,
+ int errnum = 0,
+ bool restart = true,
+ ACE_OSTREAM_TYPE *os = 0,
+ ACE_Log_Msg_Callback *c = 0);
+
+ /// These values are only actually set if the requested priority is
+ /// enabled.
+ void conditional_set (const char *file,
+ int line,
+ int op_status,
+ int errnum);
+
+ /**
+ * Format a message to the thread-safe ACE logging mechanism. Valid
+ * options (prefixed by '%', as in printf format strings) include:
+ * - 'A': print an ACE_timer_t value (which could be either double
+ * or ACE_UINT32.)
+ * - 'a': abort the program at this point abruptly.
+ * - 'b': print a ssize_t value
+ * - 'B': print a size_t value
+ * - 'c': print a character
+ * - 'C': print a char* character string (also see s and W)
+ * - 'i', 'd': print a decimal number
+ * - 'I': indent according to nesting depth (obtained from
+ * ACE_Trace::get_nesting_indent()).
+ * - 'e', 'E', 'f', 'F', 'g', 'G': print a double
+ * - 'l': print line number where an error occurred.
+ * - 'M': print the name of the priority of the message.
+ * - 'm': return the message corresponding to errno value, e.g., as
+ * done by strerror()
+ * - 'N': print file name where the error occurred.
+ * - 'n': print the name of the program (or "<unknown>" if not set)
+ * - 'o': print as an octal number
+ * - 'P': print out the current process id
+ * - 'p': print out the appropriate errno message from sys_errlist,
+ * e.g., as done by perror()
+ * - 'Q': print out the uint64 number
+ * - 'q': print out the int64 number
+ * - '@': print a void* pointer (in hexadecimal)
+ * - 'r': call the function pointed to by the corresponding argument
+ * - 'R': print return status
+ * - 'S': print out the appropriate signal message corresponding
+ * to var-argument, e.g., as done by strsignal()
+ * - 's': prints a ACE_TCHAR* character string (also see C and W)
+ * - 'T': print timestamp in hour:minute:sec:usec format (plain option,
+ * i.e. without any flags, prints system supplied timestamp;
+ * with '#' flag added expects ACE_Time_Value* in argument list)
+ * - 'D': print timestamp as Weekday Month day year hour:minute:sec.usec
+ * (plain option, i.e. without any flags, prints system supplied
+ * timestamp; with '#' flag added expects ACE_Time_Value* in
+ * argument list)
+ * - 't': print thread id (1 if single-threaded)
+ * - 'u': print as unsigned int
+ * - 'w': prints a wide character
+ * - 'W': prints a wchar_t* character string (also see C and s)
+ * - 'x': print as a hex number
+ * - 'X': print as a hex number
+ * - 'z': print an ACE_OS::WChar character
+ * - 'Z': print an ACE_OS::WChar character string
+ * - ':': print a time_t value as an integral number
+ * - '%': print out a single percent sign, '%'
+ * - '?': print out stack trace (see Stack_Trace.h header comments)
+ */
+ ssize_t log (ACE_Log_Priority priority, const ACE_TCHAR *format, ...);
+
+#if defined (ACE_HAS_WCHAR)
+ ssize_t log (ACE_Log_Priority priority, const ACE_ANTI_TCHAR *format, ...);
+#endif /* ACE_HAS_WCHAR */
+
+ /**
+ * An alternative logging mechanism that makes it possible to
+ * integrate variable argument lists from other logging mechanisms
+ * into the ACE mechanism.
+ */
+ ssize_t log (const ACE_TCHAR *format,
+ ACE_Log_Priority priority,
+ va_list argp);
+
+ /// Log a custom built log record to the currently enabled logging
+ /// sinks.
+ ssize_t log (ACE_Log_Record &log_record,
+ int suppress_stderr = 0);
+
+ /**
+ * Method to log hex dump. This is useful for debugging. Calls
+ * log() to do the actual print, but formats first to make the chars
+ * printable.
+ */
+ int log_hexdump (ACE_Log_Priority log_priority,
+ const char *buffer,
+ size_t size,
+ const ACE_TCHAR *text = 0);
+
+ static void init_hook (ACE_OS_Log_Msg_Attributes &attributes
+# if defined (ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS)
+ , ACE_SEH_EXCEPT_HANDLER selector = 0
+ , ACE_SEH_EXCEPT_HANDLER handler = 0
+# endif /* ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS */
+ /**
+ * Init hook, create a Log_Msg_Attribute object, initialize its
+ * attributes from the TSS Log_Msg and save the object in the
+ * @a attributes argument
+ */
+ );
+
+ /**
+ * Inherit hook, the @a attributes field is a ACE_OS_Log_Msg_Attributes
+ * object, invoke the inherit_log_msg() method on it, then destroy
+ * it and set the @a attribute argument to 0.
+ */
+ static void inherit_hook (ACE_OS_Thread_Descriptor *thr_desc,
+ ACE_OS_Log_Msg_Attributes &attributes);
+
+ /// Dump the state of an object.
+ void dump (void) const;
+
+ /// Declare the dynamic allocation hooks.
+ ACE_ALLOC_HOOK_DECLARE;
+
+private:
+ void cleanup_ostream ();
+
+ /// Status of operation (-1 means failure, >= 0 means success).
+ int status_;
+
+ /// Type of error that occurred (see <sys/errno.h>).
+ int errnum_;
+
+ /// Line number where the error occurred.
+ int linenum_;
+
+ /// File where the error occurred.
+ char file_[MAXPATHLEN + 1];
+
+ /// The log message, which resides in thread-specific storage. Note
+ /// that only the current log message is stored here -- it will be
+ /// overwritten by the subsequent call to log().
+ ACE_TCHAR* msg_; // Add one for NUL-terminator.
+
+ /// Indicates whether we should restart system calls that are
+ /// interrupted.
+ bool restart_;
+
+ /// The ostream where logging messages can be written.
+ ACE_OSTREAM_TYPE *ostream_;
+
+ /// This pointer is 0 if we are not reference counting (the user has not
+ /// passed "true" for the delete_ostream argument to msg_ostream).
+ /// If we are reference counting, this points to a shared count that will
+ /// be deleted when it reaches zero. Since we want optional but shared
+ /// ownership neither std::auto_ptr nor ACE_Strong_Bound_Ptr have the right
+ /// semantics. *Bound_Ptr also doesn't take advantage of Atomic_Op.
+ typedef ACE_Atomic_Op<ACE_SYNCH_MUTEX, unsigned long> Atomic_ULong;
+ Atomic_ULong *ostream_refcount_;
+
+ /// The callback object.
+ ACE_Log_Msg_Callback *msg_callback_;
+
+ /// Depth of the nesting for printing traces.
+ int trace_depth_;
+
+ /// Are we already within an ACE_Trace constructor call?
+ bool trace_active_;
+
+ /// Are we allowing tracing in this thread?
+ bool tracing_enabled_;
+
+ /**
+ * If we're running in the context of an ACE_Thread_Manager this
+ * will point to the thread descriptor adapter which holds the
+ * thread descriptor of the thread. This can be used to repidly
+ * access all thread data kept in ACE_Thread_Descriptor.
+ */
+ ACE_Thread_Descriptor *thr_desc_;
+
+ /**
+ * Keeps track of all the per-thread ACE_Log_Priority values that
+ * are currently enabled. Default is for all logging priorities to
+ * be disabled.
+ */
+ u_long priority_mask_;
+
+ /// Always timestamp?
+ int timestamp_;
+
+ // = The following fields are *not* kept in thread-specific storage.
+
+ // We only want one instance for the entire process!
+
+ /**
+ * Keeps track of all the per-process ACE_Log_Priority values that
+ * are currently enabled. Default is for all logging priorities to
+ * be enabled.
+ */
+ static u_long process_priority_mask_;
+
+ /// Records the program name.
+ static const ACE_TCHAR *program_name_;
+
+ /// Name of the local host (used when printing messages).
+ static const ACE_TCHAR *local_host_;
+
+ /// Process id of the current process.
+ static pid_t pid_;
+
+ /// Options flags used to hold the logger flag options, e.g.,
+ /// STDERR, LOGGER, OSTREAM, MSG_CALLBACK, etc.
+ static u_long flags_;
+
+ /// Offset of msg_[].
+ static ptrdiff_t msg_off_;
+
+ /**
+ * Number of existing ACE_Log_Msg instances; when 0, delete program/host
+ * names
+ */
+ static int instance_count_;
+
+ /**
+ * Priority mask to use for each new instance
+ */
+ static u_long default_priority_mask_;
+
+ /// Anonymous struct since there will only be one instance. This
+ /// struct keeps information stored away in case we actually end up
+ /// calling log() if the log priority is correct.
+ struct
+ {
+ bool is_set_;
+ const char *file_;
+ int line_;
+ int op_status_;
+ int errnum_;
+ } conditional_values_;
+
+#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+ static bool key_created_;
+#endif /* ACE_MT_SAFE */
+
+ /// For cleanup, at program termination.
+ static void close (void);
+
+ /// Decouple the OS layer from the ACE_Log_Msg layer.
+ static void sync_hook (const ACE_TCHAR *prg_name);
+
+ /// Return the TSS singleton thread descriptor
+ static ACE_OS_Thread_Descriptor *thr_desc_hook (void);
+
+ //friend void ACE_OS::cleanup_tss (const u_int);
+
+ // = Disallow these operations.
+ ACE_Log_Msg &operator= (const ACE_Log_Msg &);
+ ACE_Log_Msg (const ACE_Log_Msg &);
+};
+
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
+# if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || \
+ defined (ACE_HAS_TSS_EMULATION)
+/* static */
+# if defined (ACE_HAS_THR_C_DEST)
+# define LOCAL_EXTERN_PREFIX extern "C"
+# else
+# define LOCAL_EXTERN_PREFIX
+# endif /* ACE_HAS_THR_C_DEST */
+
+#if (defined (ACE_HAS_VERSIONED_NAMESPACE) && ACE_HAS_VERSIONED_NAMESPACE == 1)
+# define ACE_TSS_CLEANUP_NAME ACE_PREPROC_CONCATENATE(ACE_,ACE_PREPROC_CONCATENATE(ACE_VERSIONED_NAMESPACE_NAME, _TSS_cleanup))
+#else
+# define ACE_TSS_CLEANUP_NAME ACE_TSS_cleanup
+#endif /* ACE_HAS_VERSIONED_NAMESPACE == 1 */
+
+
+LOCAL_EXTERN_PREFIX
+void
+ACE_TSS_CLEANUP_NAME (void *ptr);
+# endif /* ACE_HAS_THREAD_SPECIFIC_STORAGE || ACE_HAS_TSS_EMULATION */
+#endif /* ACE_MT_SAFE */
+
+#if defined (__ACE_INLINE__)
+#include "ace/Log_Msg.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* ACE_LOG_MSG_H */