diff options
Diffstat (limited to 'ACE/examples/C++NPv2/TP_Logging_Server.cpp')
-rw-r--r-- | ACE/examples/C++NPv2/TP_Logging_Server.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/ACE/examples/C++NPv2/TP_Logging_Server.cpp b/ACE/examples/C++NPv2/TP_Logging_Server.cpp new file mode 100644 index 00000000000..7342cf4c757 --- /dev/null +++ b/ACE/examples/C++NPv2/TP_Logging_Server.cpp @@ -0,0 +1,70 @@ +/* +** $Id$ +** +** Copyright 2002 Addison Wesley. All Rights Reserved. +*/ + +#include "ace/OS_Memory.h" +#include "ace/Guard_T.h" +#include "ace/Message_Block.h" +#include "TP_Logging_Server.h" + +int TP_Logging_Handler::handle_input (ACE_HANDLE) { + ACE_Message_Block *mblk = 0; + if (logging_handler_.recv_log_record (mblk) != -1) { + ACE_Message_Block *log_blk = 0; + ACE_NEW_RETURN + (log_blk, ACE_Message_Block + (reinterpret_cast<char *> (this)), -1); + log_blk->cont (mblk); + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, guard, lock_, -1); + if (TP_LOGGING_TASK::instance ()->put (log_blk) == -1) + { log_blk->release (); return -1; } + ++queued_count_; + return 0; + } else return -1; +} + + +int +TP_Logging_Handler::handle_close (ACE_HANDLE handle, + ACE_Reactor_Mask) { + int close_now = 0; + if (handle != ACE_INVALID_HANDLE) { + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, guard, lock_, -1); + if (queued_count_ == 0) + close_now = 1; + else + deferred_close_ = 1; + } else { + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, guard, lock_, -1); + queued_count_--; + if (queued_count_ == 0) close_now = deferred_close_; + } + + if (close_now) + return Logging_Event_Handler::handle_close (); + return 0; +} + + +int TP_Logging_Task::svc () { + for (ACE_Message_Block *log_blk; getq (log_blk) != -1; ) { + TP_Logging_Handler *tp_handler = reinterpret_cast<TP_Logging_Handler *> (log_blk->rd_ptr ()); + Logging_Handler logging_handler (tp_handler->log_file ()); + logging_handler.write_log_record (log_blk->cont ()); + + log_blk->release (); + tp_handler->handle_close (ACE_INVALID_HANDLE, 0); + } + return 0; +} + +ACE_FACTORY_DEFINE (TPLS, TP_Logging_Server) + +#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION) +template ACE_Singleton<TP_Logging_Task, ACE_Null_Mutex> * + ACE_Singleton<TP_Logging_Task, ACE_Null_Mutex>::singleton_; +template ACE_Unmanaged_Singleton<TP_Logging_Task, ACE_Null_Mutex> * + ACE_Unmanaged_Singleton<TP_Logging_Task, ACE_Null_Mutex>::singleton_; +#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */ |