ACE_Log_Msg Class Reference

Provides a variable length argument message logging abstraction. More...

#include <Log_Msg.h>

Collaboration diagram for ACE_Log_Msg:

Collaboration graph
[legend]
List of all members.

Public Types

enum  {
  STDERR = 1, LOGGER = 2, OSTREAM = 4, MSG_CALLBACK = 8,
  VERBOSE = 16, VERBOSE_LITE = 32, SILENT = 64, SYSLOG = 128,
  CUSTOM = 256
}
enum  MASK_TYPE { PROCESS = 0, THREAD = 1 }

Public Member Functions

 ACE_Log_Msg (void)
 Initialize logger.

 ~ACE_Log_Msg (void)
 cleanup logger.

int open (const ACE_TCHAR *prog_name, u_long options_flags=ACE_Log_Msg::STDERR, const ACE_TCHAR *logger_key=0)
 Initialize the ACE logging facility.

void set_flags (u_long f)
void clr_flags (u_long f)
u_long flags (void)
void sync (const ACE_TCHAR *program_name)
void op_status (int status)
int op_status (void)
void errnum (int)
int errnum (void)
void linenum (int)
 Set the line number where an error occurred.

int linenum (void)
 Get the line number where an error occurred.

void file (const char *)
 Set the file name where an error occurred.

const char * file (void)
 Get the file name where an error occurred.

void msg (const ACE_TCHAR *)
 Set the message that describes what type of error occurred.

const ACE_TCHARmsg (void)
 Get the message that describes what type of error occurred.

void restart (int)
int restart (void)
void msg_ostream (ACE_OSTREAM_TYPE *)
 Update the ostream without overwriting the delete_ostream_ flag.

void msg_ostream (ACE_OSTREAM_TYPE *, int delete_ostream)
ACE_OSTREAM_TYPE * msg_ostream (void) const
 Get the ostream that is used to print error messages.

ACE_Log_Msg_Callbackmsg_callback (ACE_Log_Msg_Callback *c)
ACE_Log_Msg_Callbackmsg_callback (void) const
int inc (void)
 Nesting depth increment.

int dec (void)
 Nesting depth decrement.

int trace_depth (void)
 Get trace depth.

void trace_depth (int)
 Set trace depth.

int trace_active (void)
 Set trace active status.

void trace_active (int value)
 Get trace active status.

ACE_Thread_Descriptorthr_desc (void) const
 Get the TSS thread descriptor.

void thr_desc (ACE_Thread_Descriptor *td)
void stop_tracing (void)
 Stop tracing status on a per-thread basis...

void start_tracing (void)
 Start tracing status on a per-thread basis...

int tracing_enabled (void)
 Query tracing status on a per-thread basis...

u_long priority_mask (MASK_TYPE=THREAD)
 Get the current ACE_Log_Priority mask.

u_long priority_mask (u_long, MASK_TYPE=THREAD)
 Set the ACE_Log_Priority mask, returns original mask.

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 *,...)
 Return true if the requested priority is enabled.

pid_t getpid (void) const
const ACE_TCHARlocal_host (void) const
 Get the name of the local host.

void local_host (const ACE_TCHAR *)
 Set the name of the local host.

void set (const char *file, int line, int op_status=-1, int errnum=0, int restart=1, ACE_OSTREAM_TYPE *os=0, ACE_Log_Msg_Callback *c=0)
void conditional_set (const char *file, int line, int op_status, int errnum)
ssize_t log (ACE_Log_Priority priority, const ACE_TCHAR *format,...)
ssize_t log (ACE_Log_Priority priority, const ACE_ANTI_TCHAR *format,...)
ssize_t log (const ACE_TCHAR *format, ACE_Log_Priority priority, va_list argp)
ssize_t log (ACE_Log_Record &log_record, int suppress_stderr=0)
int log_hexdump (ACE_Log_Priority log_priority, const char *buffer, size_t size, const ACE_TCHAR *text=0)
void dump (void) const
 Dump the state of an object.

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.

int acquire (void)
 Acquire the internal lock.

int release (void)
 Release the internal lock.


Static Public Member Functions

ACE_Log_Msginstance (void)
 Returns a pointer to the Singleton.

int last_error_adapter (void)
 Returns last error.

int exists (void)
 Returns non-null if an ACE_Log_Msg exists for the calling thread.

const ACE_TCHARprogram_name (void)
 Returns the current program name used for logging.

void disable_debug_messages (ACE_Log_Priority priority=LM_DEBUG)
void enable_debug_messages (ACE_Log_Priority priority=LM_DEBUG)
ACE_Log_Msg_Backendmsg_backend (ACE_Log_Msg_Backend *b)
ACE_Log_Msg_Backendmsg_backend (void)
void init_hook (ACE_OS_Log_Msg_Attributes &attributes)
void inherit_hook (ACE_OS_Thread_Descriptor *thr_desc, ACE_OS_Log_Msg_Attributes &attributes)

Public Attributes

 ACE_ALLOC_HOOK_DECLARE
 Declare the dynamic allocation hooks.


Private Member Functions

ACE_Log_Msgoperator= (const ACE_Log_Msg &)
 ACE_Log_Msg (const ACE_Log_Msg &)

Static Private Member Functions

void close (void)
 For cleanup, at program termination.

void sync_hook (const ACE_TCHAR *prg_name)
 Decouple the OS layer from the ACE_Log_Msg layer.

ACE_OS_Thread_Descriptorthr_desc_hook (void)
 Return the TSS singleton thread descriptor.


Private Attributes

int status_
 Status of operation (-1 means failure, >= 0 means success).

int errnum_
 Type of error that occurred (see <sys/errno.h>).

int linenum_
 Line number where the error occurred.

char file_ [MAXPATHLEN+1]
 File where the error occurred.

ACE_TCHARmsg_
int restart_
ACE_OSTREAM_TYPE * ostream_
 The ostream where logging messages can be written.

ACE_Log_Msg_Callbackmsg_callback_
 The callback object.

int trace_depth_
 Depth of the nesting for printing traces.

int trace_active_
 Are we already within an ACE_Trace constructor call?

int tracing_enabled_
 Are we allowing tracing in this thread?

int delete_ostream_
 Are we deleting this ostream?

ACE_Thread_Descriptorthr_desc_
u_long priority_mask_
int timestamp_
 Always timestamp?

struct {
   int   is_set_
   const char *   file_
   int   line_
   int   op_status_
   int   errnum_
conditional_values_

Static Private Attributes

u_long process_priority_mask_
const ACE_TCHARprogram_name_ = 0
 Records the program name.

const ACE_TCHARlocal_host_ = 0
 Name of the local host (used when printing messages).

pid_t pid_ = -1
 Process id of the current process.

u_long flags_ = ACE_Log_Msg::STDERR
 Default is to use stderr.

long msg_off_ = 0
 Offset of msg_[].

int instance_count_ = 0
u_long default_priority_mask_ = 0

Detailed Description

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 stdout, 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 priority_mask_ object attribute is thread- specific and specifies the priority levels logged by the thread. The 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 priority_mask_ and all levels are enabled for 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.

Definition at line 148 of file Log_Msg.h.


Member Enumeration Documentation

anonymous enum
 

Enumeration values:
STDERR  Write messages to stderr.
LOGGER  Write messages to the local client logger deamon.
OSTREAM  Write messages to the ostream * stored in thread-specific storage.
MSG_CALLBACK  Write messages to the callback object.
VERBOSE  Display messages in a verbose manner.
VERBOSE_LITE  Display messages in a less verbose manner (i.e., only print information that can change between calls).
SILENT  Do not print messages at all (just leave in thread-specific storage for later inspection).
SYSLOG  Write messages to the system's event log.
CUSTOM  Write messages to the user provided backend.

Definition at line 153 of file Log_Msg.h.

00154   {
00155     /// Write messages to stderr.
00156     STDERR = 1,
00157     /// Write messages to the local client logger deamon.
00158     LOGGER = 2,
00159     /// Write messages to the ostream * stored in thread-specific
00160     /// storage.
00161     OSTREAM = 4,
00162     /// Write messages to the callback object.
00163     MSG_CALLBACK = 8,
00164     /// Display messages in a verbose manner.
00165     VERBOSE = 16,
00166     /// Display messages in a less verbose manner (i.e., only print
00167     /// information that can change between calls).
00168     VERBOSE_LITE = 32,
00169     /// Do not print messages at all (just leave in thread-specific
00170     /// storage for later inspection).
00171     SILENT = 64,
00172     /// Write messages to the system's event log.
00173     SYSLOG = 128,
00174     /// Write messages to the user provided backend
00175     CUSTOM = 256
00176  };

enum ACE_Log_Msg::MASK_TYPE
 

Enumeration values:
PROCESS 
THREAD 

Definition at line 407 of file Log_Msg.h.

00408   {
00409     PROCESS = 0,
00410     THREAD = 1
00411   } MASK_TYPE;


Constructor & Destructor Documentation

ACE_Log_Msg::ACE_Log_Msg void   ) 
 

Initialize logger.

Definition at line 647 of file Log_Msg.cpp.

References ACE_GUARD, ACE_MAXLOGMSGLEN, ACE_NEW_NORETURN, ACE_TCHAR, close(), conditional_values_, ACE_OS::getenv(), inherit_hook(), init_hook(), instance_count_, ACE_Base_Thread_Adapter::set_log_msg_hooks(), ACE_OS::strcmp(), sync_hook(), thr_desc_hook(), and timestamp_.

00648   : status_ (0),
00649     errnum_ (0),
00650     linenum_ (0),
00651     msg_ (0),
00652     restart_ (1),  // Restart by default...
00653     ostream_ (0),
00654     msg_callback_ (0),
00655     trace_depth_ (0),
00656     trace_active_ (0),
00657     tracing_enabled_ (1), // On by default?
00658     delete_ostream_(0),
00659     thr_desc_ (0),
00660     priority_mask_ (default_priority_mask_),
00661     timestamp_ (0)
00662 {
00663   // ACE_TRACE ("ACE_Log_Msg::ACE_Log_Msg");
00664 
00665   ACE_MT (ACE_GUARD (ACE_Recursive_Thread_Mutex, ace_mon,
00666                      *ACE_Log_Msg_Manager::get_lock ()));
00667   ++instance_count_;
00668 
00669   if (this->instance_count_ == 1)
00670     ACE_Base_Thread_Adapter::set_log_msg_hooks (ACE_Log_Msg::init_hook,
00671                                                 ACE_Log_Msg::inherit_hook,
00672                                                 ACE_Log_Msg::close,
00673                                                 ACE_Log_Msg::sync_hook,
00674                                                 ACE_Log_Msg::thr_desc_hook);
00675 
00676   this->conditional_values_.is_set_ = 0;
00677 
00678   char *timestamp = ACE_OS::getenv ("ACE_LOG_TIMESTAMP");
00679   if (timestamp != 0)
00680     {
00681       // If variable is set or is set to date tag so we print date and time.
00682       if (ACE_OS::strcmp (timestamp, "TIME") == 0)
00683         {
00684           this->timestamp_ = 1;
00685         }
00686       else if (ACE_OS::strcmp (timestamp, "DATE") == 0)
00687         {
00688           this->timestamp_ = 2;
00689         }
00690     }
00691 
00692   ACE_NEW_NORETURN (this->msg_, ACE_TCHAR[ACE_MAXLOGMSGLEN+1]);
00693 }

ACE_Log_Msg::~ACE_Log_Msg void   ) 
 

cleanup logger.

Definition at line 695 of file Log_Msg.cpp.

References ACE_GUARD, ACE_Log_Msg_Backend::close(), delete_ostream_, ACE_OS::fclose(), ACE_OS::free(), instance_count_, local_host_, msg_, ostream_, and program_name_.

00696 {
00697 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00698 
00699   int instance_count;
00700 
00701   // Only hold the guard while updating the instance_count_.
00702   // If ACE_Log_Msg_Manager::close () is called, the lock will
00703   // be deleted.
00704   {
00705     ACE_MT (ACE_GUARD (ACE_Recursive_Thread_Mutex, ace_mon,
00706                        *ACE_Log_Msg_Manager::get_lock ()));
00707     instance_count = --instance_count_;
00708   }
00709   // Release the guard.
00710 
00711 #else  /* ! ACE_MT_SAFE */
00712   int instance_count = --instance_count_;
00713 #endif /* ! ACE_MT_SAFE */
00714 
00715   // If this is the last instance then cleanup.  Only the last
00716   // thread to destroy its ACE_Log_Msg instance should execute
00717   // this block.
00718   if (instance_count == 0)
00719     {
00720       // Destroy the message queue instance.
00721       if (ACE_Log_Msg_Manager::log_backend_ != 0)
00722         ACE_Log_Msg_Manager::log_backend_->close ();
00723 
00724       // Close down custom backend
00725       if (ACE_Log_Msg_Manager::custom_backend_ != 0)
00726         ACE_Log_Msg_Manager::custom_backend_->close ();
00727 
00728 #     if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00729 #       if defined (ACE_HAS_TSS_EMULATION)
00730           ACE_Log_Msg_Manager::close ();
00731 #       endif /* ACE_HAS_TSS_EMULATION */
00732 #     endif /* ACE_MT_SAFE */
00733 
00734       if (ACE_Log_Msg::program_name_)
00735         {
00736           ACE_OS::free ((void *) ACE_Log_Msg::program_name_);
00737           ACE_Log_Msg::program_name_ = 0;
00738         }
00739 
00740       if (ACE_Log_Msg::local_host_)
00741         {
00742           ACE_OS::free ((void *) ACE_Log_Msg::local_host_);
00743           ACE_Log_Msg::local_host_ = 0;
00744         }
00745     }
00746 
00747   //
00748   // do we need to close and clean up?
00749   //
00750   if (this->delete_ostream_ == 1)
00751 #if defined (ACE_LACKS_IOSTREAM_TOTALLY)
00752     {
00753       ACE_OS::fclose (this->ostream_);
00754     }
00755 #else
00756     {
00757       delete ostream_;
00758       ostream_ = 0;
00759     }
00760 #endif
00761 
00762   delete[] this->msg_;
00763 }

ACE_Log_Msg::ACE_Log_Msg const ACE_Log_Msg  )  [private]
 


Member Function Documentation

int ACE_Log_Msg::acquire void   ) 
 

Acquire the internal lock.

Definition at line 590 of file Log_Msg.cpp.

