summaryrefslogtreecommitdiff
path: root/ace/Log_Msg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ace/Log_Msg.cpp')
-rw-r--r--ace/Log_Msg.cpp895
1 files changed, 895 insertions, 0 deletions
diff --git a/ace/Log_Msg.cpp b/ace/Log_Msg.cpp
new file mode 100644
index 00000000000..31015bddf5b
--- /dev/null
+++ b/ace/Log_Msg.cpp
@@ -0,0 +1,895 @@
+// Log_Msg.cpp
+// $Id$
+
+#define ACE_BUILD_DLL
+// We need this to get the status of ACE_NTRACE...
+#include "ace/config.h"
+
+// Turn off tracing for the duration of this file.
+#if defined (ACE_NTRACE)
+#undef ACE_NTRACE
+#endif /* ACE_NTRACE */
+#define ACE_NTRACE 1
+
+// This must come first to avoid "order of include" problems...
+
+#if !defined (ACE_HAS_INLINED_OSCALLS) && !defined (ACE_WIN32)
+#define ACE_HAS_INLINED_OSCALLS
+#include "ace/ACE.h"
+#undef ACE_HAS_INLINED_OSCALLS
+#else
+#include "ace/ACE.h"
+#endif /* !ACE_HAS_INLINED_OSCALLS */
+
+#include "ace/Thread.h"
+#include "ace/Synch.h"
+
+#include "ace/Log_Msg.h"
+
+// IPC conduit between sender and client daemon. This should be
+// included in the <ACE_Log_Msg> class, but due to "order of include"
+// problems it can't be...
+#if defined (ACE_WIN32)
+#include "ace/SPIPE_Connector.h"
+static ACE_SPIPE_Stream message_queue_;
+#else
+#include "ace/FIFO_Send_Msg.h"
+static ACE_FIFO_Send_Msg message_queue_;
+#endif /* ACE_WIN32 */
+
+ACE_ALLOC_HOOK_DEFINE(ACE_Log_Msg)
+
+#if defined (ACE_MT_SAFE)
+// Synchronize output operations.
+static ACE_Recursive_Thread_Mutex *lock_ = 0;
+
+static ACE_thread_key_t key_;
+
+/* static */
+void
+ACE_TSS_cleanup (void *ptr)
+{
+ delete ptr;
+}
+#endif /* ACE_MT_SAFE */
+
+ACE_Log_Msg *
+ACE_Log_Msg::instance (void)
+{
+#if defined (ACE_MT_SAFE)
+#if !defined (ACE_HAS_THREAD_SPECIFIC_STORAGE)
+#error "Platform must support thread-specific storage if threads are used..."
+#else
+ // TSS Singleton implementation.
+
+ static int once_ = 0;
+ static int count_ = 0;
+
+ if (once_ == 0)
+ {
+ // Synchronize Singleton creation (note that this may lose big
+ // if the compiler doesn't perform thread-safe initialization of
+ // local statics...).
+ static ACE_Thread_Mutex keylock_;
+ ACE_thread_mutex_t &lock = (ACE_thread_mutex_t &) keylock_.lock ();
+
+ ACE_OS::thread_mutex_lock (&lock);
+ if (once_ == 0)
+ {
+ // Initialize the static recursive lock here. Note that we
+ // can't rely on the constructor being called at this point.
+ ACE_NEW_RETURN (lock_, ACE_Recursive_Thread_Mutex, 0);
+
+ if (ACE_OS::thr_keycreate (&key_,
+ &ACE_TSS_cleanup) != 0)
+ {
+ ACE_OS::thread_mutex_unlock (&lock);
+ return 0; // Major problems, this should *never* happen!
+ }
+ once_ = 1;
+ }
+ ACE_OS::thread_mutex_unlock (&lock);
+ }
+
+ ACE_Log_Msg *tss_log_msg = 0;
+
+ // Get the tss_log_msg from thread-specific storage. Note that no locks
+ // are required here...
+ if (ACE_OS::thr_getspecific (key_,
+ (void **) &tss_log_msg) == -1)
+ return 0; // This should not happen!
+
+ // Check to see if this is the first time in for this thread.
+ if (tss_log_msg == 0)
+ {
+ // Allocate memory off the heap and store it in a pointer in
+ // thread-specific storage (on the stack...).
+
+ ACE_NEW_RETURN (tss_log_msg, ACE_Log_Msg, 0);
+
+ // Store the dynamically allocated pointer in thread-specific
+ // storage.
+ if (ACE_OS::thr_setspecific (key_,
+ (void *) tss_log_msg) != 0)
+ return 0; // Major problems, this should *never* happen!
+ }
+
+ return tss_log_msg;
+#endif /* ACE_HAS_THREAD_SPECIFIC_STORAGE */
+#else
+ // Singleton implementation.
+ static ACE_Log_Msg log_msg;
+
+ return &log_msg;
+#endif /* defined (ACE_MT_SAFE) */
+}
+
+// Name of the local host.
+const char *ACE_Log_Msg::local_host_ = 0;
+
+// Records the program name.
+const char *ACE_Log_Msg::program_name_ = 0;
+
+// Default is to use stderr.
+u_long ACE_Log_Msg::flags_ = ACE_Log_Msg::STDERR;
+
+// Process id of the current process.
+pid_t ACE_Log_Msg::pid_ = -1;
+
+// Current offset of msg_[].
+int ACE_Log_Msg::msg_off_ = 0;
+
+// Call after a fork to resynchronize the PID and PROGRAM_NAME
+// variables.
+
+void
+ACE_Log_Msg::sync (const char *prog_name)
+{
+ ACE_TRACE ("ACE_Log_Msg::sync");
+ if (prog_name)
+ {
+ ACE_OS::free ((void *) ACE_Log_Msg::program_name_);
+ ACE_Log_Msg::program_name_ = ACE_OS::strdup (prog_name);
+ }
+ ACE_Log_Msg::msg_off_ = 0;
+}
+
+u_long
+ACE_Log_Msg::flags (void)
+{
+ ACE_TRACE ("ACE_Log_Msg::flags");
+ u_long result;
+ ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, *lock_, 0));
+
+ result = ACE_Log_Msg::flags_;
+ return result;
+}
+
+void
+ACE_Log_Msg::set_flags (u_long flgs)
+{
+ ACE_TRACE ("ACE_Log_Msg::set_flags");
+ ACE_MT (ACE_GUARD (ACE_Recursive_Thread_Mutex, ace_mon, *lock_));
+
+ ACE_SET_BITS (ACE_Log_Msg::flags_, flgs);
+}
+
+void
+ACE_Log_Msg::clr_flags (u_long flgs)
+{
+ ACE_TRACE ("ACE_Log_Msg::clr_flags");
+ ACE_MT (ACE_GUARD (ACE_Recursive_Thread_Mutex, ace_mon, *lock_));
+
+ ACE_CLR_BITS (ACE_Log_Msg::flags_, flgs);
+}
+
+int
+ACE_Log_Msg::acquire (void)
+{
+ ACE_TRACE ("ACE_Log_Msg::acquire");
+#if defined (ACE_MT_SAFE)
+ return lock_->acquire ();
+#else
+ return 0;
+#endif /* ACE_MT_SAFE */
+}
+
+u_long
+ACE_Log_Msg::priority_mask (u_long n_mask)
+{
+ u_long o_mask = this->priority_mask_;
+ this->priority_mask_ = n_mask;
+ return o_mask;
+}
+
+u_long
+ACE_Log_Msg::priority_mask (void)
+{
+ return this->priority_mask_;
+}
+
+int
+ACE_Log_Msg::release (void)
+{
+ ACE_TRACE ("ACE_Log_Msg::release");
+
+#if defined (ACE_MT_SAFE)
+ return lock_->release ();
+#else
+ return 0;
+#endif /* ACE_MT_SAFE */
+}
+
+ACE_Log_Msg::ACE_Log_Msg (void)
+ : status_ (0),
+ errnum_ (0),
+ linenum_ (0),
+ ostream_ (0),
+ restart_ (1), // Restart by default...
+ thr_state_ (0),
+ trace_depth_ (0),
+ thr_handle_ (0),
+ trace_active_ (0),
+ tracing_enabled_ (0), // Off by default?
+ priority_mask_ (LM_SHUTDOWN // By default, all priorities are enabled.
+ | LM_TRACE
+ | LM_DEBUG
+ | LM_INFO
+ | LM_NOTICE
+ | LM_WARNING
+ | LM_STARTUP
+ | LM_ERROR
+ | LM_CRITICAL
+ | LM_ALERT
+ | LM_EMERGENCY)
+{
+ ACE_TRACE ("ACE_Log_Msg::ACE_Log_Msg");
+}
+
+// Open the sender-side of the Message ACE_Queue.
+
+int
+ACE_Log_Msg::open (const char *prog_name,
+ u_long flags,
+ const char *logger_key)
+{
+ ACE_TRACE ("ACE_Log_Msg::open");
+ ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, *lock_, -1));
+
+ if (prog_name)
+ ACE_Log_Msg::program_name_ = ACE_OS::strdup (prog_name);
+
+ int status = 0;
+
+ // Note that if we fail to open the message queue the default action
+ // is to use stderr (set via static initialization in the
+ // ACE_Log_Msg.C file).
+
+ if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::LOGGER))
+ {
+ if (logger_key == 0)
+ status = -1;
+ else
+#if defined (ACE_WIN32)
+ {
+ ACE_SPIPE_Connector con;
+ status = con.connect (message_queue_, ACE_SPIPE_Addr (logger_key));
+ }
+#else
+ status = message_queue_.open (logger_key);
+#endif /* ACE_WIN32 */
+
+ if (status == -1)
+ ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::STDERR);
+ else
+ ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER);
+ }
+
+ // Remember, ACE_Log_Msg::STDERR bit is on by default...
+ if (status != -1
+ && ACE_BIT_ENABLED (flags, ACE_Log_Msg::STDERR) == 0)
+ ACE_CLR_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::STDERR);
+
+ if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::VERBOSE))
+ ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::VERBOSE);
+
+ if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::OSTREAM))
+ {
+ ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::OSTREAM);
+ ACE_LOG_MSG->msg_ostream (&cerr);
+ }
+ if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::SILENT))
+ ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::SILENT);
+
+ return status;
+}
+
+// Valid Options (prefixed by '%', as in printf format strings) include:
+// 'a': exit the program at this point (var-argument is the exit status!)
+// 'c': print a character
+// 'i', 'd': print a decimal number
+// 'e', 'E', 'f', 'F', 'g', 'G': print a double
+// 'l', print line number where an error occurred.
+// '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': format the current process id
+// 'p': format the appropriate errno value from sys_errlist
+// 'r': call the function pointed to by the corresponding argument
+// 'R': print return status
+// 'S': format the appropriate _sys_siglist entry corresponding to var-argument.
+// 's': format a character string
+// 'T': print timestamp in hour:minute:sec:usec format.
+// 't': print thread id (1 if single-threaded)
+// 'u': print as unsigned int
+// 'X', 'x': print as a hex number
+// '%': format a single percent sign, '%'
+
+ssize_t
+ACE_Log_Msg::log (ACE_Log_Priority log_priority,
+ const char *format_str, ...)
+{
+ ACE_TRACE ("ACE_Log_Msg::log");
+
+ // Start of variable args section.
+ va_list argp;
+
+ va_start (argp, format_str);
+
+ int result = this->log (format_str, log_priority, argp);
+
+ va_end (argp);
+
+ return result;
+}
+
+ssize_t
+ACE_Log_Msg::log (const char *format_str,
+ ACE_Log_Priority log_priority,
+ va_list argp)
+{
+ ACE_TRACE ("ACE_Log_Msg::log");
+ // External decls.
+ extern int sys_nerr;
+ typedef void (*PTF)(...);
+
+ ACE_Log_Record log_record (log_priority,
+ ACE_OS::time ((time_t *) 0),
+ this->getpid ());
+ char *bp = this->msg ();
+ int abort_prog = 0;
+ int exit_value = 0;
+ int result = 0;
+ char *format = ACE_OS::strdup (format_str);
+ char *save_p = format; // Remember pointer for ACE_OS::free()
+
+ if (format == 0)
+ return -1;
+
+ if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::VERBOSE))
+ {
+ // Prepend the program name onto this message
+
+ if (ACE_Log_Msg::program_name_ != 0)
+ {
+ for (const char *s = ACE_Log_Msg::program_name_; (*bp = *s) != '\0'; s++)
+ bp++;
+
+ *bp++ = '|';
+ }
+ }
+
+ while (*format != '\0')
+ {
+ // Copy input to output until we encounter a %, however a
+ // % followed by another % is not a format specification.
+
+ if (*format != '%')
+ *bp++ = *format++;
+ else if (format[1] == '%') // An "escaped" '%' (just print one '%').
+ {
+ *bp++ = *format++; // Store first %
+ format++; // but skip second %
+ }
+ else
+ {
+ char c; // high use character
+ char *fp; // local format pointer
+ int wpc; // width/precision cnt
+ const int CONTINUE = 0;
+ const int SKIP_SPRINTF = -1; // We must skip the sprintf phase
+ const int SKIP_NUL_LOCATE = -2; // Skip locating the NUL character
+ int type = CONTINUE; // conversion type
+ int w[2]; // width/precision vals
+
+ // % starts a format specification that ends with one of
+ // "arnPpSsdciouxXfFeEgG". An optional width and/or precision
+ // (indicated by an "*") may be encountered prior to the
+ // nend of the specification, each consumes an int arg.
+ // A call to sprintf() does the actual conversion.
+
+ fp = format++; // Remember beginning of format.
+ wpc = 0; // Assume no width/precision seen.
+
+ while (type == CONTINUE)
+ {
+ switch (*format++)
+ {
+ case 'a': // Abort program after handling all of format string.
+ type = SKIP_SPRINTF;
+ abort_prog = 1;
+ exit_value = va_arg (argp, int);
+ ACE_OS::sprintf (bp, ""); // Make sure to NUL-terminate this...
+ break;
+ case 'l':
+ ACE_OS::sprintf (bp, "%d", this->linenum ());
+ type = SKIP_SPRINTF;
+ break;
+ case 'N':
+ {
+ const char *file = this->file ();
+ ACE_OS::sprintf (bp, "%s", file ? file : "<unknown file>");
+ type = SKIP_SPRINTF;
+ break;
+ }
+ case 'n': // Print the name of the program.
+ type = SKIP_SPRINTF;
+ ACE_OS::strcpy (bp, ACE_Log_Msg::program_name_ ?
+ ACE_Log_Msg::program_name_ : "<unknown>");
+ break;
+ case 'P': // format the current process id
+ type = SKIP_SPRINTF;
+ ACE_OS::sprintf (bp, "%d", this->getpid ());
+ break;
+ case 'p': // format the string assocated with the value of errno.
+ {
+ type = SKIP_SPRINTF;
+ errno = ACE::map_errno (errno);
+ if (errno >= 0 && errno < sys_nerr)
+ ACE_OS::sprintf (bp, "%s: %s",
+ va_arg (argp, char *), strerror (errno));
+ else
+ ACE_OS::sprintf (bp, "%s: <unknown error> = %d",
+ va_arg (argp, char *), errno);
+ break;
+ }
+ case 'R': // format the return status of the operation.
+ this->op_status (va_arg (argp, int));
+ ACE_OS::sprintf (bp, "%d", this->op_status ());
+ break;
+ case 'r': // Run (invoke) this subroutine.
+ {
+ int osave = ACE_Log_Msg::msg_off_;
+
+ if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::SILENT))
+ *bp++ = '{';
+ ACE_Log_Msg::msg_off_ = bp - this->msg_;
+
+ type = SKIP_SPRINTF;
+ (*va_arg (argp, PTF))();
+
+ if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::SILENT))
+ {
+ bp += ACE_OS::strlen (bp);
+ *bp++ = '}';
+ }
+ *bp = '\0';
+
+ ACE_Log_Msg::msg_off_ = osave;
+ break;
+ }
+ case 'S': // format the string associated with this signal number.
+ {
+ int sig = va_arg (argp, int);
+ type = SKIP_SPRINTF;
+#if defined (ACE_HAS_SYS_SIGLIST)
+ if (sig >= 0 && sig < NSIG)
+ ACE_OS::strcpy (bp, _sys_siglist[sig]);
+ else
+ ACE_OS::sprintf (bp, "<unknown signal> %d", sig);
+#else
+ ACE_OS::sprintf (bp, "signal %d", sig);
+#endif /* ACE_HAS_SYS_SIGLIST */
+ break;
+ }
+ case 'T': /* format the timestamp*/
+ {
+ type = SKIP_SPRINTF;
+ char day_and_time[35];
+ ACE_OS::sprintf (bp, "%s",
+ ACE::timestamp (day_and_time,
+ sizeof day_and_time));
+ break;
+ }
+ case 't': // format thread id.
+ type = SKIP_SPRINTF;
+#if defined (ACE_WIN32)
+ ACE_OS::sprintf (bp, "%u", ACE_Thread::self ());
+#else
+ ACE_hthread_t t_id;
+ ACE_Thread::self (t_id);
+ ACE_OS::sprintf (bp, "%u", t_id);
+#endif /* ACE_WIN32 */
+ break;
+ case 's':
+ type = 1 + wpc; // 1, 2, 3
+ break;
+ case 'd': case 'c': case 'i': case 'o':
+ case 'u': case 'x': case 'X':
+ type = 4 + wpc; // 4, 5, 6
+ break;
+ case 'F': case 'f': case 'e': case 'E':
+ case 'g': case 'G':
+ type = 7 + wpc; // 7, 8, 9
+ break;
+ case '*': // consume width/precision
+ w[wpc++] = va_arg (argp, int);
+ break;
+ default:
+ // ?
+ break;
+ }
+ }
+
+ if (type != SKIP_SPRINTF)
+ {
+ c = *format; // Remember char before we overwrite.
+ *format = 0; // Overwrite, terminating format.
+
+ switch (type)
+ {
+ case 1:
+ ACE_OS::sprintf (bp, fp, va_arg (argp, char *));
+ break;
+ case 2:
+ ACE_OS::sprintf (bp, fp, w[0], va_arg (argp, char *));
+ bp += w[0];
+ type = SKIP_NUL_LOCATE;
+ break;
+ case 3:
+ ACE_OS::sprintf (bp, fp, w[0], w[1], va_arg (argp, char *));
+ bp += w[0];
+ type = SKIP_NUL_LOCATE;
+ break;
+ case 4:
+ ACE_OS::sprintf (bp, fp, va_arg (argp, int));
+ break;
+ case 5:
+ ACE_OS::sprintf (bp, fp, w[0], va_arg (argp, int));
+ break;
+ case 6:
+ ACE_OS::sprintf (bp, fp, w[0], w[1], va_arg (argp, int));
+ break;
+ case 7:
+ ACE_OS::sprintf (bp, fp, va_arg (argp, double));
+ break;
+ case 8:
+ ACE_OS::sprintf (bp, fp, w[0], va_arg (argp, double));
+ break;
+ case 9:
+ ACE_OS::sprintf (bp, fp, w[0], w[1], va_arg (argp, double));
+ break;
+ }
+ *format = c; // Restore char we overwrote.
+ }
+
+ if (type != SKIP_NUL_LOCATE)
+ while (*bp != '\0') // Locate end of bp.
+ bp++;
+ }
+ }
+
+ *bp = '\0'; // Terminate bp, but don't auto-increment this!
+
+ ACE_OS::free (ACE_MALLOC_T (save_p));
+
+ // Only print the message if "SILENT" mode is disabled and the
+ // <priority_mask_> hasn't been reset to exclude this logging
+ // priority.
+ if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::SILENT) == 0
+ && ACE_BIT_ENABLED (this->priority_mask_, log_priority))
+ {
+ // Copy the message from thread-specific storage into the
+ // transfer buffer (this can be optimized away by changing other
+ // code...).
+ log_record.msg_data (this->msg ());
+ this->stop_tracing ();
+
+ // Make sure that the lock is help during all this.
+ ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon, *lock_, -1));
+
+ if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::STDERR))
+ log_record.print (ACE_Log_Msg::local_host_,
+ ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::VERBOSE),
+ stderr,
+ bp - this->msg ());
+ if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER))
+ {
+ ACE_Str_Buf log_msg ((void *) &log_record,
+ int (log_record.length ()));
+#if defined (ACE_HAS_STREAM_PIPES)
+ result = message_queue_.send (int (log_record.type ()),
+ &log_msg);
+#elif !defined (ACE_WIN32)
+ result = message_queue_.send (log_msg);
+#else
+ result = message_queue_.send ((const ACE_Str_Buf *) &log_msg,
+ (const ACE_Str_Buf *) 0);
+#endif /* ACE_HAS_STREAM_PIPES */
+ }
+ // Format the message and print it to stderr and/or ship it
+ // off to the log_client daemon, and/or print it to the
+ // ostream. This must come last, after the other two print
+ // operations (see the ACE_Log_Record::print method for
+ // details).
+
+ if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::OSTREAM)
+ && this->msg_ostream () != 0)
+ log_record.print (ACE_Log_Msg::local_host_,
+ ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::VERBOSE),
+ *this->msg_ostream (),
+ bp - this->msg ());
+ this->start_tracing ();
+ }
+
+ if (abort_prog)
+ ACE_OS::exit (exit_value);
+
+ return result;
+}
+
+// Calls log to do the actual print, but formats first.
+
+int
+ACE_Log_Msg::log_hexdump (ACE_Log_Priority log_priority,
+ char *buffer,
+ int size)
+{
+ char buf[ACE_Log_Record::MAXLOGMSGLEN - ACE_Log_Record::VERBOSE_LEN - 58];
+ // 58 for the HEXDUMP header;
+
+ char msg_buf[80];
+
+ buf[0] = 0; // in case size = 0
+
+ int len = ACE::format_hexdump (buffer, size, buf, sizeof buf);
+
+ int sz = ::sprintf (msg_buf, "HEXDUMP %d bytes", size);
+ if (len < size)
+ ::sprintf (msg_buf + sz, " (showing first %d bytes)", len);
+
+ // Now print out the formatted buffer.
+ this->log (log_priority, "%s\n%s", msg_buf, buf);
+ return 0;
+}
+
+void
+ACE_Log_Msg::set (const char *filename,
+ int line,
+ int status,
+ int err,
+ int rs,
+ ostream *os)
+{
+ ACE_TRACE ("ACE_Log_Msg::set");
+ this->file (filename);
+ this->linenum (line);
+ this->op_status (status);
+ this->errnum (err);
+ this->restart (rs);
+ this->msg_ostream (os);
+}
+
+void
+ACE_Log_Msg::dump (void) const
+{
+ ACE_TRACE ("ACE_Log_Msg::dump");
+
+ ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
+ ACE_DEBUG ((LM_DEBUG, "status_ = %d\n", this->status_));
+ ACE_DEBUG ((LM_DEBUG, "\nerrnum_ = %d\n", this->errnum_));
+ ACE_DEBUG ((LM_DEBUG, "\nlinenum_ = %d\n", this->linenum_));
+ ACE_DEBUG ((LM_DEBUG, "\nfile_ = %s\n", this->file_));
+ ACE_DEBUG ((LM_DEBUG, "\nmsg_ = %s\n", this->msg_));
+ ACE_DEBUG ((LM_DEBUG, "\nrestart_ = %s\n", this->restart_));
+ ACE_DEBUG ((LM_DEBUG, "\nostream_ = %x\n", this->ostream_));
+ ACE_DEBUG ((LM_DEBUG, "\nprogram_name_ = %s\n", this->program_name_ ? this->program_name_ : "<unknown>"));
+ ACE_DEBUG ((LM_DEBUG, "\nlocal_host_ = %s\n", this->local_host_ ? this->local_host_ : "<unknown>"));
+ ACE_DEBUG ((LM_DEBUG, "\npid_ = %d\n", this->getpid ()));
+ ACE_DEBUG ((LM_DEBUG, "\nflags_ = %d\n", this->flags_));
+ ACE_DEBUG ((LM_DEBUG, "\ntrace_depth_ = %d\n", this->trace_depth_));
+ ACE_DEBUG ((LM_DEBUG, "\trace_active_ = %d\n", this->trace_active_));
+ ACE_DEBUG ((LM_DEBUG, "\tracing_enabled_ = %d\n", this->tracing_enabled_));
+ ACE_DEBUG ((LM_DEBUG, "\npriority_mask_ = %s\n", this->priority_mask_));
+ if (this->thr_state_ != 0)
+ ACE_DEBUG ((LM_DEBUG, "\thr_state_ = %d\n", *this->thr_state_));
+ ACE_DEBUG ((LM_DEBUG, "\nmsg_off_ = %d\n", this->msg_off_));
+ message_queue_.dump ();
+#if defined (ACE_MT_SAFE)
+ lock_->dump ();
+ // Synchronize output operations.
+#endif /* ACE_MT_SAFE */
+ ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
+}
+
+void
+ACE_Log_Msg::op_status (int status)
+{
+ this->status_ = status;
+}
+
+int
+ACE_Log_Msg::op_status (void)
+{
+ return this->status_;
+}
+
+void
+ACE_Log_Msg::restart (int r)
+{
+ this->restart_ = r;
+}
+
+int
+ACE_Log_Msg::restart (void)
+{
+ return this->restart_;
+}
+
+int
+ACE_Log_Msg::errnum (void)
+{
+ return this->errnum_;
+}
+
+void
+ACE_Log_Msg::errnum (int e)
+{
+ this->errnum_ = e;
+}
+
+int
+ACE_Log_Msg::linenum (void)
+{
+ return this->linenum_;
+}
+
+void
+ACE_Log_Msg::linenum (int l)
+{
+ this->linenum_ = l;
+}
+
+int
+ACE_Log_Msg::inc (void)
+{
+ return this->trace_depth_++;
+}
+
+int
+ACE_Log_Msg::dec (void)
+{
+ return --this->trace_depth_;
+}
+
+int
+ACE_Log_Msg::trace_active (void)
+{
+ return this->trace_active_;
+}
+
+void
+ACE_Log_Msg::trace_active (int value)
+{
+ this->trace_active_ = value;
+}
+
+ACE_Thread_State *
+ACE_Log_Msg::thr_state (void)
+{
+ return this->thr_state_;
+}
+
+void
+ACE_Log_Msg::thr_state (ACE_Thread_State *ts)
+{
+ this->thr_state_ = ts;
+}
+
+ACE_hthread_t *
+ACE_Log_Msg::thr_handle (void)
+{
+ return this->thr_handle_;
+}
+
+void
+ACE_Log_Msg::thr_handle (ACE_hthread_t *th)
+{
+ this->thr_handle_ = th;
+}
+
+// Enable the tracing facility on a per-thread basis.
+
+void
+ACE_Log_Msg::start_tracing (void)
+{
+ this->tracing_enabled_ = 1;
+}
+
+// Disable the tracing facility on a per-thread basis.
+
+void
+ACE_Log_Msg::stop_tracing (void)
+{
+ this->tracing_enabled_ = 0;
+}
+
+int
+ACE_Log_Msg::tracing_enabled (void)
+{
+ return this->tracing_enabled_;
+}
+
+const char *
+ACE_Log_Msg::file (void)
+{
+ return this->file_;
+}
+
+void
+ACE_Log_Msg::file (const char *s)
+{
+ ACE_OS::strncpy (this->file_, s,
+ sizeof this->file_);
+}
+
+char *
+ACE_Log_Msg::msg (void)
+{
+ return this->msg_ + ACE_Log_Msg::msg_off_;
+}
+
+void
+ACE_Log_Msg::msg (char *m)
+{
+ ACE_OS::strncpy (this->msg_, m,
+ sizeof this->msg_);
+}
+
+ostream *
+ACE_Log_Msg::msg_ostream (void)
+{
+ return this->ostream_;
+}
+
+void
+ACE_Log_Msg::msg_ostream (ostream *m)
+{
+ this->ostream_ = m;
+}
+
+void
+ACE_Log_Msg::local_host (const char *s)
+{
+ if (s)
+ {
+ ACE_OS::free ((void *) ACE_Log_Msg::local_host_);
+ ACE_Log_Msg::local_host_ = ACE_OS::strdup (s);
+ }
+}
+
+const char *
+ACE_Log_Msg::local_host (void) const
+{
+ return ACE_Log_Msg::local_host_;
+}
+
+pid_t
+ACE_Log_Msg::getpid (void) const
+{
+ if (ACE_Log_Msg::pid_ == -1)
+ ACE_Log_Msg::pid_ = ACE_OS::getpid ();
+
+ return ACE_Log_Msg::pid_;
+}
+