summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Huston <shuston@riverace.com>2002-05-24 00:38:48 +0000
committerSteve Huston <shuston@riverace.com>2002-05-24 00:38:48 +0000
commita86a0bf2a3713cfa17fececcbbf901d604450bf8 (patch)
tree657918051a754b297b04b3c5fa86e2f23b8d1ca3
parent0d9148f6ca9728920ae5f6959d65016538bdac57 (diff)
downloadATCD-a86a0bf2a3713cfa17fececcbbf901d604450bf8.tar.gz
ChangeLogTag:Thu May 23 20:35:22 2002 Steve Huston <shuston@riverace.com>
-rw-r--r--ChangeLog13
-rw-r--r--ChangeLogs/ChangeLog-02a13
-rw-r--r--ChangeLogs/ChangeLog-03a13
-rw-r--r--ace/Module.cpp9
-rw-r--r--ace/RB_Tree.h10
-rw-r--r--examples/C++NPv2/WFMO_Reactor_Logging_Server.cpp54
-rw-r--r--examples/C++NPv2/display_logfile.cpp19
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 () {