References ACE_TRACE, and ACE_Recursive_Thread_Mutex::acquire().

Referenced by ACE_Logging_Strategy::handle_timeout().

00591 {
00592   ACE_TRACE ("ACE_Log_Msg::acquire");
00593 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00594   return ACE_Log_Msg_Manager::get_lock ()->acquire ();
00595 #else  /* ! ACE_MT_SAFE */
00596   return 0;
00597 #endif /* ! ACE_MT_SAFE */
00598 }

void ACE_Log_Msg::close void   )  [static, private]
 

For cleanup, at program termination.

Definition at line 454 of file Log_Msg.cpp.

References ACE_DEBUG, ACE_LIB_TEXT, ACE_Thread::getspecific(), LM_DEBUG, ACE_Thread::setspecific(), ACE_OS::thread_mutex_lock(), and ACE_OS::thread_mutex_unlock().

Referenced by ACE_Log_Msg().

00455 {
00456   // This call needs to go here to avoid memory leaks.
00457   ACE_MT (ACE_Log_Msg_Manager::close ());
00458 
00459   // Please note that this will be called by a statement that is
00460   // harded coded into the ACE_Object_Manager's shutdown sequence, in
00461   // its destructor.
00462 
00463 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0) && \
00464     (defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || \
00465      defined (ACE_HAS_TSS_EMULATION))
00466 
00467      if (key_created_ == 1)
00468        {
00469          ACE_thread_mutex_t *lock =
00470            reinterpret_cast<ACE_thread_mutex_t *> (
00471              ACE_OS_Object_Manager::preallocated_object
00472              [ACE_OS_Object_Manager::ACE_LOG_MSG_INSTANCE_LOCK]);
00473          ACE_OS::thread_mutex_lock (lock);
00474 
00475          if (key_created_ == 1)
00476            {
00477              // The same as the ACE_TSS_Cleanup's own key doesn't get
00478              // detached, the log_msg_tss_key_ won't get detached
00479              // until ACE_TSS_Cleanup::free_all_keys_left, so it will
00480              // be in the ACE_TSS_Cleanup::table_.  However, there's
00481              // no resource associated with it, so we don't need to
00482              // keyfree it.  The dynamic memory associated with it was
00483              // already deleted by ACE_TSS_Cleanup::exit (), so we
00484              // don't want to access it again.
00485              key_created_ = 0;
00486 #ifdef ACE_HAS_BROKEN_THREAD_KEYFREE
00487              // for some systems, e.g. LynxOS, we need to ensure that
00488              // any registered thread destructor action for this thread
00489              // is disabled. Otherwise in the event of a dynamic library
00490              // unload of libACE, by a program not linked with libACE,
00491              // ACE_TSS_cleanup will be invoked after libACE has been unloaded.
00492 
00493              ACE_Log_Msg *tss_log_msg = 0;
00494 
00495              // Get the tss_log_msg from thread-specific storage.
00496              if ( ACE_Thread::getspecific (*(log_msg_tss_key ()),
00497                            ACE_reinterpret_cast (void **, &tss_log_msg)) != -1
00498                   && tss_log_msg)
00499              {
00500                // we haven't been cleaned up
00501                ACE_TSS_cleanup(tss_log_msg);
00502 
00503                if ( ACE_Thread::setspecific( (*log_msg_tss_key()),
00504                                              (void *)NULL ) != 0 )
00505                {
00506                   ACE_DEBUG ((LM_DEBUG,
00507                               ACE_LIB_TEXT ("(%P|%t) ACE_Log_Msg::close failed to ACE_Thread::setspecific to NULL\n")));
00508                }
00509 
00510              }
00511 #endif /* ACE_HAS_BROKEN_THREAD_KEYFREE */
00512            }
00513 
00514          ACE_OS::thread_mutex_unlock (lock);
00515        }
00516 #endif /* (ACE_HAS_THREAD_SPECIFIC_STORAGE || ACE_HAS_TSS_EMULATION) && ACE_MT_SAFE */
00517 }

void ACE_Log_Msg::clr_flags u_long  f  ) 
 

Disable the bits in the logger's options flags.

Definition at line 580 of file Log_Msg.cpp.

References ACE_CLR_BITS, ACE_GUARD, ACE_TRACE, and flags_.

Referenced by ACE_Logging_Strategy::init().

00581 {
00582   ACE_TRACE ("ACE_Log_Msg::clr_flags");
00583   ACE_MT (ACE_GUARD (ACE_Recursive_Thread_Mutex, ace_mon,
00584                      *ACE_Log_Msg_Manager::get_lock ()));
00585 
00586   ACE_CLR_BITS (ACE_Log_Msg::flags_, flgs);
00587 }

void ACE_Log_Msg::conditional_set const char *  file,
int  line,
int  op_status,
int  errnum
 

These values are only actually set if the requested priority is enabled.

Definition at line 2239 of file Log_Msg.cpp.

References conditional_values_.

02243 {
02244   this->conditional_values_.is_set_ = 1;
02245   this->conditional_values_.file_ = filename;
02246   this->conditional_values_.line_ = line;
02247   this->conditional_values_.op_status_ = status;
02248   this->conditional_values_.errnum_ = err;
02249 }

int ACE_Log_Msg::dec void   ) 
 

Nesting depth decrement.

Definition at line 2353 of file Log_Msg.cpp.

References trace_depth_.

Referenced by log(), and ACE_Trace::~ACE_Trace().

02354 {
02355   return this->trace_depth_ == 0 ? 0 : --this->trace_depth_;
02356 }

void ACE_Log_Msg::disable_debug_messages ACE_Log_Priority  priority = LM_DEBUG  )  [static]
 

Clears the flag from the default priority mask used to initialize ACE_Log_Msg instances.

Definition at line 407 of file Log_Msg.cpp.

References ACE_CLR_BITS, default_priority_mask_, instance(), and priority_mask().

Referenced by ACE_Service_Config::fini_svcs(), and ACE_Service_Gestalt::open_i().

00408 {
00409   ACE_CLR_BITS (ACE_Log_Msg::default_priority_mask_, priority);
00410   ACE_Log_Msg *i = ACE_Log_Msg::instance ();
00411   i->priority_mask (i->priority_mask () & ~priority);
00412 }

void ACE_Log_Msg::dump void   )  const
 

Dump the state of an object.

Definition at line 2252 of file Log_Msg.cpp.

References ACE_BEGIN_DUMP, ACE_DEBUG, ACE_END_DUMP, ACE_LIB_TEXT, ACE_TRACE, LM_DEBUG, and ACE_Thread_Descriptor_Base::state().

02253 {
02254 #if defined (ACE_HAS_DUMP)
02255   ACE_TRACE ("ACE_Log_Msg::dump");
02256 
02257   ACE_DEBUG ((LM_DEBUG, ACE_BEGIN_DUMP, this));
02258   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("status_ = %d\n"), this->status_));
02259   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nerrnum_ = %d\n"), this->errnum_));
02260   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nlinenum_ = %d\n"), this->linenum_));
02261   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nfile_ = %C\n"), this->file_));
02262   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nmsg_ = %s\n"), this->msg_));
02263   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nrestart_ = %d\n"), this->restart_));
02264   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nostream_ = %@\n"), this->ostream_));
02265   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nmsg_callback_ = %@\n"),
02266               this->msg_callback_));
02267   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nprogram_name_ = %s\n"),
02268               this->program_name_ ? this->program_name_
02269                                   : ACE_LIB_TEXT ("<unknown>")));
02270   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nlocal_host_ = %s\n"),
02271               this->local_host_ ? this->local_host_
02272                                 : ACE_LIB_TEXT ("<unknown>")));
02273   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\npid_ = %d\n"), this->getpid ()));
02274   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nflags_ = 0x%x\n"), this->flags_));
02275   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\ntrace_depth_ = %d\n"),
02276               this->trace_depth_));
02277   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\ntrace_active_ = %d\n"),
02278               this->trace_active_));
02279   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\ntracing_enabled_ = %d\n"),
02280               this->tracing_enabled_));
02281   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\npriority_mask_ = 0x%x\n"),
02282               this->priority_mask_));
02283   if (this->thr_desc_ != 0 && this->thr_desc_->state () != 0)
02284     ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nthr_state_ = %d\n"),
02285                 this->thr_desc_->state ()));
02286   ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT ("\nmsg_off_ = %d\n"), this->msg_off_));
02287 
02288   // Be sure that there is a message_queue_, with multiple threads.
02289   ACE_MT (ACE_Log_Msg_Manager::init_backend ());
02290 
02291   ACE_MT (ACE_Log_Msg_Manager::get_lock ()->dump ());
02292   // Synchronize output operations.
02293 
02294   ACE_DEBUG ((LM_DEBUG, ACE_END_DUMP));
02295 #endif /* ACE_HAS_DUMP */
02296 }

void ACE_Log_Msg::enable_debug_messages ACE_Log_Priority  priority = LM_DEBUG  )  [static]
 

Sets the flag in the default priority mask used to initialize ACE_Log_Msg instances.

Definition at line 396 of file Log_Msg.cpp.

References ACE_SET_BITS, default_priority_mask_, instance(), and priority_mask().

Referenced by ACE_Service_Config::fini_svcs(), and ACE_Service_Gestalt::open_i().

00397 {
00398   ACE_SET_BITS (ACE_Log_Msg::default_priority_mask_, priority);
00399   ACE_Log_Msg *i = ACE_Log_Msg::instance ();
00400   i->priority_mask (i->priority_mask () | priority);
00401 }

int ACE_Log_Msg::errnum void   ) 
 

Get the value of the errnum (by convention this corresponds to errno).

Definition at line 2323 of file Log_Msg.cpp.

References errnum_.

Referenced by set().

02324 {
02325   return this->errnum_;
02326 }

void ACE_Log_Msg::errnum int   ) 
 

Set the value of the errnum (by convention this corresponds to errno).

Definition at line 2329 of file Log_Msg.cpp.

References errnum_.

02330 {
02331   this->errnum_ = e;
02332 }

int ACE_Log_Msg::exists void   )  [static]
 

Returns non-null if an ACE_Log_Msg exists for the calling thread.

Definition at line 251 of file Log_Msg.cpp.

References ACE_Thread::getspecific().

Referenced by init_hook().

00252 {
00253 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00254 # if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || \
00255      defined (ACE_HAS_TSS_EMULATION)
00256   ACE_Log_Msg *tss_log_msg = 0;
00257 
00258   // Get the tss_log_msg from thread-specific storage.
00259   return key_created_
00260     && ACE_Thread::getspecific (*(log_msg_tss_key ()),
00261                                 reinterpret_cast<void **> (&tss_log_msg)) != -1
00262     && tss_log_msg;
00263 # else
00264 #   error "Platform must support thread-specific storage if threads are used."
00265 # endif /* ACE_HAS_THREAD_SPECIFIC_STORAGE || ACE_HAS_TSS_EMULATION */
00266 #else  /* ! ACE_MT_SAFE */
00267   return 1;
00268 #endif /* ! ACE_MT_SAFE */
00269 }

const char * ACE_Log_Msg::file void   ) 
 

Get the file name where an error occurred.

Definition at line 2446 of file Log_Msg.cpp.

Referenced by set().

02447 {
02448   return this->file_;
02449 }

void ACE_Log_Msg::file const char *   ) 
 

Set the file name where an error occurred.

Definition at line 2452 of file Log_Msg.cpp.

References ACE_OS::strsncpy().

02453 {
02454   ACE_OS::strsncpy (this->file_, s, sizeof this->file_);
02455 }

u_long ACE_Log_Msg::flags void   ) 
 

Return the bits in the logger's options flags.

Definition at line 558 of file Log_Msg.cpp.

References ACE_GUARD_RETURN, ACE_TRACE, and flags_.

Referenced by ACE_Service_Config::open_i().

00559 {
00560   ACE_TRACE ("ACE_Log_Msg::flags");
00561   u_long result;
00562   ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
00563                             *ACE_Log_Msg_Manager::get_lock (), 0));
00564 
00565   result = ACE_Log_Msg::flags_;
00566   return result;
00567 }

pid_t ACE_Log_Msg::getpid void   )  const
 

Optimize reading of the pid (avoids a system call if the value is cached...).

Definition at line 2558 of file Log_Msg.cpp.

References ACE_OS::getpid(), and pid_.

Referenced by log().

02559 {
02560   if (ACE_Log_Msg::pid_ == -1)
02561     ACE_Log_Msg::pid_ = ACE_OS::getpid ();
02562 
02563   return ACE_Log_Msg::pid_;
02564 }

int ACE_Log_Msg::inc void   ) 
 

Nesting depth increment.

Definition at line 2347 of file Log_Msg.cpp.

References trace_depth_.

Referenced by ACE_Trace::ACE_Trace(), and log().

02348 {
02349   return this->trace_depth_++;
02350 }

void ACE_Log_Msg::inherit_hook ACE_OS_Thread_Descriptor thr_desc,
ACE_OS_Log_Msg_Attributes attributes
[static]
 

Inherit hook, the attributes field is a ACE_OS_Log_Msg_Attributes object, invoke the inherit_log_msg() method on it, then destroy it and set the attribute argument to 0.

Definition at line 2610 of file Log_Msg.cpp.

References ACE_LOG_MSG, msg_ostream(), ACE_OS_Log_Msg_Attributes::ostream_, priority_mask(), ACE_OS_Log_Msg_Attributes::priority_mask_, restart(), ACE_OS_Log_Msg_Attributes::restart_, start_tracing(), thr_desc(), trace_depth(), ACE_OS_Log_Msg_Attributes::trace_depth_, and ACE_OS_Log_Msg_Attributes::tracing_enabled_.

Referenced by ACE_Log_Msg(), and ACE_NT_Service::inherit_log_msg_attributes().

02612 {
02613 #if !defined (ACE_THREADS_DONT_INHERIT_LOG_MSG)  && \
02614     !defined (ACE_HAS_MINIMAL_ACE_OS)
02615   // Inherit the logging features if the parent thread has an
02616   // <ACE_Log_Msg>.  Note that all of the following operations occur
02617   // within thread-specific storage.
02618   ACE_Log_Msg *new_log = ACE_LOG_MSG;
02619 
02620   // Note that we do not inherit the callback because this might have
02621   // been allocated off of the stack of the original thread, in which
02622   // case all hell would break loose...
02623 
02624   if (attributes.ostream_)
02625     {
02626       new_log->msg_ostream (attributes.ostream_);
02627       new_log->priority_mask (attributes.priority_mask_);
02628 
02629       if (attributes.tracing_enabled_)
02630         new_log->start_tracing ();
02631 
02632       new_log->restart (attributes.restart_);
02633       new_log->trace_depth (attributes.trace_depth_);
02634     }
02635 
02636   // @@ Now the TSS Log_Msg has been created, cache my thread
02637   // descriptor in.
02638 
02639   if (thr_desc != 0)
02640     // This downcast is safe.  We do it to avoid having to #include
02641     // ace/Thread_Manager.h.
02642     new_log->thr_desc (static_cast<ACE_Thread_Descriptor *> (thr_desc));
02643   // Block the thread from proceeding until
02644   // thread manager has thread descriptor ready.
02645 #endif /* ! ACE_THREADS_DONT_INHERIT_LOG_MSG  &&  ! ACE_HAS_MINIMAL_ACE_OS */
02646 }

void ACE_Log_Msg::init_hook ACE_OS_Log_Msg_Attributes attributes  )  [static]
 

Parameters:
attributes  Init hook, create a Log_Msg_Attribute object, initialize its attributes from the TSS Log_Msg and save the object in the attributes argument

Definition at line 2587 of file Log_Msg.cpp.

References ACE_LOG_MSG, exists(), msg_ostream(), priority_mask(), restart(), trace_depth(), and tracing_enabled().

Referenced by ACE_Log_Msg(), and ACE_NT_Service::capture_log_msg_attributes().

02593 {
02594 # if defined (ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS)
02595   attributes.seh_except_selector_ = selector;
02596   attributes.seh_except_handler_ = handler;
02597 # endif /* ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS */
02598   if (ACE_Log_Msg::exists ())
02599     {
02600       ACE_Log_Msg *inherit_log = ACE_LOG_MSG;
02601       attributes.ostream_ = inherit_log->msg_ostream ();
02602       attributes.priority_mask_ = inherit_log->priority_mask ();
02603       attributes.tracing_enabled_ = inherit_log->tracing_enabled ();
02604       attributes.restart_ = inherit_log->restart ();
02605       attributes.trace_depth_ = inherit_log->trace_depth ();
02606     }
02607 }

ACE_Log_Msg * ACE_Log_Msg::instance void   )  [static]
 

Returns a pointer to the Singleton.

Definition at line 272 of file Log_Msg.cpp.

References ACE_NEW_RETURN, ACE_NO_HEAP_CHECK, ACE_Object_Manager::at_exit(), ACE_Thread::getspecific(), ACE_Log_Msg_Manager::init_backend(), ACE_Thread::keycreate(), ACE_Cleanup_Adapter< TYPE >::object(), ACE_Thread::setspecific(), ACE_OS_Object_Manager::starting_up(), ACE_OS::thread_mutex_lock(), and ACE_OS::thread_mutex_unlock().

Referenced by __ace_assert(), disable_debug_messages(), and enable_debug_messages().

00273 {
00274 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00275 # if defined (ACE_HAS_THREAD_SPECIFIC_STORAGE) || \
00276      defined (ACE_HAS_TSS_EMULATION)
00277   // TSS Singleton implementation.
00278 
00279   if (key_created_ == 0)
00280     {
00281       ACE_thread_mutex_t *lock =
00282         reinterpret_cast<ACE_thread_mutex_t *> (
00283           ACE_OS_Object_Manager::preallocated_object
00284             [ACE_OS_Object_Manager::ACE_LOG_MSG_INSTANCE_LOCK]);
00285 
00286       if (1 == ACE_OS_Object_Manager::starting_up())
00287         //This function is called before ACE_OS_Object_Manager is
00288         //initialized.  So the lock might not be valid.  Assume it's
00289         //single threaded and so don't need the lock.
00290         ;
00291       else
00292         ACE_OS::thread_mutex_lock (lock);
00293 
00294       if (key_created_ == 0)
00295         {
00296           // Allocate the Singleton lock.
00297           ACE_Log_Msg_Manager::get_lock ();
00298 
00299           {
00300             ACE_NO_HEAP_CHECK;
00301             if (ACE_Thread::keycreate (log_msg_tss_key (),
00302                                        &ACE_TSS_CLEANUP_NAME) != 0)
00303               {
00304                 if (1 == ACE_OS_Object_Manager::starting_up())
00305                   //This function is called before ACE_OS_Object_Manager is
00306                   //initialized.  So the lock might not be valid.  Assume it's
00307                   //single threaded and so don't need the lock.
00308                   ;
00309                 else
00310                 ACE_OS::thread_mutex_unlock (lock);
00311                 return 0; // Major problems, this should *never* happen!
00312               }
00313           }
00314 
00315           key_created_ = 1;
00316         }
00317 
00318       if (1 == ACE_OS_Object_Manager::starting_up())
00319         //This function is called before ACE_OS_Object_Manager is
00320         //initialized.  So the lock might not be valid.  Assume it's
00321         //single threaded and so don't need the lock.
00322         ;
00323       else
00324         ACE_OS::thread_mutex_unlock (lock);
00325     }
00326 
00327   ACE_Log_Msg *tss_log_msg = 0;
00328 
00329   // Get the tss_log_msg from thread-specific storage.
00330   if (ACE_Thread::getspecific (*(log_msg_tss_key ()),
00331                                reinterpret_cast<void **> (&tss_log_msg)) == -1)
00332     return 0; // This should not happen!
00333 
00334   // Check to see if this is the first time in for this thread.
00335   if (tss_log_msg == 0)
00336     {
00337       // Allocate memory off the heap and store it in a pointer in
00338       // thread-specific storage (on the stack...).  Stop heap
00339       // checking, the memory will always be freed by the thread
00340       // rundown because of the TSS callback set up when the key was
00341       // created. This prevents from getting these blocks reported as
00342       // memory leaks.
00343       {
00344         ACE_NO_HEAP_CHECK;
00345 
00346         ACE_NEW_RETURN (tss_log_msg,
00347                         ACE_Log_Msg,
00348                         0);
00349         // Store the dynamically allocated pointer in thread-specific
00350         // storage.  It gets deleted via the ACE_TSS_cleanup function
00351         // when the thread terminates.
00352 
00353         if (ACE_Thread::setspecific (*(log_msg_tss_key()),
00354                                      reinterpret_cast<void *> (tss_log_msg))
00355             != 0)
00356           return 0; // Major problems, this should *never* happen!
00357       }
00358     }
00359 
00360   return tss_log_msg;
00361 # else
00362 #  error "Platform must support thread-specific storage if threads are used."
00363 # endif /* ACE_HAS_THREAD_SPECIFIC_STORAGE || ACE_HAS_TSS_EMULATION */
00364 #else  /* ! ACE_MT_SAFE */
00365   // We don't have threads, we cannot call
00366   // ACE_Log_Msg_Manager::get_lock () to initialize the logger
00367   // callback, so instead we do it here.
00368   if (ACE_Log_Msg_Manager::init_backend () == -1)
00369     return 0;
00370 
00371   // Singleton implementation.
00372   static ACE_Cleanup_Adapter<ACE_Log_Msg> *log_msg = 0;
00373   if (log_msg == 0)
00374     {
00375       ACE_NEW_RETURN (log_msg, ACE_Cleanup_Adapter<ACE_Log_Msg>, 0);
00376       // Register the instance for destruction at program termination.
00377       ACE_Object_Manager::at_exit (log_msg);
00378     }
00379 
00380   return &log_msg->object ();
00381 #endif /* ! ACE_MT_SAFE */
00382 }

int ACE_Log_Msg::last_error_adapter void   )  [static]
 

Returns last error.

Definition at line 387 of file Log_Msg.cpp.

References ACE_OS::last_error().

Referenced by __ace_assert().

00388 {
00389   return ACE_OS::last_error ();
00390 }

int ACE_Log_Msg::linenum void   ) 
 

Get the line number where an error occurred.

Definition at line 2335 of file Log_Msg.cpp.

References linenum_.

Referenced by set().

02336 {
02337   return this->linenum_;
02338 }

void ACE_Log_Msg::linenum int   ) 
 

Set the line number where an error occurred.

Definition at line 2341 of file Log_Msg.cpp.

References linenum_.

02342 {
02343   this->linenum_ = l;
02344 }

void ACE_Log_Msg::local_host const ACE_TCHAR  ) 
 

Set the name of the local host.

Definition at line 2538 of file Log_Msg.cpp.

References ACE_ALLOCATOR, ACE_NO_HEAP_CHECK, ACE_TCHAR, ACE_OS::free(), and local_host_.

02539 {
02540   if (s)
02541     {
02542       ACE_OS::free ((void *) ACE_Log_Msg::local_host_);
02543       {
02544         ACE_NO_HEAP_CHECK;
02545 
02546         ACE_ALLOCATOR (ACE_Log_Msg::local_host_, ACE_OS::strdup (s));
02547       }
02548     }
02549 }

const ACE_TCHAR * ACE_Log_Msg::local_host void   )  const
 

Get the name of the local host.

Definition at line 2552 of file Log_Msg.cpp.

References local_host_.

02553 {
02554   return ACE_Log_Msg::local_host_;
02555 }

ssize_t ACE_Log_Msg::log ACE_Log_Record log_record,
int  suppress_stderr = 0
 

Log a custom built log record to the currently enabled logging sinks.

Definition at line 2075 of file Log_Msg.cpp.

References ACE_BIT_DISABLED, ACE_BIT_ENABLED, ACE_GUARD_RETURN, CUSTOM, flags_, local_host_, ACE_Log_Msg_Backend::log(), ACE_Log_Msg_Callback::log(), LOGGER, msg_callback(), MSG_CALLBACK, msg_ostream(), OSTREAM, ACE_Log_Record::print(), SILENT, ssize_t, start_tracing(), STDERR, stop_tracing(), SYSLOG, and tracing_enabled().

02077 {
02078   ssize_t result = 0;
02079 
02080   // Format the message and print it to stderr and/or ship it off to
02081   // the log_client daemon, and/or print it to the ostream.  Of
02082   // course, only print the message if "SILENT" mode is disabled.
02083   if (ACE_BIT_DISABLED (ACE_Log_Msg::flags_,
02084                         ACE_Log_Msg::SILENT))
02085     {
02086       int tracing = this->tracing_enabled ();
02087       this->stop_tracing ();
02088 
02089 #if !defined (ACE_WIN32)
02090       // Make this block signal-safe.
02091       ACE_Log_Msg_Sig_Guard sb;
02092 #endif /* !ACE_WIN32 */
02093 
02094       // Do the callback, if needed, before acquiring the lock
02095       // to avoid holding the lock during the callback so we don't
02096       // have deadlock if the callback uses the logger.
02097       if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_,
02098                            ACE_Log_Msg::MSG_CALLBACK)
02099           && this->msg_callback () != 0)
02100         this->msg_callback ()->log (log_record);
02101 
02102       // Make sure that the lock is held during all this.
02103       ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
02104                                 *ACE_Log_Msg_Manager::get_lock (),
02105                                 -1));
02106 
02107       if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_,
02108                            ACE_Log_Msg::STDERR)
02109           && !suppress_stderr) // This is taken care of by our caller.
02110         log_record.print (ACE_Log_Msg::local_host_,
02111                           ACE_Log_Msg::flags_,
02112                           stderr);
02113 
02114       if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::CUSTOM) ||
02115           ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::SYSLOG) ||
02116           ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER))
02117         {
02118           // Be sure that there is a message_queue_, with multiple threads.
02119           ACE_MT (ACE_Log_Msg_Manager::init_backend ());
02120         }
02121 
02122 
02123       if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER) ||
02124           ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::SYSLOG))
02125         {
02126           result =
02127             ACE_Log_Msg_Manager::log_backend_->log (log_record);
02128         }
02129 
02130       if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::CUSTOM) &&
02131           ACE_Log_Msg_Manager::custom_backend_ != 0)
02132         {
02133           result =
02134             ACE_Log_Msg_Manager::custom_backend_->log (log_record);
02135         }
02136 
02137 
02138       // This must come last, after the other two print operations
02139       // (see the <ACE_Log_Record::print> method for details).
02140       if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_,
02141                            ACE_Log_Msg::OSTREAM)
02142           && this->msg_ostream () != 0)
02143         log_record.print (ACE_Log_Msg::local_host_,
02144                           ACE_Log_Msg::flags_,
02145 #if defined (ACE_LACKS_IOSTREAM_TOTALLY)
02146                           static_cast<FILE *> (this->msg_ostream ())
02147 #else  /* ! ACE_LACKS_IOSTREAM_TOTALLY */
02148                           *this->msg_ostream ()
02149 #endif /* ! ACE_LACKS_IOSTREAM_TOTALLY */
02150                           );
02151 
02152       if (tracing)
02153         this->start_tracing ();
02154    }
02155 
02156   return result;
02157 }

ssize_t ACE_Log_Msg::log const ACE_TCHAR format,
ACE_Log_Priority  priority,
va_list  argp
 

An alternative logging mechanism that makes it possible to integrate variable argument lists from other logging mechanisms into the ACE mechanism.

Definition at line 974 of file Log_Msg.cpp.

References ACE_OS::abort(), ACE_BIT_ENABLED, ACE_hthread_t, ACE_INT64, ACE_INT64_FORMAT_SPECIFIER, ACE_LIB_TEXT, ACE_MAXLOGMSGLEN, ACE_NEW_NORETURN, ACE_NSIG, ACE_TCHAR, ACE_TEXT_CHAR_TO_TCHAR, ACE_TRACE, ACE_UINT64, ACE_UINT64_FORMAT_SPECIFIER, ACE_UPDATE_COUNT, conditional_values_, dec(), flags_, ACE_OS::fprintf(), ACE_Trace::get_nesting_indent(), getpid(), inc(), local_host_, log(), log_priority_enabled(), ACE::map_errno(), msg(), msg_, msg_callback(), ACE_Log_Record::msg_data(), msg_off_, msg_ostream(), op_status(), ACE_Log_Record::print(), ACE_Log_Record::priority_name(), program_name_, ACE_Thread::self(), set(), SILENT, ACE_OS::snprintf(), ACE::sock_error(), ACE_OS::sprintf(), ssize_t, ACE_OS::strcpy(), ACE_OS::strerror(), ACE_OS::strlen(), ACE_OS::strsncpy(), ACE::timestamp(), timestamp_, trace_depth_, VERBOSE, and ACE_OS::wslen().

