Errata fixed through the seventh printing of C++NPv1 (Pages marked with '+' need a new page generated for next printing.) . Page xxi: Added "Eric Eide," "Alexander Holler", "Craig Perras", "Bruce Trask", "Chris Uzdavinis", "Daire Lynch", and "Chris Smith" to list of contributors. Put "Luther Baker" and "Darrell Brunsch" in proper alphabetical order. . Page 59: Default pathname (index.html) requires a leading '/' to work properly with most HTTP servers. . Page 61 (in uml): ACE_SOCK_IO::recv() has an extra ',' after "ACE_Time_Value *" . Page 61 (in UML): 4th arg to sendv_n() should be bytes_sent, not bytes_recvd. . Page 62: Changed the phrase "where blocking I/O is the default" to "With blocking I/O, the calling thread waits until the I/O completes." . Page 63: returning "-1" from main() (should match convention on p. 67) need to change "return peer.close ()" to "return peer.close () == -1 ? 1 : 0;" . Page 63: iov[1].iov_base = pathname caused the compiler to complain since pathname is const char* and iov_base is char*. Fixed by adding (char *) casts. . Page 63: 3rd paragraph references the client_download_file() which doesn't exist. The fix is to reference main() on this page. . Page 64: TCP_NODELAY in sidebar 6 should be set with peer.set_option(), not with peer.enable(). . Page 64: Sidebar references client_download_file() which doesn't exist. The fix is to reference main() on p. 63. . Page 67: peer->disable () should be peer.disable (). . Page 67: The comment should be "Ensure blocking " *not* "Ensure blocking s". . Page 67: auto_ptr pathname = get_url_pathname (peer) should be ACE_Auto_Array_Ptr pathname (get_url_pathname (&peer)) . Page 75: If ACE::read_n() reports EOF after reading some bytes, the ACE_Message_Block wr_ptr() still needs to be advanced by the number of bytes actually read. Added an explicit nr_recvd argument to read_n() to receive this information. . Page 76: ACE::write_n(head) should be ACE::write_n(ACE_STDOUT,head); . Page 78: Transposed "typed" with "untyped" in 2nd paragraph. Output, not input, cdr classes xform typed data into untyped buffers. . Page 81: Figure 4.4: "acceptor_ ; ACE_SOCK_Acceptor" should be "acceptor_ : ACE_SOCK_Acceptor". open() and wait() methods are virtual so should be italicized. w_short in open() should be u_short. In make_log_file, "s," should be "s :". Arrowheads on dashed lines should be open. Direction of association from Iterative Logging Server to Logging_Handler should be reversed, and arrowhead open. . Page 82: s/port/logger_port/ in open() method. . Page 87: Logging_Handler (const ACE_SOCK_Stream&) can't initialize a reference (log_file_) with a 0. This isn't in the ACE_wrappers/examples code so is removed. . Page 88: Example line 27 - need to add ACE_CDR::MAX_ALIGNMENT to be sure the revised size holds the header, payload, and any skipped align bytes. Also, use ACE_CDR::grow() to resize it, not ACE_Message_Block::resize(), in order to maintain CDR alignment. . Page 92: s/port/logger_port/ in open() method. . Page 96: On code line 7, "MAXLOGMSGLEN" should be "ACE_Log_Record::MAXLOGMSGLEN." . Page 127: s/Set a handle to be/Mark a handle as/ . Page 144: Correctly check error return from select(). . Page 149: Changed "If n is a word, the expression n & ~(n - 1) accesses the least-significant bit (lsb) of n." to "If n is a word, the expression n &~(n - 1) computes a word in which the only set bit is the least-signficant set bit (lssb) of n." Also changed all subsequent occurrences of "lsb" to "lssb". . Page 155: s/port/logger_port/ . Page 156: master_handle_set_.set_bit ( .. ) is called twice in handle_connections (). Removed the first call. Added missing call to active_read_handles_.clr_bit in handle_connections(). . Page 160: Figure 8.1, the UML relationships are all wrong. There should be a one-to-many aggregation relationship from ACE_Process_Manager to ACE_Process and a dependency relationship from ACE_Process to ACE_Process_Options. There should be no relationship from ACE_Process_Manager to ACE_Process_Options. . Page 163: Figure 8.2, the prepare(), spawn(), unmanage(), parent(), and child() methods are virtual and therefore should be italicized. . Page 165: The code should start the first process off with n-1, not n. Also, when there's no environment variable, start n at 10, not 0. . Page 167: Figure 8.3, setenv() method should be: + setenv (format : const char *, ...) : int . Page 170: Figure 8.4, the two wait() methods should be: + wait (timeout : const ACE_Time_Value) : int + wait (pid : pid_t, timeout : const ACE_Time_Value, status : ACE_exitcode * = 0) : pid_t . Page 172: Changed "where as" to "whereas". . Page 176: In run_worker() method, ACE_static_cast should be ACE_reinterpret_cast. . Page 178: Sidebar 18, item 3. The reference to Logging_Server::prepare() should be to Logging_Process::prepare(). . Page 178: Sidebar 18, item 4. The Logging_Process::prepare() method is on page 181, not page 180. . Page 181: Changed "affect" to "effect" . Page 187: Added a ``.'' after ``capabilities'' rather than a ``,'' to avoid a ``comma splice." Also added a ``.'' after ``mechanisms'' rather than a ``,'' to avoid a ``comma splice.'' . Page 189: Figure 9.1 wait() method should show a second argument, abandon_detached_threads : int = 0. . Page 191, replace "a ACE_SOCK_Stream" with "an ACE_SOCK_Stream" . Page 193: Figure 9.2 should not have "Logging Acceptor" and "Reactor" boxes; should instead be one "Thread Per Connection Logging Server" box. . Page 194,196: Use auto_ptr<> to manage allocated Thread_Args. . Page 195: Figure in Sidebar 21, should not have spaces in ACE_Thread_Manager::spawn. . Page 196: s/thread it's return/thread its return/ . Page 196: handle_data() parameter name is "client", not "logging_peer". . Page 197: Thread_Per_Connection_Logging_Server reimplements run() to not call handle_data() - it's called in spawned threads. . Page 197: Code example; call to ACE_Thread_Manager::wait() wants absolute time, not relative. . Page 198: s/newly create thread/newly created thread/ . Page 199: in the box next to previous_priority: "If the priority is already the lower priority..." should be "If the priority is already the lowest priority..." . Page 199: s/key methods outlined/key methods are outlined/ . Page 202: s/data is/data are/ . Page 210: Figure 10.2, ACE_Read-Guard should be ACE_Read_Guard. . Page 215: Added the missing lines logging_handler_.close (); return 0; to the end of handle_data() and removed a couple of blank lines so the page will still fit! . Page 233: Removed ACE_thread_t t_id = ACE_OS::thr_self (); and added owner_id_ = 0; . Page 248: s/not not/not/ . Page 254: The declaration of ACCEPTOR::PEER_ADDR addr does not need "typename" before it because ACCEPTOR is not a template argument. . Page 287: The title of FJS99a should be "Implementing Application Frameworks: Object-Oriented Frameworks at Work" . Page 287: The title of FJS99b should be "Building Application Frameworks: Object-Oriented Foundations of Framework Design"