diff options
author | Steve Huston <shuston@riverace.com> | 2002-05-24 00:38:48 +0000 |
---|---|---|
committer | Steve Huston <shuston@riverace.com> | 2002-05-24 00:38:48 +0000 |
commit | a86a0bf2a3713cfa17fececcbbf901d604450bf8 (patch) | |
tree | 657918051a754b297b04b3c5fa86e2f23b8d1ca3 | |
parent | 0d9148f6ca9728920ae5f6959d65016538bdac57 (diff) | |
download | ATCD-a86a0bf2a3713cfa17fececcbbf901d604450bf8.tar.gz |
ChangeLogTag:Thu May 23 20:35:22 2002 Steve Huston <shuston@riverace.com>
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | ChangeLogs/ChangeLog-02a | 13 | ||||
-rw-r--r-- | ChangeLogs/ChangeLog-03a | 13 | ||||
-rw-r--r-- | ace/Module.cpp | 9 | ||||
-rw-r--r-- | ace/RB_Tree.h | 10 | ||||
-rw-r--r-- | examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp | 54 | ||||
-rw-r--r-- | examples/C++NPv2/display_logfile.cpp | 19 |
7 files changed, 98 insertions, 33 deletions
diff --git a/ChangeLog b/ChangeLog index 3f4e85b0402..d5ea5c9a3d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +Thu May 23 20:35:22 2002 Steve Huston <shuston@riverace.com> + + * ace/RB_Tree.h: Clarified that iterator is valid after changes to + container only if the iterated-over element is not removed. Thanks + to Craig Ching <cching@mqsoftware.com> for noticing this. + + * ace/Module.cpp (close): Fixed to only use the passed-in flags if + the task delete policy was not set explicitly. Thanks to Doug + Schmidt for this fix! + + * examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp: Use new technique + for detecting "quit" command. Unified with book content. + Thu May 23 20:36:46 UTC 2002 Craig Rodrigues <crodrigu@bbn.com> * bin/nightlybuilds/builds.lst: Move Lynx_PPC build to new scoreboard. diff --git a/ChangeLogs/ChangeLog-02a b/ChangeLogs/ChangeLog-02a index 3f4e85b0402..d5ea5c9a3d5 100644 --- a/ChangeLogs/ChangeLog-02a +++ b/ChangeLogs/ChangeLog-02a @@ -1,3 +1,16 @@ +Thu May 23 20:35:22 2002 Steve Huston <shuston@riverace.com> + + * ace/RB_Tree.h: Clarified that iterator is valid after changes to + container only if the iterated-over element is not removed. Thanks + to Craig Ching <cching@mqsoftware.com> for noticing this. + + * ace/Module.cpp (close): Fixed to only use the passed-in flags if + the task delete policy was not set explicitly. Thanks to Doug + Schmidt for this fix! + + * examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp: Use new technique + for detecting "quit" command. Unified with book content. + Thu May 23 20:36:46 UTC 2002 Craig Rodrigues <crodrigu@bbn.com> * bin/nightlybuilds/builds.lst: Move Lynx_PPC build to new scoreboard. diff --git a/ChangeLogs/ChangeLog-03a b/ChangeLogs/ChangeLog-03a index 3f4e85b0402..d5ea5c9a3d5 100644 --- a/ChangeLogs/ChangeLog-03a +++ b/ChangeLogs/ChangeLog-03a @@ -1,3 +1,16 @@ +Thu May 23 20:35:22 2002 Steve Huston <shuston@riverace.com> + + * ace/RB_Tree.h: Clarified that iterator is valid after changes to + container only if the iterated-over element is not removed. Thanks + to Craig Ching <cching@mqsoftware.com> for noticing this. + + * ace/Module.cpp (close): Fixed to only use the passed-in flags if + the task delete policy was not set explicitly. Thanks to Doug + Schmidt for this fix! + + * examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp: Use new technique + for detecting "quit" command. Unified with book content. + Thu May 23 20:36:46 UTC 2002 Craig Rodrigues <crodrigu@bbn.com> * bin/nightlybuilds/builds.lst: Move Lynx_PPC build to new scoreboard. diff --git a/ace/Module.cpp b/ace/Module.cpp index 51b4540b83e..2272dc2eed9 100644 --- a/ace/Module.cpp +++ b/ace/Module.cpp @@ -202,12 +202,15 @@ ACE_Module<ACE_SYNCH_USE>::close (int flags /* = M_DELETE_NONE */) int result = 0; - ACE_SET_BITS (flags_, flags); + // Only pay attention to the flags parameter if we haven't already + // set the task delete policies. + if (this->flags_ == 0) + ACE_SET_BITS (flags_, flags); - if (this->close_i (0, flags) == -1) + if (this->close_i (0, flags_) == -1) result = -1; - if (this->close_i (1, flags) == -1) + if (this->close_i (1, flags_) == -1) result = -1; return result; diff --git a/ace/RB_Tree.h b/ace/RB_Tree.h index a91b2d03409..47f83fb9dda 100644 --- a/ace/RB_Tree.h +++ b/ace/RB_Tree.h @@ -138,21 +138,21 @@ public: * <ACE_Allocator> with a persistable memory pool. * * <b> Requirements and Performance Characteristics</b> - * - Internal Structure + * - Internal Structure: * Binary tree * - Duplicates allowed? * No * - Random access allowed? * No - * - Search speed + * - Search speed: * Log(n) - * - Insert/replace speed + * - Insert/replace speed: * Log(n) * - Iterator still valid after change to container? - * Yes + * Yes, except if the iterated-over element is removed. * - Frees memory for removed elements? * Yes - * - Items inserted by + * - Items inserted by: * Value * - Requirements for contained type * -# Default constructor diff --git a/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp b/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp index 8b67eab9f8a..4ff2bc0a9e9 100644 --- a/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp +++ b/examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp @@ -5,6 +5,7 @@ */ #include "ace/Reactor.h" +#include "ace/Synch.h" #include "ace/WFMO_Reactor.h" #include "ace/Thread_Manager.h" @@ -32,29 +33,49 @@ Reactor_Logging_Server<ACCEPTOR>::Reactor_Logging_Server class Quit_Handler : public ACE_Event_Handler { +private: + ACE_Manual_Event quit_seen_; + public: Quit_Handler (ACE_Reactor *r) : ACE_Event_Handler (r) { - reactor ()->register_handler (this, ACE_STDIN); SetConsoleMode (ACE_STDIN, ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT); + if (reactor ()->register_handler + (this, quit_seen_.handle ()) == -1) + r->end_reactor_event_loop (); + else if (ACE_Event_Handler::register_stdin_handler + (this, r, ACE_Thread_Manager::instance ()) == -1) + r->end_reactor_event_loop (); } ~Quit_Handler () { - reactor ()->remove_handler (ACE_STDIN, + ACE_Event_Handler::remove_stdin_handler + (reactor (), ACE_Thread_Manager::instance ()); + reactor ()->remove_handler (quit_seen_.handle (), ACE_Event_Handler::DONT_CALL); } - virtual int handle_signal (int, siginfo_t *info, ucontext_t *) { + virtual int handle_input (ACE_HANDLE h) { CHAR user_input[BUFSIZ]; DWORD count; - if (ReadFile (info->si_handle_, user_input, - BUFSIZ, &count, 0)) { - user_input[count] = '\0'; - if (ACE_OS::strncmp (user_input, "quit", 4) == 0) - reactor ()->end_reactor_event_loop (); - } + if (!ReadFile (h, user_input, BUFSIZ, &count, 0)) + return -1; + + user_input[count] = '\0'; + if (ACE_OS_String::strncmp (user_input, "quit", 4) == 0) + return -1; + return 0; + } + + virtual int handle_close (ACE_HANDLE, ACE_Reactor_Mask) { + quit_seen_.signal (); + return 0; + } + + virtual int handle_signal (int, siginfo_t *, ucontext_t *) { + reactor ()->end_reactor_event_loop (); return 0; } }; @@ -66,12 +87,13 @@ public: Logging_Event_Handler_WFMO (ACE_Reactor *r) : Logging_Event_Handler_Ex (r) {} +protected: int handle_input (ACE_HANDLE h) { - reactor ()->suspend_handler (h); - int status = logging_handler_.log_record (); - reactor ()->resume_handler (h); - return status; + ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, monitor, lock_, -1); + return logging_handler_.log_record (); } + + ACE_Thread_Mutex lock_; // Serialize threads in thread pool. }; @@ -82,6 +104,7 @@ public: Logging_Acceptor_WFMO (ACE_Reactor *r = ACE_Reactor::instance ()) : Logging_Acceptor_Ex (r) {}; +protected: virtual int handle_input (ACE_HANDLE) { Logging_Event_Handler_WFMO *peer_handler = 0; ACE_NEW_RETURN (peer_handler, @@ -115,9 +138,6 @@ typedef Reactor_Logging_Server<Logging_Acceptor_WFMO> int main (int argc, char *argv[]) { const size_t N_THREADS = 4; - - size_t n_threads = argc > 1 ? atoi (argv[1]) : N_THREADS; - ACE_WFMO_Reactor wfmo_reactor; ACE_Reactor reactor (&wfmo_reactor); @@ -127,6 +147,6 @@ int main (int argc, char *argv[]) 1); Quit_Handler quit_handler (&reactor); ACE_Thread_Manager::instance ()->spawn_n - (n_threads, event_loop, &reactor); + (N_THREADS, event_loop, &reactor); return ACE_Thread_Manager::instance ()->wait (); } diff --git a/examples/C++NPv2/display_logfile.cpp b/examples/C++NPv2/display_logfile.cpp index 809097db918..ee3a725ef60 100644 --- a/examples/C++NPv2/display_logfile.cpp +++ b/examples/C++NPv2/display_logfile.cpp @@ -37,7 +37,7 @@ private: class Logrec_Reader : public ACE_Task<ACE_MT_SYNCH> { private: - ACE_TString filename_; // Name of logfile. + ACE_TString filename_; // Name of logfile. ACE_FILE_IO logfile_; // File containing log records. public: @@ -57,7 +57,7 @@ public: virtual int svc () { const size_t FileReadSize = 8 * 1024; ACE_Message_Block mblk (FileReadSize); - + for (;; mblk.crunch ()) { // Read as much as will fit in the message block. ssize_t bytes_read = logfile_.recv (mblk.wr_ptr (), @@ -83,10 +83,11 @@ public: (mblk.rd_ptr (), mblk.length ()); if (name_len == mblk.length ()) break; + char *name_p = mblk.rd_ptr (); ACE_Message_Block *rec, *head, *temp; ACE_NEW_RETURN (head, ACE_Message_Block (name_len, MB_CLIENT), 0); - head->copy (mblk.rd_ptr (), name_len); + head->copy (name_p, name_len); mblk.rd_ptr (name_len + 1); // Skip nul also size_t need = mblk.length () + ACE_CDR::MAX_ALIGNMENT; @@ -97,8 +98,10 @@ public: // Now rec contains the remaining data we've read so far from // the file. Create an ACE_InputCDR to start demarshaling the // log record, header first to find the length, then the data. + // Since the ACE_InputCDR constructor increases the reference count + // on rec, we release it upon return to prevent leaks. // The cdr 'read' methods return 0 on failure, 1 on success. - ACE_InputCDR cdr (rec); + ACE_InputCDR cdr (rec); rec->release (); ACE_CDR::Boolean byte_order; if (!cdr.read_boolean (byte_order)) { head->release (); rec->release (); break; @@ -109,10 +112,10 @@ public: // if rec contains the complete record or not. ACE_CDR::ULong length; if (!cdr.read_ulong (length)) { - head->release (); rec->release (); break; + head->release (); mblk.rd_ptr (name_p); break; } if (length > cdr.length ()) { - head->release (); rec->release (); break; + head->release (); mblk.rd_ptr (name_p); break; } // The complete record is in rec... grab all the fields into @@ -170,7 +173,7 @@ public: if (put_next (head) == -1) break; // Move the file-content block's read pointer up past whatever - // was just processed. Although the rec's rd_ptr has not been + // was just processed. Although the mblk's rd_ptr has not been // moved, cdr's has. Therefore, use its length() to determine // how much is left. mblk.rd_ptr (mblk.length () - cdr.length ()); @@ -209,7 +212,7 @@ public: // Initialization hook method. virtual int open (void *) { return activate (); } - virtual int put (ACE_Message_Block *mblk, ACE_Time_Value *to) + virtual int put (ACE_Message_Block *mblk, ACE_Time_Value *to) { return putq (mblk, to); } virtual int svc () { |