00977 {
00978   ACE_TRACE ("ACE_Log_Msg::log");
00979   // External decls.
00980 
00981   typedef void (*PTF)(...);
00982 
00983   // Check if there were any conditional values set.
00984   int conditional_values = this->conditional_values_.is_set_;
00985 
00986   // Reset conditional values.
00987   this->conditional_values_.is_set_ = 0;
00988 
00989   // Only print the message if <priority_mask_> hasn't been reset to
00990   // exclude this logging priority.
00991   if (this->log_priority_enabled (log_priority) == 0)
00992     return 0;
00993 
00994   // If conditional values were set and the log priority is correct,
00995   // then the values are actually set.
00996   if (conditional_values)
00997     this->set (this->conditional_values_.file_,
00998                this->conditional_values_.line_,
00999                this->conditional_values_.op_status_,
01000                this->conditional_values_.errnum_,
01001                this->restart (),
01002                this->msg_ostream (),
01003                this->msg_callback ());
01004 
01005   // Logging is supposed to be a benign activity (i.e., not interfer
01006   // with normal application operations), so don't inadvertently smash
01007   // errno!
01008   ACE_Errno_Guard guard (errno);
01009 
01010   ACE_Log_Record log_record (log_priority,
01011                              ACE_OS::gettimeofday (),
01012                              this->getpid ());
01013   // bp is pointer to where to put next part of logged message.
01014   // bspace is the number of characters remaining in msg_.
01015   ACE_TCHAR *bp = const_cast<ACE_TCHAR *> (this->msg ());
01016   size_t bspace = ACE_Log_Record::MAXLOGMSGLEN;  // Leave room for Nul term.
01017   if (this->msg_off_ <= ACE_Log_Record::MAXLOGMSGLEN)
01018     bspace -= static_cast<size_t> (this->msg_off_);
01019 
01020   // If this platform has snprintf() capability to prevent overrunning the
01021   // output buffer, use it. To avoid adding a maintenance-hassle compile-
01022   // time couple between here and OS.cpp, don't try to figure this out at
01023   // compile time. Instead, do a quick check now; if we get a -1 return,
01024   // the platform doesn't support the length-limiting capability.
01025   ACE_TCHAR test[2];
01026   int can_check = ACE_OS::snprintf (test, 1, ACE_LIB_TEXT ("x")) != -1;
01027 
01028   int abort_prog = 0;
01029   int exit_value = 0;
01030 
01031   if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::VERBOSE))
01032     {
01033       // Prepend the program name onto this message
01034 
01035       if (ACE_Log_Msg::program_name_ != 0)
01036         {
01037           for (const ACE_TCHAR *s = ACE_Log_Msg::program_name_;
01038                bspace > 1 && (*bp = *s) != '\0';
01039                ++s, --bspace)
01040             bp++;
01041 
01042           *bp++ = '|';
01043           --bspace;
01044         }
01045     }
01046 
01047   if (timestamp_ > 0)
01048   {
01049      ACE_TCHAR day_and_time[35];
01050      const ACE_TCHAR *s;
01051      if (timestamp_ == 1)
01052      {
01053         // Print just the time
01054         s = ACE::timestamp (day_and_time, sizeof day_and_time, 1);
01055      }
01056      else
01057      {
01058         // Print time and date
01059         ACE::timestamp (day_and_time, sizeof day_and_time);
01060         s = day_and_time;
01061      }
01062 
01063      for (; bspace > 1 && (*bp = *s) != '\0'; ++s, --bspace)
01064        ++bp;
01065 
01066      *bp++ = '|';
01067      --bspace;
01068   }
01069 
01070   while (*format_str != '\0' && bspace > 0)
01071     {
01072       // Copy input to output until we encounter a %, however a
01073       // % followed by another % is not a format specification.
01074 
01075       if (*format_str != '%')
01076         {
01077           *bp++ = *format_str++;
01078           --bspace;
01079         }
01080       else if (format_str[1] == '%') // An "escaped" '%' (just print one '%').
01081         {
01082           *bp++ = *format_str++;    // Store first %
01083           ++format_str;             // but skip second %
01084           --bspace;
01085         }
01086       else
01087         {
01088           // This is most likely a format specification that ends with
01089           // one of the valid options described previously. To enable full
01090           // use of all sprintf capabilities, save the format specifier
01091           // from the '%' up to the format letter in a new char array.
01092           // This allows the full sprintf capability for padding, field
01093           // widths, alignment, etc.  Any width/precision requiring a
01094           // caller-supplied argument is extracted and placed as text
01095           // into the format array. Lastly, we convert the caller-supplied
01096           // format specifier from the ACE_Log_Msg-supported list to the
01097           // equivalent sprintf specifier, and run the new format spec
01098           // through sprintf, adding it to the bp string.
01099 
01100           const ACE_TCHAR *abort_str = ACE_LIB_TEXT ("Aborting...");
01101           const ACE_TCHAR *start_format = format_str;
01102           ACE_TCHAR format[128]; // Converted format string
01103           ACE_TCHAR *fp;         // Current format pointer
01104           int       wp = 0;      // Width/precision extracted from args
01105           int       done = 0;
01106           int       skip_nul_locate = 0;
01107           int       this_len = 0;    // How many chars s[n]printf wrote
01108 
01109           fp = format;
01110           *fp++ = *format_str++;   // Copy in the %
01111 
01112           // Initialization to satisfy VC6
01113           int tmp_indent = 0;
01114           // Work through the format string to copy in the format
01115           // from the caller. While it's going across, extract ints
01116           // for '*' width/precision values from the argument list.
01117           // When the real format specifier is located, change it to
01118           // one recognized by sprintf, if needed, and do the sprintf
01119           // call.
01120 
01121           while (!done)
01122             {
01123               done = 1;               // Unless a conversion spec changes it
01124 
01125               switch (*format_str)
01126                 {
01127                 // The initial set of cases are the conversion
01128                 // specifiers. Copy them in to the format array.
01129                 // Note we don't use 'l', a normal conversion spec,
01130                 // as a conversion because it is a ACE_Log_Msg format
01131                 // specifier.
01132                 case '-':
01133                 case '+':
01134                 case '0':
01135                 case ' ':
01136                 case '#':
01137                 case '1':
01138                 case '2':
01139                 case '3':
01140                 case '4':
01141                 case '5':
01142                 case '6':
01143                 case '7':
01144                 case '8':
01145                 case '9':
01146                 case '.':
01147                 case 'L':
01148                 case 'h':
01149                   *fp++ = *format_str;
01150                   done = 0;
01151                   break;
01152 
01153                 case '*':
01154                   wp = va_arg (argp, int);
01155                   ACE_OS::sprintf (fp, ACE_LIB_TEXT ("%d"), wp);
01156                   fp += ACE_OS::strlen (fp);
01157                   done = 0;
01158                   break;
01159 
01160                 case 'A':             // ACE_timer_t
01161                   {
01162                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("f"));
01163                     double value = va_arg (argp, double);
01164                     if (can_check)
01165                       this_len = ACE_OS::snprintf (bp, bspace, format, value);
01166                     else
01167                       this_len = ACE_OS::sprintf (bp, format, value);
01168                     ACE_UPDATE_COUNT (bspace, this_len);
01169                   }
01170                   break;
01171 
01172                 case 'a': // Abort program after handling all of format string.
01173                   abort_prog = 1;
01174                   exit_value = va_arg (argp, int);
01175                   ACE_OS::strsncpy (bp, abort_str, bspace);
01176                   if (bspace > ACE_OS::strlen (abort_str))
01177                     bspace -= ACE_OS::strlen (abort_str);
01178                   else
01179                     bspace = 0;
01180                   break;
01181 
01182                 case 'l':             // Source file line number
01183                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("d"));
01184                   if (can_check)
01185                     this_len = ACE_OS::snprintf (bp,
01186                                                  bspace,
01187                                                  format,
01188                                                  this->linenum ());
01189                   else
01190                     this_len = ACE_OS::sprintf (bp, format, this->linenum ());
01191                   ACE_UPDATE_COUNT (bspace, this_len);
01192                   break;
01193 
01194                 case 'N':             // Source file name
01195 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01196                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls"));
01197 #else
01198                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01199 #endif
01200                   if (can_check)
01201                     this_len = ACE_OS::snprintf (bp, bspace, format,
01202                                                  this->file () ?
01203                                                  ACE_TEXT_CHAR_TO_TCHAR (this->file ())
01204                                                  : ACE_LIB_TEXT ("<unknown file>"));
01205                   else
01206                     this_len = ACE_OS::sprintf (bp, format,
01207                                                 this->file () ?
01208                                                 ACE_TEXT_CHAR_TO_TCHAR (this->file ())
01209                                                 : ACE_LIB_TEXT ("<unknown file>"));
01210                   ACE_UPDATE_COUNT (bspace, this_len);
01211                   break;
01212 
01213                 case 'n':             // Program name
01214 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01215                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls"));
01216 #else /* ACE_WIN32 && ACE_USES_WCHAR */
01217                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01218 #endif
01219                   if (can_check)
01220                     this_len = ACE_OS::snprintf (bp, bspace, format,
01221                                                  ACE_Log_Msg::program_name_ ?
01222                                                  ACE_Log_Msg::program_name_ :
01223                                                  ACE_LIB_TEXT ("<unknown>"));
01224                   else
01225                     this_len = ACE_OS::sprintf (bp, format,
01226                                                 ACE_Log_Msg::program_name_ ?
01227                                                 ACE_Log_Msg::program_name_ :
01228                                                 ACE_LIB_TEXT ("<unknown>"));
01229                   ACE_UPDATE_COUNT (bspace, this_len);
01230                   break;
01231 
01232                 case 'P':             // Process ID
01233                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("d"));
01234                   if (can_check)
01235                     this_len = ACE_OS::snprintf
01236                       (bp, bspace, format,
01237                        static_cast<int> (this->getpid ()));
01238                   else
01239                     this_len = ACE_OS::sprintf
01240                       (bp, format, static_cast<int> (this->getpid ()));
01241                   ACE_UPDATE_COUNT (bspace, this_len);
01242                   break;
01243 
01244                 case 'p':             // <errno> string, ala perror()
01245                   {
01246                     errno = 0;
01247                     char *msg;
01248                     msg = ACE_OS::strerror (ACE::map_errno (this->errnum ()));
01249                     // Windows can try to translate the errnum using
01250                     // system calls if strerror() doesn't get anything useful.
01251 #if defined (ACE_WIN32)
01252                     if (errno == 0)
01253                       {
01254 #endif
01255 
01256 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01257                         ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls: %ls"));
01258 #else
01259                         ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s: %s"));
01260 #endif
01261                         if (can_check)
01262                           this_len = ACE_OS::snprintf
01263                             (bp, bspace, format, va_arg (argp, ACE_TCHAR *),
01264                              ACE_TEXT_CHAR_TO_TCHAR (msg));
01265                         else
01266                           this_len = ACE_OS::sprintf
01267                             (bp, format, va_arg (argp, ACE_TCHAR *),
01268                              ACE_TEXT_CHAR_TO_TCHAR (msg));
01269 #if defined (ACE_WIN32)
01270                       }
01271                     else
01272                       {
01273                         errno = ACE::map_errno (this->errnum ());
01274                         ACE_TCHAR *lpMsgBuf = 0;
01275 
01276      // PharLap can't do FormatMessage, so try for socket
01277      // error.
01278 # if !defined (ACE_HAS_PHARLAP)
01279                         ACE_TEXT_FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER
01280                                                   | FORMAT_MESSAGE_MAX_WIDTH_MASK
01281                                                   | FORMAT_MESSAGE_FROM_SYSTEM,
01282                                                   0,
01283                                                   errno,
01284                                                   MAKELANGID (LANG_NEUTRAL,
01285                                                               SUBLANG_DEFAULT),
01286                                                               // Default language
01287                                                   (ACE_TCHAR *) &lpMsgBuf,
01288                                                   0,
01289                                                   0);
01290 # endif /* ACE_HAS_PHARLAP */
01291 
01292                         // If we don't get a valid response from
01293                         // <FormatMessage>, we'll assume this is a
01294                         // WinSock error and so we'll try to convert
01295                         // it into a string.  If this doesn't work it
01296                         // returns "unknown error" which is fine for
01297                         // our purposes.
01298                         if (lpMsgBuf == 0)
01299                           {
01300                             const ACE_TCHAR *message =
01301                               ACE::sock_error (errno);
01302                             ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s: %s"));
01303                             if (can_check)
01304                               this_len = ACE_OS::snprintf
01305                                 (bp, bspace, format,
01306                                  va_arg (argp, const ACE_TCHAR *),
01307                                  message);
01308                             else
01309                               this_len = ACE_OS::sprintf
01310                                 (bp, format,
01311                                  va_arg (argp, const ACE_TCHAR *),
01312                                  message);
01313                           }
01314                         else
01315                           {
01316                             ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s: %s"));
01317                             if (can_check)
01318                               this_len = ACE_OS::snprintf
01319                                 (bp, bspace, format,
01320                                  va_arg (argp, ACE_TCHAR *),
01321                                  lpMsgBuf);
01322                             else
01323                               this_len = ACE_OS::sprintf
01324                                 (bp, format,
01325                                  va_arg (argp, ACE_TCHAR *),
01326                                  lpMsgBuf);
01327                             // Free the buffer.
01328                             ::LocalFree (lpMsgBuf);
01329                           }
01330                       }
01331 #endif /* ACE_WIN32 */
01332                     ACE_UPDATE_COUNT (bspace, this_len);
01333                     break;
01334                   }
01335 
01336                 case 'M': // Print the name of the priority of the message.
01337 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01338                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls"));
01339 #else
01340                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01341 #endif
01342                   if (can_check)
01343                     this_len = ACE_OS::snprintf
01344                       (bp, bspace, format,
01345                        ACE_Log_Record::priority_name (log_priority));
01346                   else
01347                     this_len = ACE_OS::sprintf
01348                       (bp, format,
01349                        ACE_Log_Record::priority_name (log_priority));
01350                   ACE_UPDATE_COUNT (bspace, this_len);
01351                   break;
01352 
01353                 case 'm': // Format the string assocated with the errno value.
01354                   {
01355                     errno = 0;
01356                     char *msg;
01357                     msg = ACE_OS::strerror (ACE::map_errno (this->errnum ()));
01358                     // Windows can try to translate the errnum using
01359                     // system calls if strerror() doesn't get anything useful.
01360 #if defined (ACE_WIN32)
01361                     if (errno == 0)
01362                       {
01363 #endif
01364 
01365 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01366                         ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls"));
01367 #else /* ACE_WIN32 && ACE_USES_WCHAR */
01368                         ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01369 #endif
01370                         if (can_check)
01371                           this_len = ACE_OS::snprintf
01372                             (bp, bspace, format, ACE_TEXT_CHAR_TO_TCHAR (msg));
01373                         else
01374                           this_len = ACE_OS::sprintf
01375                             (bp, format, ACE_TEXT_CHAR_TO_TCHAR (msg));
01376 #if defined (ACE_WIN32)
01377                       }
01378                     else
01379                       {
01380                         errno = ACE::map_errno (this->errnum ());
01381                         ACE_TCHAR *lpMsgBuf = 0;
01382 
01383      // PharLap can't do FormatMessage, so try for socket
01384      // error.
01385 # if !defined (ACE_HAS_PHARLAP)
01386                         ACE_TEXT_FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER
01387                                                   | FORMAT_MESSAGE_MAX_WIDTH_MASK
01388                                                   | FORMAT_MESSAGE_FROM_SYSTEM,
01389                                                   0,
01390                                                   errno,
01391                                                   MAKELANGID (LANG_NEUTRAL,
01392                                                               SUBLANG_DEFAULT),
01393                                                               // Default language
01394                                                   (ACE_TCHAR *) &lpMsgBuf,
01395                                                   0,
01396                                                   0);
01397 # endif /* ACE_HAS_PHARLAP */
01398 
01399                         // If we don't get a valid response from
01400                         // <FormatMessage>, we'll assume this is a
01401                         // WinSock error and so we'll try to convert
01402                         // it into a string.  If this doesn't work it
01403                         // returns "unknown error" which is fine for
01404                         // our purposes.
01405                         if (lpMsgBuf == 0)
01406                           {
01407                             const ACE_TCHAR *message =
01408                               ACE::sock_error (errno);
01409                             ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01410                             if (can_check)
01411                               this_len = ACE_OS::snprintf
01412                                 (bp, bspace, format, message);
01413                             else
01414                               this_len = ACE_OS::sprintf (bp, format, message);
01415                           }
01416                         else
01417                           {
01418                             ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01419                             if (can_check)
01420                               this_len = ACE_OS::snprintf
01421                                 (bp, bspace, format, lpMsgBuf);
01422                             else
01423                               this_len = ACE_OS::sprintf
01424                                 (bp, format, lpMsgBuf);
01425                             // Free the buffer.
01426                             ::LocalFree (lpMsgBuf);
01427                           }
01428                       }
01429 #endif /* ACE_WIN32 */
01430                     ACE_UPDATE_COUNT (bspace, this_len);
01431                     break;
01432                   }
01433 
01434                 case 'R': // Format the return status of the operation.
01435                   this->op_status (va_arg (argp, int));
01436                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("d"));
01437                   if (can_check)
01438                     this_len = ACE_OS::snprintf
01439                       (bp, bspace, format, this->op_status ());
01440                   else
01441                     this_len = ACE_OS::sprintf
01442                       (bp, format, this->op_status ());
01443                   ACE_UPDATE_COUNT (bspace, this_len);
01444                   break;
01445 
01446                 case '{': // Increment the trace_depth, then indent
01447                   skip_nul_locate = 1;
01448                   (void) this->inc ();
01449                   break;
01450 
01451                 case '}': // indent, then decrement trace_depth
01452                   skip_nul_locate = 1;
01453                   (void) this->dec ();
01454                   break;
01455 
01456                 case '$': // insert a newline, then indent the next line
01457                           // according to %I
01458                   *bp++ = '\n';
01459                   --bspace;
01460                   /* fallthrough */
01461 
01462                 case 'I': // Indent with nesting_depth*width spaces
01463                   // Caller can do %*I to override nesting indent, and
01464                   // if %*I was done, wp has the extracted width.
01465 #if defined (ACE_HAS_TRACE)
01466                   if (0 == wp)
01467                     wp = ACE_Trace::get_nesting_indent ();
01468 #else
01469                   if (0 == wp)
01470                     wp = 4;
01471 #endif /* ACE_HAS_TRACE */
01472                   wp *= this->trace_depth_;
01473                   if (static_cast<size_t> (wp) > bspace)
01474                     wp = static_cast<int> (bspace);
01475                   for (tmp_indent = wp;
01476                        tmp_indent;
01477                        --tmp_indent)
01478                     *bp++ = ' ';
01479 
01480                   *bp = '\0';
01481                   bspace -= static_cast<size_t> (wp);
01482                   skip_nul_locate = 1;
01483                   break;
01484 
01485                 case 'r': // Run (invoke) this subroutine.
01486                   {
01487                     long osave = ACE_Log_Msg::msg_off_;
01488 
01489                     if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_,
01490                                          ACE_Log_Msg::SILENT) &&
01491                         bspace > 1)
01492                       {
01493                         *bp++ = '{';
01494                         --bspace;
01495                       }
01496                     ACE_Log_Msg::msg_off_ =  bp - this->msg_;
01497 
01498                     (*va_arg (argp, PTF))();
01499 
01500                     if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_,
01501                                          ACE_Log_Msg::SILENT) &&
01502                         bspace > (1 + ACE_OS::strlen (bp)))
01503                       {
01504                         bspace -= (ACE_OS::strlen (bp) + 1);
01505                         bp += ACE_OS::strlen (bp);
01506                         *bp++ =  '}';
01507                       }
01508                     *bp = '\0';
01509                     skip_nul_locate = 1;
01510                     ACE_Log_Msg::msg_off_ = osave;
01511                     break;
01512                   }
01513 
01514                 case 'S': // format the string for with this signal number.
01515                   {
01516                     int sig = va_arg (argp, int);
01517 #if defined (ACE_HAS_SYS_SIGLIST)
01518                     if (sig >= 0 && sig < ACE_NSIG)
01519                       {
01520                         ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01521                         if (can_check)
01522                           this_len = ACE_OS::snprintf
01523                             (bp, bspace, format, _sys_siglist[sig]);
01524                         else
01525                           this_len = ACE_OS::sprintf
01526                             (bp, format, _sys_siglist[sig]);
01527                       }
01528                     else
01529                       {
01530                         if (can_check)
01531                           this_len = ACE_OS::snprintf
01532                             (bp, bspace,
01533                              ACE_LIB_TEXT("<unknown signal> %d"), sig);
01534                         else
01535                           this_len = ACE_OS::sprintf
01536                             (bp, ACE_LIB_TEXT ("<unknown signal> %d"), sig);
01537                       }
01538 #else
01539                     if (can_check)
01540                       this_len = ACE_OS::snprintf
01541                         (bp, bspace, ACE_LIB_TEXT ("signal %d"), sig);
01542                     else
01543                       this_len = ACE_OS::sprintf
01544                         (bp, ACE_LIB_TEXT ("signal %d"), sig);
01545 #endif /* ACE_HAS_SYS_SIGLIST */
01546                     ACE_UPDATE_COUNT (bspace, this_len);
01547                     break;
01548                   }
01549 
01550                 case 'D': // Format the timestamp in month/day/year
01551                           // hour:minute:sec:usec format.
01552                   {
01553                     ACE_TCHAR day_and_time[35];
01554                     ACE::timestamp (day_and_time,
01555                                     sizeof day_and_time);
01556 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01557                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls"));
01558 #else
01559                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01560 #endif
01561                     if (can_check)
01562                       this_len = ACE_OS::snprintf
01563                         (bp, bspace, format, day_and_time);
01564                     else
01565                       this_len = ACE_OS::sprintf (bp, format, day_and_time);
01566                     ACE_UPDATE_COUNT (bspace, this_len);
01567                     break;
01568                   }
01569 
01570                 case 'T': // Format the timestamp in
01571                           // hour:minute:sec:usec format.
01572                   {
01573                     ACE_TCHAR day_and_time[35];
01574                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01575                     if (can_check)
01576                       this_len = ACE_OS::snprintf
01577                         (bp, bspace, format,
01578                          ACE::timestamp (day_and_time, sizeof day_and_time));
01579                     else
01580                       this_len = ACE_OS::sprintf
01581                         (bp, format, ACE::timestamp (day_and_time,
01582                                                      sizeof day_and_time));
01583                     ACE_UPDATE_COUNT (bspace, this_len);
01584                     break;
01585                   }
01586 
01587                 case 't': // Format thread id.
01588 #if defined (ACE_WIN32)
01589                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("u"));
01590                   if (can_check)
01591                     this_len = ACE_OS::snprintf
01592                       (bp, bspace, format,
01593                        static_cast<unsigned> (ACE_Thread::self ()));
01594                   else
01595                     this_len =
01596                       ACE_OS::sprintf (bp,
01597                                        format,
01598                                        static_cast <unsigned> (ACE_Thread::self ()));
01599 #elif defined (ACE_AIX_VERS) && (ACE_AIX_VERS <= 402)
01600                   // AIX's pthread_t (ACE_hthread_t) is a pointer, and it's
01601                   // a little ugly to send that through a %u format.  So,
01602                   // get the kernel thread ID (tid_t) via thread_self() and
01603                   // display that instead.
01604                   // This isn't conditionalized on ACE_HAS_THREAD_SELF because
01605                   // 1. AIX 4.2 doesn't have that def anymore (it messes up
01606                   //    other things)
01607                   // 2. OSF/1 V3.2 has that def, and I'm not sure what affect
01608                   //   this would have on that.
01609                   // -Steve Huston, 19-Aug-97
01610                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("u"));
01611                   if (can_check)
01612                     this_len = ACE_OS::snprintf
01613                       (bp, bspace, format, thread_self());
01614                   else
01615                     this_len = ACE_OS::sprintf (bp, format, thread_self());
01616 #elif defined (DIGITAL_UNIX)
01617                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("u"));
01618                   {
01619                     int id =
01620 #  if defined (ACE_HAS_THREADS)
01621                       pthread_getselfseq_np ();
01622 #  else
01623                       ACE_Thread::self ();
01624 #  endif /* ACE_HAS_THREADS */
01625 
01626                       if (can_check)
01627                         this_len = ACE_OS::snprintf (bp, bspace, format, id);
01628                       else
01629                         this_len = ACE_OS::sprintf (bp, format, id);
01630                   }
01631 #else
01632                   ACE_hthread_t t_id;
01633                   ACE_Thread::self (t_id);
01634 
01635 #  if defined (ACE_MVS) || defined (ACE_TANDEM_T1248_PTHREADS)
01636                   // MVS's pthread_t is a struct... yuck. So use the ACE 5.0
01637                   // code for it.
01638                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("u"));
01639                   if (can_check)
01640                     this_len = ACE_OS::snprintf (bp, bspace, format, t_id);
01641                   else
01642                     this_len = ACE_OS::sprintf (bp, format, t_id);
01643 #  else
01644                   // Yes, this is an ugly C-style cast, but the correct
01645                   // C++ cast is different depending on whether the t_id
01646                   // is an integral type or a pointer type. FreeBSD uses
01647                   // a pointer type, but doesn't have a _np function to
01648                   // get an integral type, like the OSes above.
01649                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("lu"));
01650                   if (can_check)
01651                     this_len = ACE_OS::snprintf
01652                       (bp, bspace, format, (unsigned long)t_id);
01653                   else
01654                     this_len = ACE_OS::sprintf
01655                       (bp, format, (unsigned long)t_id);
01656 #  endif /* ACE_MWS || ACE_TANDEM_T1248_PTHREADS */
01657 
01658 #endif /* ACE_WIN32 */
01659                   ACE_UPDATE_COUNT (bspace, this_len);
01660                   break;
01661 
01662                 case 's':                       // String
01663                   {
01664 #if !defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01665                     wchar_t *str = va_arg (argp, wchar_t *);
01666                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls"));
01667 #else /* ACE_WIN32 && ACE_USES_WCHAR */
01668                     ACE_TCHAR *str = va_arg (argp, ACE_TCHAR *);
01669                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01670 #endif /* ACE_WIN32 && ACE_USES_WCHAR */
01671                     if (can_check)
01672                       this_len = ACE_OS::snprintf
01673                         (bp, bspace, format, str ? str : ACE_LIB_TEXT ("(null)"));
01674                     else
01675                       this_len = ACE_OS::sprintf
01676                         (bp, format, str ? str : ACE_LIB_TEXT ("(null)"));
01677                     ACE_UPDATE_COUNT (bspace, this_len);
01678                   }
01679                   break;
01680 
01681                 case 'C':         // Char string, Unicode for Win32/WCHAR
01682                   {
01683                     ACE_TCHAR *cstr = va_arg (argp, ACE_TCHAR *);
01684 #if defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01685                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("S"));
01686 #else /* ACE_WIN32 && ACE_USES_WCHAR */
01687                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01688 #endif /* ACE_WIN32 && ACE_USES_WCHAR */
01689                     if (can_check)
01690                       this_len = ACE_OS::snprintf
01691                         (bp, bspace, format, cstr ? cstr : ACE_LIB_TEXT ("(null)"));
01692                     else
01693                       this_len = ACE_OS::sprintf
01694                         (bp, format, cstr ? cstr : ACE_LIB_TEXT ("(null)"));
01695                     ACE_UPDATE_COUNT (bspace, this_len);
01696                   }
01697                   break;
01698 
01699                 case 'W':
01700                   {
01701 #if defined (ACE_WIN32)
01702                     ACE_TCHAR *wstr = va_arg (argp, ACE_TCHAR *);
01703 # if defined (ACE_USES_WCHAR)
01704                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01705 # else /* ACE_USES_WCHAR */
01706                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("S"));
01707 # endif /* ACE_USES_WCHAR */
01708                     if (can_check)
01709                       this_len = ACE_OS::snprintf
01710                         (bp, bspace, format, wstr ? wstr : ACE_LIB_TEXT ("(null)"));
01711                     else
01712                       this_len = ACE_OS::sprintf
01713                         (bp, format, wstr ? wstr : ACE_LIB_TEXT ("(null)"));
01714 #elif defined (ACE_HAS_WCHAR)
01715                     wchar_t *wchar_str = va_arg (argp, wchar_t *);
01716 # if defined (HPUX)
01717                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("S"));
01718 # else
01719                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls"));
01720 # endif /* HPUX */
01721                     if (can_check)
01722                       this_len = ACE_OS::snprintf
01723                         (bp, bspace, format, wchar_str);
01724                     else
01725                       this_len = ACE_OS::sprintf
01726                         (bp, format, wchar_str);
01727 #endif /* ACE_WIN32 / ACE_HAS_WCHAR */
01728                     ACE_UPDATE_COUNT (bspace, this_len);
01729                   }
01730                   break;
01731 
01732                 case 'w':              // Wide character
01733 #if defined (ACE_WIN32)
01734 # if defined (ACE_USES_WCHAR)
01735                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("c"));
01736 # else /* ACE_USES_WCHAR */
01737                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("C"));
01738 # endif /* ACE_USES_WCHAR */
01739                   if (can_check)
01740                     this_len = ACE_OS::snprintf
01741                       (bp, bspace, format, va_arg (argp, int));
01742                   else
01743                     this_len = ACE_OS::sprintf
01744                       (bp, format, va_arg (argp, int));
01745 #elif defined (ACE_USES_WCHAR)
01746 # if defined (HPUX)
01747                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("C"));
01748 # else
01749                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("lc"));
01750 # endif /* HPUX */
01751                   if (can_check)
01752                     this_len = ACE_OS::snprintf
01753                       (bp, bspace, format, va_arg (argp, wint_t));
01754                   else
01755                     this_len = ACE_OS::sprintf
01756                       (bp, format, va_arg (argp, wint_t));
01757 #else /* ACE_WIN32 */
01758                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("u"));
01759                   if (can_check)
01760                     this_len = ACE_OS::snprintf
01761                       (bp, bspace, format, va_arg (argp, int));
01762                   else
01763                     this_len = ACE_OS::sprintf
01764                       (bp, format, va_arg (argp, int));
01765 #endif /* ACE_WIN32 */
01766                   ACE_UPDATE_COUNT (bspace, this_len);
01767                   break;
01768 
01769                 case 'z':              // ACE_OS::WChar character
01770                   {
01771                     // On some platforms sizeof (wchar_t) can be 2
01772                     // on the others 4 ...
01773                     wchar_t wtchar =
01774                       static_cast<wchar_t> (va_arg (argp, int));
01775 #if defined (ACE_WIN32)
01776 # if defined (ACE_USES_WCHAR)
01777                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("c"));
01778 # else /* ACE_USES_WCHAR */
01779                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("C"));
01780 # endif /* ACE_USES_WCHAR */
01781 #elif defined (ACE_USES_WCHAR)
01782 # if defined (HPUX)
01783                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("C"));
01784 # else
01785                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("lc"));
01786 # endif /* HPUX */
01787 #else /* ACE_WIN32 */
01788                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("u"));
01789 #endif /* ACE_WIN32 */
01790                     if (can_check)
01791                       this_len = ACE_OS::snprintf (bp, bspace, format, wtchar);
01792                     else
01793                       this_len = ACE_OS::sprintf (bp, format, wtchar);
01794                     ACE_UPDATE_COUNT (bspace, this_len);
01795                     break;
01796                   }
01797 
01798                  case 'Z':              // ACE_OS::WChar character string
01799                   {
01800                     ACE_OS::WChar *wchar_str = va_arg (argp, ACE_OS::WChar*);
01801                     if (wchar_str == 0)
01802                       break;
01803 
01804                     wchar_t *wchar_t_str = 0;
01805                     if (sizeof (ACE_OS::WChar) != sizeof (wchar_t))
01806                       {
01807                         size_t len = ACE_OS::wslen (wchar_str) + 1;
01808                         ACE_NEW_NORETURN(wchar_t_str, wchar_t[len]);
01809                         if (wchar_t_str == 0)
01810                           break;
01811 
01812                         for (size_t i = 0; i < len; ++i)
01813                           {
01814                             wchar_t_str[i] = wchar_str[i];
01815                           }
01816                       }
01817 
01818                     if (wchar_t_str == 0)
01819                       {
01820                         wchar_t_str = reinterpret_cast<wchar_t*> (wchar_str);
01821                       }
01822 #if defined (ACE_WIN32)
01823 # if defined (ACE_USES_WCHAR)
01824                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("s"));
01825 # else /* ACE_USES_WCHAR */
01826                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("S"));
01827 # endif /* ACE_USES_WCHAR */
01828 #elif defined (ACE_HAS_WCHAR)
01829 # if defined (HPUX)
01830                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("S"));
01831 # else
01832                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("ls"));
01833 # endif /* HPUX */
01834 #endif /* ACE_WIN32 / ACE_HAS_WCHAR */
01835                   if (can_check)
01836                     this_len = ACE_OS::snprintf
01837                       (bp, bspace, format, wchar_t_str);
01838                   else
01839                     this_len = ACE_OS::sprintf (bp, format, wchar_t_str);
01840                   if(sizeof(ACE_OS::WChar) != sizeof(wchar_t))
01841                     {
01842                       delete wchar_t_str;
01843                     }
01844                   ACE_UPDATE_COUNT (bspace, this_len);
01845                   break;
01846                   }
01847 
01848                 case 'c':
01849 #if defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
01850                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("C"));
01851 #else
01852                   ACE_OS::strcpy (fp, ACE_LIB_TEXT ("c"));
01853 #endif /* ACE_WIN32 && ACE_USES_WCHAR */
01854                   if (can_check)
01855                     this_len = ACE_OS::snprintf
01856                       (bp, bspace, format, va_arg (argp, int));
01857                   else
01858                     this_len = ACE_OS::sprintf
01859                       (bp, format, va_arg (argp, int));
01860                   ACE_UPDATE_COUNT (bspace, this_len);
01861                   break;
01862 
01863                 case 'd': case 'i': case 'o':
01864                 case 'u': case 'x': case 'X':
01865                   fp[0] = *format_str;
01866                   fp[1] = '\0';
01867                   if (can_check)
01868                     this_len = ACE_OS::snprintf
01869                       (bp, bspace, format, va_arg (argp, int));
01870                   else
01871                     this_len = ACE_OS::sprintf
01872                       (bp, format, va_arg (argp, int));
01873                   ACE_UPDATE_COUNT (bspace, this_len);
01874                   break;
01875 
01876                 case 'F': case 'f': case 'e': case 'E':
01877                 case 'g': case 'G':
01878                   fp[0] = *format_str;
01879                   fp[1] = '\0';
01880                   if (can_check)
01881                     this_len = ACE_OS::snprintf
01882                       (bp, bspace, format, va_arg (argp, double));
01883                   else
01884                     this_len = ACE_OS::sprintf
01885                       (bp, format, va_arg (argp, double));
01886                   ACE_UPDATE_COUNT (bspace, this_len);
01887                   break;
01888 
01889                 case 'Q':
01890 #if defined (ACE_LACKS_LONGLONG_T) || defined (ACE_LACKS_UNSIGNEDLONGLONG_T)
01891                   {
01892                     // This relies on the ACE_U_LongLong storage layout.
01893                     ACE_UINT32 hi = va_arg (argp, ACE_UINT32);
01894                     ACE_UINT32 lo = va_arg (argp, ACE_UINT32);
01895                     if (hi > 0)
01896                       this_len = ACE_OS::sprintf (bp,
01897                                                   "0x%lx%0*lx",
01898                                                   hi,
01899                                                   2 * sizeof lo,
01900                                                   lo);
01901                     else
01902                       this_len = ACE_OS::sprintf (bp, "0x%lx", lo);
01903                   }
01904 #else  /* ! ACE_LACKS_LONGLONG_T */
01905                   {
01906                     const ACE_TCHAR *fmt = ACE_UINT64_FORMAT_SPECIFIER;
01907                     ACE_OS::strcpy (fp, &fmt[1]);    // Skip leading %
01908                     if (can_check)
01909                       this_len = ACE_OS::snprintf (bp, bspace,
01910                                                    format,
01911                                                    va_arg (argp, ACE_UINT64));
01912                     else
01913                       this_len = ACE_OS::sprintf (bp,
01914                                                   format,
01915                                                   va_arg (argp, ACE_UINT64));
01916                   }
01917 #endif /* ! ACE_LACKS_LONGLONG_T || ACE_LACKS_UNSIGNEDLONGLONG_T */
01918                   ACE_UPDATE_COUNT (bspace, this_len);
01919                   break;
01920 
01921                 case 'q':
01922  #if defined (ACE_LACKS_LONGLONG_T)
01923                    // No implementation available yet, no ACE_INT64 emulation
01924                    // available yet
01925  #else  /* ! ACE_LACKS_LONGLONG_T */
01926                    {
01927                      const ACE_TCHAR *fmt = ACE_INT64_FORMAT_SPECIFIER;
01928                      ACE_OS::strcpy (fp, &fmt[1]);    // Skip leading %
01929                      if (can_check)
01930                        this_len = ACE_OS::snprintf (bp, bspace,
01931                                                     format,
01932                                                     va_arg (argp, ACE_INT64));
01933                      else
01934                        this_len = ACE_OS::sprintf (bp,
01935                                                    format,
01936                                                    va_arg (argp, ACE_INT64));
01937                    }
01938  #endif /* ! ACE_LACKS_LONGLONG_T */
01939                    ACE_UPDATE_COUNT (bspace, this_len);
01940                    break;
01941 
01942                 case '@':
01943                     ACE_OS::strcpy (fp, ACE_LIB_TEXT ("p"));
01944                     if (can_check)
01945                       this_len = ACE_OS::snprintf
01946                         (bp, bspace, format, va_arg (argp, void*));
01947                     else
01948                       this_len = ACE_OS::sprintf
01949                         (bp, format, va_arg (argp, void*));
01950                     ACE_UPDATE_COUNT (bspace, this_len);
01951                     break;
01952 
01953                 default:
01954                   // So, it's not a legit format specifier after all...
01955                   // Copy from the original % to where we are now, then
01956                   // continue with whatever comes next.
01957                   while (start_format != format_str && bspace > 0)
01958                     {
01959                       *bp++ = *start_format++;
01960                       --bspace;
01961                     }
01962                   if (bspace > 0)
01963                     {
01964                       *bp++ = *format_str;
01965                       --bspace;
01966                     }
01967                   break;
01968                 }
01969 
01970               // Bump to the next char in the caller's format_str
01971               ++format_str;
01972             }
01973 
01974           if (!skip_nul_locate)
01975             while (*bp != '\0') // Locate end of bp.
01976               ++bp;
01977         }
01978     }
01979 
01980   *bp = '\0'; // Terminate bp, but don't auto-increment this!
01981 
01982   ssize_t result = 0;
01983 
01984   // Check that memory was not corrupted, if it corrupted we can't log anything
01985   // anymore because all our members could be corrupted.
01986   if (bp >= (this->msg_ + ACE_MAXLOGMSGLEN+1))
01987     {
01988       abort_prog = 1;
01989       ACE_OS::fprintf (stderr,
01990                        "The following logged message is too long!\n");
01991     }
01992   else
01993     {
01994       // Copy the message from thread-specific storage into the transfer
01995       // buffer (this can be optimized away by changing other code...).
01996       log_record.msg_data (this->msg ());
01997 
01998       // Write the <log_record> to the appropriate location.
01999       result = this->log (log_record,
02000                           abort_prog);
02001     }
02002 
02003   if (abort_prog)
02004     {
02005       // Since we are now calling abort instead of exit, this value is
02006       // not used.
02007       ACE_UNUSED_ARG (exit_value);
02008 
02009       // *Always* print a message to stderr if we're aborting.  We
02010       // don't use verbose, however, to avoid recursive aborts if
02011       // something is hosed.
02012       log_record.print (ACE_Log_Msg::local_host_, 0, stderr);
02013       ACE_OS::abort ();
02014     }
02015 
02016    return result;
02017 }

ssize_t ACE_Log_Msg::log ACE_Log_Priority  log_priority,
const ACE_ANTI_TCHAR format_str,
... 
 

Since this is the ANTI_TCHAR version, we need to convert the format string over.

Definition at line 954 of file Log_Msg.cpp.

References ACE_ANTI_TCHAR, ACE_TEXT_ANTI_TO_TCHAR, ACE_TRACE, log(), and ssize_t.

00956 {
00957   ACE_TRACE ("ACE_Log_Msg::log");
00958 
00959   // Start of variable args section.
00960   va_list argp;
00961 
00962   va_start (argp, format_str);
00963 
00964   ssize_t result = this->log (ACE_TEXT_ANTI_TO_TCHAR (format_str),
00965                               log_priority,
00966                               argp);
00967   va_end (argp);
00968 
00969   return result;
00970 }

ssize_t ACE_Log_Msg::log ACE_Log_Priority  priority,
const ACE_TCHAR format,
... 
 

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.
  • 'c': print a character
  • 'C': print a character string
  • '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 _sys_siglist entry corresponding to var-argument.
  • 's': print out a character string
  • 'T': print timestamp in hour:minute:sec:usec format.
  • 'D': print timestamp in month/day/year hour:minute:sec:usec format.
  • 't': print thread id (1 if single-threaded)
  • 'u': print as unsigned int
  • 'w': prints a wide character
  • 'W': print a wide character string
  • '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 out a single percent sign, '%'

Definition at line 930 of file Log_Msg.cpp.

References ACE_TCHAR, ACE_TRACE, and ssize_t.

Referenced by __ace_assert(), log(), and log_hexdump().

00932 {
00933   ACE_TRACE ("ACE_Log_Msg::log");
00934 
00935   // Start of variable args section.
00936   va_list argp;
00937 
00938   va_start (argp, format_str);
00939 
00940   ssize_t result = this->log (format_str,
00941                               log_priority,
00942                               argp);
00943   va_end (argp);
00944 
00945   return result;
00946 }

int ACE_Log_Msg::log_hexdump ACE_Log_Priority  log_priority,
const char *  buffer,
size_t  size,
const ACE_TCHAR text = 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.

Definition at line 2162 of file Log_Msg.cpp.

References ACE_LIB_TEXT, ACE_NEW_RETURN, ACE_SIZE_T_FORMAT_SPECIFIER, ACE_TCHAR, log(), log_priority_enabled(), ACE_OS::sprintf(), and ACE_OS::strlen().

02166 {
02167   // Only print the message if <priority_mask_> hasn't been reset to
02168   // exclude this logging priority.
02169   if (this->log_priority_enabled (log_priority) == 0)
02170     return 0;
02171 
02172   ACE_TCHAR* buf = 0;
02173   const size_t buf_sz =
02174     ACE_Log_Record::MAXLOGMSGLEN - ACE_Log_Record::VERBOSE_LEN - 58;
02175   ACE_NEW_RETURN (buf, ACE_TCHAR[buf_sz], -1);
02176 
02177   ACE_TCHAR *msg_buf = 0;
02178   const size_t text_sz = text ? ACE_OS::strlen(text) : 0;
02179   ACE_NEW_RETURN (msg_buf,
02180                   ACE_TCHAR[text_sz + 58],
02181                  -1);
02182 
02183   buf[0] = 0; // in case size = 0
02184 
02185   const size_t len = ACE::format_hexdump
02186     (buffer, size, buf, buf_sz / sizeof (ACE_TCHAR) - text_sz);
02187 
02188   int sz = 0;
02189 
02190   if (text)
02191     sz = ACE_OS::sprintf (msg_buf,
02192                           ACE_LIB_TEXT ("%s - "),
02193                           text);
02194 
02195   sz += ACE_OS::sprintf (msg_buf + sz,
02196                          ACE_LIB_TEXT ("HEXDUMP ")
02197                          ACE_SIZE_T_FORMAT_SPECIFIER
02198                          ACE_LIB_TEXT (" bytes"),
02199                          size);
02200 
02201   if (len < size)
02202     ACE_OS::sprintf (msg_buf + sz,
02203                      ACE_LIB_TEXT (" (showing first ")
02204                      ACE_SIZE_T_FORMAT_SPECIFIER
02205                      ACE_LIB_TEXT (" bytes)"),
02206                      len);
02207 
02208   // Now print out the formatted buffer.
02209   this->log (log_priority,
02210              ACE_LIB_TEXT ("%s\n%s"),
02211              msg_buf,
02212              buf);
02213 
02214   delete [] msg_buf;
02215   delete [] buf;
02216   return 0;
02217 }

int ACE_Log_Msg::log_priority_enabled ACE_Log_Priority  log_priority,
const char *  ,
... 
 

Return true if the requested priority is enabled.

Definition at line 2567 of file Log_Msg.cpp.

References log_priority_enabled().

02570 {
02571   return this->log_priority_enabled (log_priority);
02572 }

int ACE_Log_Msg::log_priority_enabled ACE_Log_Priority  log_priority  ) 
 

Return true if the requested priority is enabled.

Definition at line 628 of file Log_Msg.cpp.

References ACE_BIT_ENABLED, and process_priority_mask_.

Referenced by log(), log_hexdump(), and log_priority_enabled().

00629 {
00630   return ACE_BIT_ENABLED (this->priority_mask_ |
00631                           ACE_Log_Msg::process_priority_mask_,
00632                           log_priority);
00633 }

const ACE_TCHAR * ACE_Log_Msg::msg void   ) 
 

Get the message that describes what type of error occurred.

Definition at line 2458 of file Log_Msg.cpp.

References msg_, and msg_off_.

Referenced by log().

02459 {
02460   return this->msg_ + ACE_Log_Msg::msg_off_;
02461 }

void ACE_Log_Msg::msg const ACE_TCHAR  ) 
 

Set the message that describes what type of error occurred.

Definition at line 2464 of file Log_Msg.cpp.

References ACE_MAXLOGMSGLEN, ACE_TCHAR, and ACE_OS::strsncpy().

02465 {
02466   ACE_OS::strsncpy (this->msg_, m,
02467                     ((ACE_MAXLOGMSGLEN+1) / sizeof (ACE_TCHAR)));
02468 }

ACE_Log_Msg_Backend * ACE_Log_Msg::msg_backend void   )  [static]
 

Definition at line 2497 of file Log_Msg.cpp.

References ACE_GUARD_RETURN, and ACE_TRACE.

02498 {
02499   ACE_TRACE ("ACE_Log_Msg::msg_backend");
02500   ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
02501                             *ACE_Log_Msg_Manager::get_lock (), 0));
02502 
02503   return ACE_Log_Msg_Manager::custom_backend_;
02504 }

ACE_Log_Msg_Backend * ACE_Log_Msg::msg_backend ACE_Log_Msg_Backend b  )  [static]
 

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.

Definition at line 2485 of file Log_Msg.cpp.

References ACE_GUARD_RETURN, and ACE_TRACE.

02486 {
02487   ACE_TRACE ("ACE_Log_Msg::msg_backend");
02488   ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
02489                             *ACE_Log_Msg_Manager::get_lock (), 0));
02490 
02491   ACE_Log_Msg_Backend *tmp  = ACE_Log_Msg_Manager::custom_backend_;
02492   ACE_Log_Msg_Manager::custom_backend_ = b;
02493   return tmp;
02494 }

ACE_Log_Msg_Callback * ACE_Log_Msg::msg_callback void   )  const
 

Definition at line 2471 of file Log_Msg.cpp.

References msg_callback_.

Referenced by log(), and set().

02472 {
02473   return this->msg_callback_;
02474 }

ACE_Log_Msg_Callback * ACE_Log_Msg::msg_callback ACE_Log_Msg_Callback c  ) 
 

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.

Definition at line 2477 of file Log_Msg.cpp.

References msg_callback_.

Referenced by __ace_assert().

02478 {
02479   ACE_Log_Msg_Callback *old = this->msg_callback_;
02480   this->msg_callback_ = c;
02481   return old;
02482 }

ACE_OSTREAM_TYPE * ACE_Log_Msg::msg_ostream void   )  const
 

Get the ostream that is used to print error messages.

Definition at line 2507 of file Log_Msg.cpp.

References ostream_.

Referenced by log(), open(), and set().

02508 {
02509   return this->ostream_;
02510 }

void ACE_Log_Msg::msg_ostream ACE_OSTREAM_TYPE *  ,
int  delete_ostream
 

delete_stream == 1, 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)

Definition at line 2513 of file Log_Msg.cpp.

References delete_ostream_, ACE_OS::fclose(), and ostream_.

02514 {
02515   if (this->ostream_ == m)
02516     return;
02517 
02518   if (this->delete_ostream_)
02519     {
02520 #if defined (ACE_LACKS_IOSTREAM_TOTALLY)
02521       ACE_OS::fclose (this->ostream_);
02522 #else
02523       delete this->ostream_;
02524 #endif
02525     }
02526 
02527   this->delete_ostream_ = delete_ostream;
02528   this->ostream_ = m;
02529 }

void ACE_Log_Msg::msg_ostream ACE_OSTREAM_TYPE *   ) 
 

Update the ostream without overwriting the delete_ostream_ flag.

Definition at line 2532 of file Log_Msg.cpp.

References ostream_.

Referenced by __ace_assert(), ACE_Logging_Strategy::handle_timeout(), inherit_hook(), ACE_Logging_Strategy::init(), and init_hook().

02533 {
02534   this->ostream_ = m;
02535 }

int ACE_Log_Msg::op_status void   ) 
 

Get the result of the operation status (by convention, -1 means error).

Definition at line 2305 of file Log_Msg.cpp.

References status_.

Referenced by log(), and set().

02306 {
02307   return this->status_;
02308 }

void ACE_Log_Msg::op_status int  status  ) 
 

Set the result of the operation status (by convention, -1 means error).

Definition at line 2299 of file Log_Msg.cpp.

References status_.

02300 {
02301   this->status_ = status;
02302 }

int ACE_Log_Msg::open const ACE_TCHAR prog_name,
u_long  options_flags = ACE_Log_Msg::STDERR,
const ACE_TCHAR logger_key = 0
 

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.

Parameters:
prog_name The name of the calling program.
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).
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 flags argument. If the SYSLOG bit is set in flags, 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 logger_key is 0, prog_name is used.

Definition at line 768 of file Log_Msg.cpp.

References ACE_ALLOCATOR_RETURN, ACE_BIT_ENABLED, ACE_CLR_BITS, ACE_GUARD_RETURN, ACE_LIB_TEXT, ACE_NO_HEAP_CHECK, ACE_SET_BITS, ACE_TCHAR, ACE_TRACE, CUSTOM, flags_, ACE_OS::free(), LOGGER, MSG_CALLBACK, msg_ostream(), ACE_Log_Msg_Backend::open(), OSTREAM, program_name_, ACE_Log_Msg_Backend::reset(), SILENT, STDERR, SYSLOG, VERBOSE, and VERBOSE_LITE.

Referenced by ACE_Logging_Strategy::init(), and ACE_Service_Config::open_i().

00771 {
00772   ACE_TRACE ("ACE_Log_Msg::open");
00773   ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
00774                             *ACE_Log_Msg_Manager::get_lock (), -1));
00775 
00776   if (prog_name)
00777     {
00778       ACE_OS::free ((void *) ACE_Log_Msg::program_name_);
00779 
00780       // Stop heap checking, block will be freed by the destructor.
00781       {
00782         ACE_NO_HEAP_CHECK;
00783 
00784         ACE_ALLOCATOR_RETURN (ACE_Log_Msg::program_name_,
00785                               ACE_OS::strdup (prog_name),
00786                               -1);
00787       }
00788     }
00789   else if (ACE_Log_Msg::program_name_ == 0)
00790     {
00791       // Stop heap checking, block will be freed by the destructor.
00792       ACE_NO_HEAP_CHECK;
00793       ACE_ALLOCATOR_RETURN (ACE_Log_Msg::program_name_,
00794                             ACE_OS::strdup (ACE_LIB_TEXT ("<unknown>")),
00795                             -1);
00796     }
00797 
00798   int status = 0;
00799 
00800   // Be sure that there is a message_queue_, with multiple threads.
00801   ACE_MT (ACE_Log_Msg_Manager::init_backend (&flags));
00802 
00803   // Always close the current handle before doing anything else.
00804   if (ACE_Log_Msg_Manager::log_backend_ != 0)
00805     ACE_Log_Msg_Manager::log_backend_->reset ();
00806 
00807   if (ACE_Log_Msg_Manager::custom_backend_ != 0)
00808     ACE_Log_Msg_Manager::custom_backend_->reset ();
00809 
00810   // Note that if we fail to open the message queue the default action
00811   // is to use stderr (set via static initialization in the
00812   // Log_Msg.cpp file).
00813 
00814   if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::LOGGER)
00815       || ACE_BIT_ENABLED (flags, ACE_Log_Msg::SYSLOG))
00816     {
00817       // The SYSLOG backends (both NT and UNIX) can get along fine
00818       // without the logger_key - they will default to prog_name if
00819       // logger key is 0.
00820       if (logger_key == 0 && ACE_BIT_ENABLED (flags, ACE_Log_Msg::LOGGER))
00821         status = -1;
00822       else
00823         status = ACE_Log_Msg_Manager::log_backend_->open (logger_key);
00824 
00825       if (status == -1)
00826         ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::STDERR);
00827       else
00828         {
00829           if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::LOGGER))
00830             ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER);
00831           if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::SYSLOG))
00832             ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::SYSLOG);
00833         }
00834     }
00835   else if (ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER)
00836            || ACE_BIT_ENABLED (ACE_Log_Msg::flags_, ACE_Log_Msg::SYSLOG))
00837     {
00838       // If we are closing down logger, redirect logging to stderr.
00839       ACE_CLR_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::LOGGER);
00840       ACE_CLR_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::SYSLOG);
00841       ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::STDERR);
00842     }
00843 
00844   if (ACE_BIT_ENABLED (flags, ACE_Log_Msg::CUSTOM))
00845     {
00846       status =
00847         ACE_Log_Msg_Manager::custom_backend_->open (logger_key);
00848 
00849       if (status != -1)
00850         ACE_SET_BITS (ACE_Log_Msg::flags_, ACE_Log_Msg::CUSTOM);
00851     }
00852 
00853   // Remember, ACE_Log_Msg::STDERR bit is on by default...
00854   if (status != -1
00855       && ACE_BIT_ENABLED (flags,
00856                           ACE_Log_Msg::STDERR) == 0)
00857     ACE_CLR_BITS (ACE_Log_Msg::flags_,
00858                   ACE_Log_Msg::STDERR);
00859 
00860   // VERBOSE takes precedence over VERBOSE_LITE...
00861   if (ACE_BIT_ENABLED (flags,
00862                        ACE_Log_Msg::VERBOSE_LITE))
00863     ACE_SET_BITS (ACE_Log_Msg::flags_,
00864                   ACE_Log_Msg::VERBOSE_LITE);
00865   else if (ACE_BIT_ENABLED (flags,
00866                             ACE_Log_Msg::VERBOSE))
00867     ACE_SET_BITS (ACE_Log_Msg::flags_,
00868                   ACE_Log_Msg::VERBOSE);
00869 
00870   if (ACE_BIT_ENABLED (flags,
00871                        ACE_Log_Msg::OSTREAM))
00872     {
00873       ACE_SET_BITS (ACE_Log_Msg::flags_,
00874                     ACE_Log_Msg::OSTREAM);
00875       // Only set this to cerr if it hasn't already been set.
00876       if (this->msg_ostream () == 0)
00877         this->msg_ostream (ACE_DEFAULT_LOG_STREAM);
00878     }
00879 
00880   if (ACE_BIT_ENABLED (flags,
00881                        ACE_Log_Msg::MSG_CALLBACK))
00882     ACE_SET_BITS (ACE_Log_Msg::flags_,
00883                   ACE_Log_Msg::MSG_CALLBACK);
00884 
00885   if (ACE_BIT_ENABLED (flags,
00886                        ACE_Log_Msg::SILENT))
00887     ACE_SET_BITS (ACE_Log_Msg::flags_,
00888                   ACE_Log_Msg::SILENT);
00889 
00890   return status;
00891 }

ACE_Log_Msg& ACE_Log_Msg::operator= const ACE_Log_Msg  )  [private]
 

u_long ACE_Log_Msg::priority_mask u_long  ,
MASK_TYPE  = THREAD
 

Set the ACE_Log_Priority mask, returns original mask.

Definition at line 601 of file Log_Msg.cpp.

References priority_mask_, process_priority_mask_, and THREAD.

00602 {
00603   u_long o_mask;
00604 
00605   if (mask_type == THREAD)
00606     {
00607       o_mask = this->priority_mask_;
00608       this->priority_mask_ = n_mask;
00609     }
00610   else
00611     {
00612       o_mask = ACE_Log_Msg::process_priority_mask_;
00613       ACE_Log_Msg::process_priority_mask_ = n_mask;
00614     }
00615 
00616   return o_mask;
00617 }

u_long ACE_Log_Msg::priority_mask MASK_TYPE  = THREAD  ) 
 

Get the current ACE_Log_Priority mask.

Definition at line 620 of file Log_Msg.cpp.

References priority_mask_, process_priority_mask_, and THREAD.

Referenced by disable_debug_messages(), enable_debug_messages(), inherit_hook(), ACE_Logging_Strategy::init(), init_hook(), and ACE_Service_Gestalt::open_i().

00621 {
00622   return mask_type == THREAD
00623     ? this->priority_mask_
00624     :  ACE_Log_Msg::process_priority_mask_;
00625 }

const ACE_TCHAR * ACE_Log_Msg::program_name void   )  [static]
 

Returns the current program name used for logging.

Definition at line 415 of file Log_Msg.cpp.

References program_name_.

Referenced by ACE_Log_Msg_UNIX_Syslog::open(), and ACE_Log_Msg_NT_Event_Log::open().

00416 {
00417   return ACE_Log_Msg::program_name_;
00418 }

int ACE_Log_Msg::release void   ) 
 

Release the internal lock.

Definition at line 636 of file Log_Msg.cpp.

References ACE_TRACE, and ACE_Recursive_Thread_Mutex::release().

Referenced by ACE_Logging_Strategy::handle_timeout().

00637 {
00638   ACE_TRACE ("ACE_Log_Msg::release");
00639 
00640 #if defined (ACE_MT_SAFE) && (ACE_MT_SAFE != 0)
00641   return ACE_Log_Msg_Manager::get_lock ()->release ();
00642 #else  /* ! ACE_MT_SAFE */
00643   return 0;
00644 #endif /* ! ACE_MT_SAFE */
00645 }

int ACE_Log_Msg::restart void   ) 
 

Get the field that indicates whether interrupted calls should be restarted.

Definition at line 2317 of file Log_Msg.cpp.

Referenced by set().

02318 {
02319   return this->restart_;
02320 }

void ACE_Log_Msg::restart int   ) 
 

Set the field that indicates whether interrupted calls should be restarted.

Definition at line 2311 of file Log_Msg.cpp.

Referenced by __ace_assert(), inherit_hook(), and init_hook().

02312 {
02313   this->restart_ = r;
02314 }

void ACE_Log_Msg::set const char *  file,
int  line,
int  op_status = -1,
int  errnum = 0,
int  restart = 1,
ACE_OSTREAM_TYPE *  os = 0,
ACE_Log_Msg_Callback c = 0
 

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.

Definition at line 2220 of file Log_Msg.cpp.

References ACE_TRACE, errnum(), file(), linenum(), msg_callback(), msg_ostream(), op_status(), and restart().

Referenced by __ace_assert(), and log().

02227 {
02228   ACE_TRACE ("ACE_Log_Msg::set");
02229   this->file (filename);
02230   this->linenum (line);
02231   this->op_status (status);
02232   this->errnum (err);
02233   this->restart (rs);
02234   this->msg_ostream (os);
02235   this->msg_callback (c);
02236 }

void ACE_Log_Msg::set_flags u_long  f  ) 
 

Enable the bits in the logger's options flags.

Definition at line 570 of file Log_Msg.cpp.

References ACE_GUARD, ACE_SET_BITS, ACE_TRACE, and flags_.

Referenced by ACE_Logging_Strategy::init().

00571 {
00572   ACE_TRACE ("ACE_Log_Msg::set_flags");
00573   ACE_MT (ACE_GUARD (ACE_Recursive_Thread_Mutex, ace_mon,
00574                      *ACE_Log_Msg_Manager::get_lock ()));
00575 
00576   ACE_SET_BITS (ACE_Log_Msg::flags_, flgs);
00577 }

void ACE_Log_Msg::start_tracing void   ) 
 

Start tracing status on a per-thread basis...

Definition at line 2426 of file Log_Msg.cpp.

References tracing_enabled_.

Referenced by inherit_hook(), and log().

02427 {
02428   this->tracing_enabled_ = 1;
02429 }

void ACE_Log_Msg::stop_tracing void   ) 
 

Stop tracing status on a per-thread basis...

Definition at line 2434 of file Log_Msg.cpp.

References tracing_enabled_.

Referenced by log().

02435 {
02436   this->tracing_enabled_ = 0;
02437 }

void ACE_Log_Msg::sync const ACE_TCHAR program_name  ) 
 

Call after doing a fork() to resynchronize the process id and program_name_ variables.

Definition at line 534 of file Log_Msg.cpp.

References ACE_NO_HEAP_CHECK, ACE_TCHAR, ACE_TRACE, ACE_OS::free(), ACE_OS::getpid(), msg_off_, pid_, program_name_, and ACE_OS::strdup().

00535 {
00536   ACE_TRACE ("ACE_Log_Msg::sync");
00537 
00538   if (prog_name)
00539     {
00540       // Must free if already allocated!!!
00541       ACE_OS::free ((void *) ACE_Log_Msg::program_name_);
00542 
00543       // Stop heap checking, block will be freed by the destructor when
00544       // the last ACE_Log_Msg instance is deleted.
00545       // Heap checking state will be restored when the block is left.
00546       {
00547         ACE_NO_HEAP_CHECK;
00548 
00549         ACE_Log_Msg::program_name_ = ACE_OS::strdup (prog_name);
00550       }
00551     }
00552 
00553   ACE_Log_Msg::pid_ = ACE_OS::getpid ();
00554   ACE_Log_Msg::msg_off_ = 0;
00555 }

void ACE_Log_Msg::sync_hook const ACE_TCHAR prg_name  )  [static, private]
 

Decouple the OS layer from the ACE_Log_Msg layer.

Definition at line 520 of file Log_Msg.cpp.

References ACE_LOG_MSG, and ACE_TCHAR.

Referenced by ACE_Log_Msg().

00521 {
00522   ACE_LOG_MSG->sync (prg_name);
00523 }

void ACE_Log_Msg::thr_desc ACE_Thread_Descriptor td  ) 
 

Set the TSS thread descriptor. This method will call td->acquire_release to block execution until this call return.

Definition at line 2389 of file Log_Msg.cpp.

References ACE_Thread_Descriptor::acquire_release().

02390 {
02391   this->thr_desc_ = td;
02392 
02393   if (td != 0)
02394     td->acquire_release ();
02395 }

ACE_Thread_Descriptor * ACE_Log_Msg::thr_desc void   )  const
 

Get the TSS thread descriptor.

Definition at line 2383 of file Log_Msg.cpp.

Referenced by inherit_hook().

02384 {
02385   return this->thr_desc_;
02386 }

ACE_OS_Thread_Descriptor * ACE_Log_Msg::thr_desc_hook void   )  [static, private]
 

Return the TSS singleton thread descriptor.

Definition at line 526 of file Log_Msg.cpp.

References ACE_LOG_MSG.

Referenced by ACE_Log_Msg().

00527 {
00528   return ACE_LOG_MSG->thr_desc ();
00529 }

void ACE_Log_Msg::trace_active int  value  ) 
 

Get trace active status.

Definition at line 2377 of file Log_Msg.cpp.

References trace_active_.

02378 {
02379   this->trace_active_ = value;
02380 }

int ACE_Log_Msg::trace_active void   ) 
 

Set trace active status.

Definition at line 2371 of file Log_Msg.cpp.

References trace_active_.

Referenced by ACE_Trace::ACE_Trace(), and ACE_Trace::~ACE_Trace().

02372 {
02373   return this->trace_active_;
02374 }

void ACE_Log_Msg::trace_depth int   ) 
 

Set trace depth.

Definition at line 2365 of file Log_Msg.cpp.

References trace_depth_.

02366 {
02367   this->trace_depth_ = depth;
02368 }

int ACE_Log_Msg::trace_depth void   ) 
 

Get trace depth.

Definition at line 2359 of file Log_Msg.cpp.

References trace_depth_.

Referenced by inherit_hook(), and init_hook().

02360 {
02361   return this->trace_depth_;
02362 }

int ACE_Log_Msg::tracing_enabled void   ) 
 

Query tracing status on a per-thread basis...

Definition at line 2440 of file Log_Msg.cpp.

References tracing_enabled_.

Referenced by ACE_Trace::ACE_Trace(), init_hook(), log(), and ACE_Trace::~ACE_Trace().

02441 {
02442   return this->tracing_enabled_;
02443 }


Member Data Documentation

ACE_Log_Msg::ACE_ALLOC_HOOK_DECLARE
 

Declare the dynamic allocation hooks.

Definition at line 565 of file Log_Msg.h.

struct { ... } ACE_Log_Msg::conditional_values_ [private]
 

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.

Referenced by ACE_Log_Msg(), conditional_set(), and log().

u_long ACE_Log_Msg::default_priority_mask_ = 0 [static, private]
 

Priority mask to use for each new instance

Definition at line 437 of file Log_Msg.cpp.

Referenced by disable_debug_messages(), and enable_debug_messages().

int ACE_Log_Msg::delete_ostream_ [private]
 

Are we deleting this ostream?

Definition at line 605 of file Log_Msg.h.

Referenced by msg_ostream(), and ~ACE_Log_Msg().

int ACE_Log_Msg::errnum_ [private]
 

Type of error that occurred (see <sys/errno.h>).

Definition at line 672 of file Log_Msg.h.

Referenced by errnum().

const char* ACE_Log_Msg::file_ [private]
 

Definition at line 669 of file Log_Msg.h.

char ACE_Log_Msg::file_[MAXPATHLEN + 1] [private]
 

File where the error occurred.

Definition at line 578 of file Log_Msg.h.

u_long ACE_Log_Msg::flags_ = ACE_Log_Msg::STDERR [static, private]
 

Default is to use stderr.

Options flags used to hold the logger flag options, e.g., STDERR, LOGGER, OSTREAM, MSG_CALLBACK, etc.

Definition at line 427 of file Log_Msg.cpp.

Referenced by clr_flags(), flags(), log(), open(), and set_flags().

int ACE_Log_Msg::instance_count_ = 0 [static, private]
 

Number of existing ACE_Log_Msg instances; when 0, delete program/host names

Definition at line 94 of file Log_Msg.cpp.

Referenced by ACE_Log_Msg(), and ~ACE_Log_Msg().

int ACE_Log_Msg::is_set_ [private]
 

Definition at line 668 of file Log_Msg.h.

int ACE_Log_Msg::line_ [private]
 

Definition at line 670 of file Log_Msg.h.

int ACE_Log_Msg::linenum_ [private]
 

Line number where the error occurred.

Definition at line 575 of file Log_Msg.h.

Referenced by linenum().

const ACE_TCHAR * ACE_Log_Msg::local_host_ = 0 [static, private]
 

Name of the local host (used when printing messages).

Definition at line 421 of file Log_Msg.cpp.

Referenced by local_host(), log(), and ~ACE_Log_Msg().

ACE_TCHAR* ACE_Log_Msg::msg_ [private]
 

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().

Definition at line 583 of file Log_Msg.h.

Referenced by log(), msg(), and ~ACE_Log_Msg().

ACE_Log_Msg_Callback* ACE_Log_Msg::msg_callback_ [private]
 

The callback object.

Definition at line 593 of file Log_Msg.h.

Referenced by msg_callback().

long ACE_Log_Msg::msg_off_ = 0 [static, private]
 

Offset of msg_[].

Definition at line 433 of file Log_Msg.cpp.

Referenced by log(), msg(), and sync().

int ACE_Log_Msg::op_status_ [private]
 

Definition at line 671 of file Log_Msg.h.

ACE_OSTREAM_TYPE* ACE_Log_Msg::ostream_ [private]
 

The ostream where logging messages can be written.

Definition at line 590 of file Log_Msg.h.

Referenced by msg_ostream(), and ~ACE_Log_Msg().

pid_t ACE_Log_Msg::pid_ = -1 [static, private]
 

Process id of the current process.

Definition at line 430 of file Log_Msg.cpp.

Referenced by getpid(), and sync().

u_long ACE_Log_Msg::priority_mask_ [private]
 

Keeps track of all the per-thread ACE_Log_Priority values that are currently enabled. Default is for all logging priorities to be disabled.

Definition at line 620 of file Log_Msg.h.

Referenced by priority_mask().

u_long ACE_Log_Msg::process_priority_mask_ [static, private]
 

Initial value:

Keeps track of all the per-process ACE_Log_Priority values that are currently enabled. Default is for all logging priorities to be enabled.

Definition at line 441 of file Log_Msg.cpp.

Referenced by log_priority_enabled(), and priority_mask().

const ACE_TCHAR * ACE_Log_Msg::program_name_ = 0 [static, private]
 

Records the program name.

Definition at line 424 of file Log_Msg.cpp.

Referenced by log(), open(), program_name(), sync(), and ~ACE_Log_Msg().

int ACE_Log_Msg::restart_ [private]
 

Indicates whether we should restart system calls that are interrupted.

Definition at line 587 of file Log_Msg.h.

int ACE_Log_Msg::status_ [private]
 

Status of operation (-1 means failure, >= 0 means success).

Definition at line 569 of file Log_Msg.h.

Referenced by op_status().

ACE_Thread_Descriptor* ACE_Log_Msg::thr_desc_ [private]
 

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.

Definition at line 613 of file Log_Msg.h.

int ACE_Log_Msg::timestamp_ [private]
 

Always timestamp?

Definition at line 623 of file Log_Msg.h.

Referenced by ACE_Log_Msg(), and log().

int ACE_Log_Msg::trace_active_ [private]
 

Are we already within an ACE_Trace constructor call?

Definition at line 599 of file Log_Msg.h.

Referenced by trace_active().

int ACE_Log_Msg::trace_depth_ [private]
 

Depth of the nesting for printing traces.

Definition at line 596 of file Log_Msg.h.

Referenced by dec(), inc(), log(), and trace_depth().

int ACE_Log_Msg::tracing_enabled_ [private]
 

Are we allowing tracing in this thread?

Definition at line 602 of file Log_Msg.h.

Referenced by start_tracing(), stop_tracing(), and tracing_enabled().


The documentation for this class was generated from the following files:
Generated on Thu Nov 9 11:24:01 2006 for ACE by doxygen 1.3.6