Tue Dec 31 18:27:50 1996 Douglas C. Schmidt * ace/Log_Msg.cpp (log): Added a test so that if we're (1) not printing to stderr and (2) aborting the program we still print a message to stderr. * ace/Message_Block: Added synchronization support to ACE_Message_Block. This is necessary now that we've got reference counting to ensure that we don't have race conditions when incrementing and decrementing the reference count in separate threads. The approach is very clean and uses the new ACE_Lock mechanism to conditionally acquire()/release() the locking strategy if concurrency control is necessary. * ace/Synch_T: Created a new set of ACE_Lock and ACE_Lock_Adapter<> classes which are similar in spirit to the ACE_Allocator and ACE_Allocator_Adapter<> classes. These make it possible to treat polymorphically synchronization mechanisms in ACE polymorphically, *without* creating an entire new parallel hierarchy of locking mechanisms. * ace/Synch: Added the full suite of acquire_{read|write}() and tryacquire_{read|write}() methods to ACE_Semaphore and ACE_Process_Semaphore so they will be consist with the other synchronization APIs. Tue Dec 31 00:11:56 1996 Douglas C. Schmidt * Changed all uses of ACE_Event_Handler::RWE_MASK to ACE_Event_Handler::ALL_EVENTS_MASK to reflect the fact that we will soon have more than READ, WRITE, and EXCEPT events. However, I've kept RWE_MASK around for backwards compatibility. * examples/ASX/Message_Queue: Changed the tests so that they use the new ACE_Message_Block::release() method rather than calling delete explicitly. * apps/Gateway: Revised the implementation of the Gateway and Peer applications to take advantage of the new ACE_Message_Block reference counting scheme. Tue Dec 31 15:06:51 1996 David L. Levine * ace/Task.cpp: added comments that try to explain interaction between ACE_Task_Base::svc_run () and ACE_Task_Exit instance * ace/Hi_Res_Timer.h: added comment to print_total () saying it should only be used for incremental timings; added defaults to a few print_ave/print_total args * ace/Hi_Res_Timer.{i,cpp}: inlined the constructor; trimmed output if count is 1; rounded instead of truncated usecs portion of time Mon Dec 30 15:24:59 1996 Douglas C. Schmidt * ace/Message_Block: Added reference counting to ACE_Message_Block so that we no longer have to clone() messages when we want to pass them around "by reference." * apps/Gateway/Peer/Peer.cpp (init): The Peer_Acceptor had gotten out of date wrt newer ACE features, so I updated it. Mon Dec 30 15:24:59 1996 Douglas C. Schmidt * ace/OS.h: Added a special case for ACE_UNUSED_ARG that works with G++. Thanks to David Levine for this. Mon Dec 30 16:05:11 1996 David L. Levine * ace/OS.cpp (ace_thread_adapter): Updated ACE_TRACE arg names (even though they're currently commented out). * ace/Task.cpp (svc_run): If TSS isn't supported, and on Linux, for now, create the ACE_Task_Exit exit_hook instance on the stack so that it's destructor will be called when svc_run () completes. Sun Dec 29 18:38:03 1996 Douglas C. Schmidt * apps/Gateway/Gateway/File_Parser.h: Removed the endofline() method declaration -- it doesn't seem to be defined anywhere. * ace/OS.h: Added an ACE_INT32 to complement the ACE_UINT32. * netsvcs/lib: Cleaned up all the ACE network services by removing their SIGINT signal handler. This was interferring with the main event loop's ability to shutdown... * apps/Gateway/Gateway: Once again changed the name of *IO_Handler* to *Proxy_Handler* since these things are really proxies, in the COS sense! * ace/Service_Record.cpp: Tidied up the implementation of ACE_Module_Type::fini() so that it doesn't try to call fini() on NULL pointers. Also, rather than explicitly deleting the reader and writer Tasks, we call ACE_Module<>::close(), which knows how to take care of all this stuff. * ace/Module.cpp: Added an extra parameter to close_i() so that we can correctly pass the value of "flags" from close() in order to prevent deleting tasks when we don't want to do this. * ace/Module.cpp: There was a bug in the open() method since we were potentially deleting reader_q and writer_q twice if memory allocation failed. Sat Dec 28 19:02:13 1996 Douglas C. Schmidt * ace/ACE.cpp: Changed the implementation of ldfind() so that it doesn't try to add the DLL prefix (e.g., "lib") unless it doesn't match filename. This is necessary to keep lots of existing svc.conf files from breaking. * ace/Event_Handler.h: Added a new ACCEPT_MASK for use with the new asynchronous accept() operation support for Win32. * ace: Added a new config file for WinNT 4.0 called config-winnt-4.0-msvc4.x.h. This file contains #defines for new features in WinNT 4.0 such as non-blocking acquire for CRITICALSECTIONs (TryEnterCriticalSection()), SignalObjectAndWait(), and CancelIO(). Oddly enough, these functions seem to be missing from the MSVC++ 4.2 #include files, so I added them to the config file. * ace: Changed the name of config-win32-msvc4.0.h to config-win32-msvc4.x.h since this config file works for MSVC++ 4.0, 4.1, and 4.2. * ace/Proactor: Added a new "cancel_io" method on the Proactor. This makes it possible to cancel all I/O that is outstanding on a thread. Thanks to Tim for help with this. Sat Dec 28 23:49:09 1996 Tim H. Harrison * ace/ReactorEx.h: Fixed some bugs with ACE_ReactorEx::dispatch. For instance, the index should only be incremented when handlers are dispatched. * ace/OS.i: Fixed some typos regarding the ACE_cond_t for NT. * examples/Reactor/Proactor/test_proactor.cpp: Dr. Schmidt and I hacked this to be way cool. In particular, we no longer have to know the size of the files to be transferred in advance. This scheme uses a clever protocol that shuts down the Peer Handler when (1) all input from the file has arrived, (2) all output to the remote peer handler has been sent, and (3) all input from the remote peer handler has been received. The Peer Handler now uses calls close_writer on the stream to notify the remote peer when its done writing. The Input File Handler sends an mb==0 to tell the Peer Handler when it's done reading from the file. The Peer Handle uses a state variable to OR in all the different conditions for exiting. It works. Fri Dec 27 23:39:19 1996 Douglas C. Schmidt * ace/Stream.cpp (pop): Modified the code so that we don't delete the Module we are popping unless the flags request this. * ace/Service_Record.cpp (fini): Always make sure to first fini() each Module, then remove() (and delete) them. * ace/Stream.cpp (remove): Updated the code so that we don't delete the Module unless the flags request this. Thu Dec 26 18:51:22 1996 David L. Levine * ace/config-linux-lxpthreads.h: Has James CE Johnson's latest adjustments to this config file. Tue Dec 24 10:55:20 1996 Douglas C. Schmidt * ace/OS.cpp (ace_thread_adapter): Changed the message that is printed if we exit the thread. Thanks to Luca for this suggestion. Tue Dec 24 15:38:43 1996 David L. Levine * ace/OS.i (cond_destroy): added call to event_destroy () for waiters_done_ on WTHREADS platforms * ace/Future.cpp: added specialization of template class ACE_Atomic_Op; so that libACE is self-contained with respect to template instantiations (with g++, for example) * ace/Malloc.cpp: added specialization of template class ACE_Atomic_Op; so that libACE is self-contained with respect to template instantiations (with g++, for example) * examples/Reactor/Misc/test_reactors.cpp, examples/Threads/future1.cpp, examples/Threads/future2.cpp, examples/Threads/manual_event.cpp, examples/Threads/task_two.cpp, performance-tests/Synch-Benchmarks/Benchmark.cpp, tests/Future_Test.cpp, tests/Reactors_Test.cpp: instantiate ACE_Atomic_Op with int instead of u_long so that it can use the specialization in libACE Tue Dec 24 12:49:21 1996 David L. Levine * ace/OS.h (struct siginfo_t): added declaration of siginfo_t (ACE_HANDLE *handles) to match definition in OS.cpp. Thanks to James Johnson for pointing this out. * ace/OS.cpp (thr_create): fixed position of #endif /* !ACE_LACKS_THREAD_STACK_SIZE */ directive, it needed to be before the closing '}' of the block. Thanks to James Johnson for pointing this out, also. * ace/OS.cpp: don't include ace/ARGV.h except on WIN32 because it's only needed there, and don't compile ACE_Thread_Adapter on VxWorks to save space * apps/Gateway/Peer/Gateway_Handler.h: changed #include "Event.h" to be #include "Peer_Message.h" so that Peer_Header::ROUTING_ID can be referenced in the class declaration. This subproject still doesn't build, though; I think that Event.h is needed. * ace/OS.h (struct ACE_cond_t): declare waiters_done_ as ACE_sema_t on VxWorks only, to avoid recursive struct definition with ACE_event_t * ace/OS.i (ACE_OS::cond_*): on VxWorks only, use sema operations on ACE_cond_t::waiters_done_ instead of event ops Tue Dec 24 10:55:20 1996 Douglas C. Schmidt * examples/Threads/task_three.cpp (main): Changed the use of new-style C++ casts for ACE_Sig_Action to old-style C casts so that more picky compilers like GCC won't complain. Thanks to Sandro Doro for reporting this. * examples/Threads/task_two.cpp: Fixed a typo where int should be used as the type for ACE_Atomic_Op rather than u_long. Thanks to David Levine for noticing this. * ace/OS.i: Generalized the implementation of ACE_OS::cond_wait() so that it will work with Win32 and VxWorks. Thanks to David Levine for pointing this out. * ace/Synch_T.cpp: Removed ACE_Process_Condition since it isn't really feasible to implement this as a template. At some point, it should be reimplemnted as a non-template that is only guaranteed to work on Solaris and some POSIX pthreads platforms. Sun Dec 22 21:23:57 1996 David L. Levine * ace/Acceptor.cpp: replaced two statements that looked like this: "ptr && ptr->foo ()" with "if (ptr) ptr-> foo()" to prevent compiler warnings about computed values that aren't used * netsvcs/clients/Tokens/manual/manual.cpp: added explicit "int" return type to declaration of handle_exception (ACE_HANDLE) so that compilers don't complain about no type * ASX/Event_Server/Event_Server/Options.cpp, ASX/UPIPE_Event_Server/Options.cpp: rearranged initializers in Options ctor to match declaration order Sun Dec 22 21:16:23 1996 Douglas C. Schmidt * ace/OS.cpp (thr_create): added a new ACE_HAS_PTHREADS_XAVIER to deal with the sparam.sched_priority features of the Linux pthreads implementation. Thanks to James Johnson for this. * ace/OS.i (thr_setprio): I forgot to define int policy = 0; * ace/SV_Semaphore_Simple.i: Removed the frigging LUSED macro and updated the ACE_SV_Semaphore_Simple::name_2_key() method to consider *all* the characters in the name. This will help avoid nasty bugs when different lock names have a common prefix. * ace/Local_Name_Space_T.cpp (ACE_Local_Name_Space): Added a call to "delete this->lock_" since we now allocate it dynamically. * apps/Gateway/Gateway/gatewayd.cpp: Changed call to ACE_SVC_INVOKE from ACE_Gateway to Gateway. * ace/OS.i: In function thr_sigsetmask changed the line: #if defined (ACE_HAS_IRIX62_THREADS) to #if defined (ACE_HAS_IRIX62_THREADS) || defined (ACE_HAS_PTHREADS_XAVIER) Thanks to James CE Johnson for this. * ace/config-linux-[lx]pthreads.h: Added a #define for the ACE_HAS_THREAD_SPECIFIC_STORAGE symbol. Thanks to James CE Johnson for this. * ace: created a new config file called config-linux-lxpthreads.h. This contains the ACE #defines necessary to use L. Xavier's threading package on Linux. Thanks to James CE Johnson for this. * build/gcc/ace/Synch: Moved the definition of the ACE_*Event classes *outside* of ACE_HAS_THREADS so that the Proactor will compile correctly even when there's no threading defined. * ace/config-linux-pthread.h: Added #define ACE_MT_SAFE, which seems to have been missing. Thanks to James Johnson for suggesting this. * tests/TSS_Test.cpp: Now that we've got Chris Lahey's fixes for AIX we can run this test on AIX. * ace/OS.cpp (thr_create): Added a #ifdef for pthread_attr_setstacksize() for Linux pthreads, which doesn't seem to support this. Thanks to James CE Johnson for this fix. * ace/OS.i: Added DCE pthreads fixes for OSF/1 3.2. Thanks to Harry Gunnarsson for these. Sat Dec 21 13:54:45 1996 Douglas C. Schmidt * ace/Synch_T: Integrated a solution that will allow MVS to use ACE_TSS. The problem is that the MVS C++ compiler requires an extern "C" destructor function for pthread_key_delete and the ACE_TSS stuff uses a paramatized C++ destructor function (ACE_TSS::cleanup). To solve this, a new class (ACE_TSS_Adapter) was created that encapsulates a thread specific object and it's associated C++ destructor. The ACE_TSS methods were then modified so that they provide access to the thread specific object through the ACE_TSS_Adapter. Also added a generic extern "C" cleanup routine that takes an ACE_TSS_Adapter as an argument. It then calls the adapters cleanup method passing it the saved address of the thread specific object. Thanks to Chuck Gehr for all of this. * ace/OS: Updated the code so that it will work with MFC and AfxBeginThread(). Thanks to Detlef for these changes. * ace/README: Added two new #defines for ACE_LACKS_COND_T and ACE_LACKS_RWLOCK_T to make it possible to define these in a fine-grained manner for various platforms. * ace/OS.h: Restructured the ACE_HAS_THREADS section so that we factor out the code for ACE_cond_t and ACE_rwlock_t so that it is only defined if we don't support these features natively. * ace/ReactorEx: Added a new "alertable" parameter to the handle_events() method. If alertable is true, then WaitForMultipleObjectsEx is used as the demultiplexing call, otherwise WaitForMultipleObjects is used. * ace/Signal.cpp: Had to move a few things around so that the code would compile for HP/UX. Thanks to Neil B. Cohen for reporting this. * ace/Acceptor.cpp: Updated the handle_close() method so that the Acceptor shuts down the listen socket and prevents handle leaks. Thanks to Irfan for reporting this. Thu Dec 19th 03:48:26 1996 Irfan Pyarali * ace/Local_Name_Space_T.cpp: Made sure that the mutexes are getting named properly (both the mutex owned by the Local_Name_space and the lock owned by the backing store). For the time being I named these two to be the extensions of the backing store file name. * ace/Local_Name_Space_T.cpp: Replaced the create_manager code such that we use the double check pattern. This is simpiler and easy to understand compared to the current code. * ace/Naming_Context.cpp: Gave the database name a default value. * ace/Malloc_T.cpp: The lock_name should never be 0. This will cause all instances of the same pool to get different mutexes. Sat Dec 21 09:43:35 1996 David L. Levine * ace/OS.{h,i}: fixes for VxWorks introduced in 4.1, and for inlining: moved #include of OS.i after #defines but before other ace #includes Thu Dec 19 15:58:09 1996 David L. Levine * ace/config-vxworks*.h, include/makeinclude/platform_vxworks*.GNU: enable inlining on VxWorks by default Wed Dec 18 16:44:47 1996 Tim H. Harrison * ace/Proactor.cpp (dispatch): Changed this method to take an int error parameter to set errno just before dispatching. This allows us to better propagate overlapped I/O errors to the handlers. Wed Dec 18 16:21:36 1996 David L. Levine * ace/OS.{h,i} and ace/INET_Addr.cpp: more VxWorks gethostbyname () tweaks Wed Dec 18 15:24:13 1996 Tim H. Harrison * ace/Proactor.cpp (ACE_Proactor): Initialize completion_port_ to 0. This is the only way that CreateIoCompletionPort works first time in. ACE_INVALID_HANDLE makes it break. * (ACE_Proactor): Added a call to CreateIoCompletionPort in the constructor so that GetQueuedCompletionStatus can be called before ACE_Proactor::initiate is called. This is necessary if an application is using the Proactor as a timer mechanism only. Tue Dec 18 7:58:07 1996 Tim H. Harrison * ace/Proactor.i (get_handle): Changed this to return ACE_INVALID_HANDLE on non Win32 platforms. Also changed shared_event_ from an ACE_Manual_Event to an ACE_Auto_Event. This allows us to remove the call to reset from handle_signal. * examples/Reactor/Proactor/test_timeout.cpp: Added a new example application to the Proactor example suite. Check the README for more details. * examples/Reactor/ReactorEx/test_timeout.cpp: Added a new example application to the ReactorEx example suite. Check the README for more details. * ace/Service_Config.cpp: Fixed a bug in run_reactorEx_event_loop (ACE_Time_Value &) so that it doesn't return on timeout. Tue Dec 18 7:06:32 1996 * ace/Proactor.cpp (handle_events): Once again removed the timer_skew_ code. Changed the ACE_HANDLE global_handle_ to ACE_Manual_Event shared_event_. Added a constructor that takes an ACE_Timer_Queue *. Changed the implementation to use an ACE_OS::sleep if only timers are registered. We need to figure out a better approach than the sleep. * ace/Service_Config.cpp (run_proactor_event_loop): Changed this to only return when an error occurs. If handle_events returns a 0, then a timeout occurred, and we can continue to dispatch events. We only return when all of the time has expired. * ace/Registry_Name_Space.h (ACE_Registry_Name_Space): Moved the include statements below the ACE_WIN32 and UNICODE directives. * ace/OS.h (siginfo_t): Added siginfo_t (ACE_HANDLE *handle) constructor prototype. Wed Dec 18 06:37:22 1996 Douglas C. Schmidt * ace/OS.i (cond_wait): Added the new algorithm for condition variable emulation on Win32. (and VxWorks). This should fix the nasty problems we had with earlier version (which weren't "fair"). Thanks to James Mansion, Karlheinz, Detlef, and Irfan for helping with this. * ace/Registry.h: Removed the "ACE_TURN_NOMINMAX_OFF" stuff in order to simplify the code. Thanks to Irfan for this. * ace/OS.i (sema_post): Added a new overloaded version of ACE_OS::sema_post(), which takes a "release count." This is the number of times to release the semaphore. Note that Win32 supports this natively, whereas on POSIX we need to loop... * ace/Proactor.cpp (handle_events): Changed the Proactor logic so that it will correctly propagate any errors that occur to the handle_{input,output}_complete callback. Tue Dec 17 20:56:56 1996 David L. Levine * ace/OS.{h,i}: on VxWorks: implemented ACE_OS::gethostbyname (), and fixed inet_ntoa () to return -1 on failure * ace/OS.cpp: in ::spa () for VxWorks, zero out unused argv[] slots to overwrite args from previous invocations OS.cpp Tue Dec 17 04:27:07 1996 Douglas C. Schmidt * ace/ReactorEx: Added a new feature to the ReactorEx. If we enable the wait_all flag when calling ACE_ReactorEx::handle_events() *and* we give an ACE_Event_Handler (this is a new final param to the call) then the handle_signal() call will be invoked on this "wait_all_callback" object when all the handles become signaled. Moreover, we pass in the array of signaled handled to through the siginfo_t parameter (see the following ChangeLog entry for details). If there is no wait_all_callback param, then all the handle_signal() methods are invoked on all the handles. * ace/OS.h (siginfo_t): Augmented the siginfo_t interface so that we can pass an array of signaled Win32 HANDLEs, in addition to just a single HANDLE. This is used in the ReactorEx. * examples/Reactor/ReactorEx/test_reactorEx.cpp: Added a number of enhancements to this test program based on discussions with Irfan, Karlheinz, Dieter, and Detlef. * ace/Task_T.i (msg_queue): If we override the existing definition of the Message_Queue in an ACE_Task then we need to delete the existing Message_queue (if necessary and mark the Message_Queue as no longer being a candidate for deletion (since we have supplied our own definition). Irfan had added this earlier, but it seemed to get lost... * examples/Reactor/Proactor/test_proactor.cpp: The class called STDIN_HANDLEr is misnamed since we don't read from stdin, we read from a file. Therefore, I've changed this to be Input_File_Handler. * examples/Reactor/ReactorEx/test_{proactor,reactorEx}.cpp: Changed misspellings of transfered to transferred. * ace/Memory_Pool.cpp (ACE_MMAP_Memory_Pool): Since NT doesn't support SIGSEGV thre's no point in even trying to register for this signal! * ace/OS.i: Reverted some lost UNICODE fixes -- thanks to Irfan for finding these. * ace/Local_Name_Space_T.cpp (create_manager_i): Removed a debug statement since it may be causing problems with printing UNICODE. Mon Dec 16 11:25:55 1996 Douglas C. Schmidt * ace/OS.i (cuserid): Fixed the definition to ACE_OS::cuserid() so that it uses LPTSTR. Thanks to Irfan for this fix. * ace/Task.cpp (activate): In ACE_Task::activate() there is a possibility to actually "reactivate" the task using the flag. The following illustrates that ability: if (this->thr_count_ > 0 && force_active == 0) return 1; // Already active. else this->thr_count_ = n_threads; The thing is that, when the task is running and we reactivate it (actually we add threads) the command should be: this->thr_count_ += n_threads; rather than this->thr_count_ = n_threads; That way thr_count_> holds the new number of threads currently associated with the task. Thanks to Hamual for this fix. * ace/OS.i (inet_aton): Placed the return 1 within the curly braces to make the HP/UX compiler happy. Thanks to Kenny Want for reporting this. Mon Dec 16 12:56:43 1996 David L. Levine * ace/OS.i: removed spurious "*/" after an #endif. Thanks to Harry Gunnarsson for reporting this. * ace/Svc_Conf_l.cpp: #ifdef'ed out ace_yyunput () and ace_yy_{push,pop,top}_state () because they're not used, and commented out a few "break"s after "return"s in switch statements to prevent compiler warnings. * ace/Typed_SV_Message.i: reordered initializations in ctor to match declaration order. * examples/Threads/Makefile, performance-tests/Misc/Makefile, tests/Makefile: Removed "LIBS += -lm" from these Makefiles because it doesn't appear to be necessary, and not all platforms have a libm. * include/makeinclude/platform_sunos4_g++.GNU, platform_sunos5_g++.GNU, platform_sunos5_x86_g++.GNU, platform_unixware_g++.GNU: added -lm to LIBS because it was removed from the Makefiles, and it's needed with g++. * netsvcs/lib/Makefile: removed /pkg/gnu/lib dependencies. Thanks to Per Andersson for pointing this out. * netsvcs/servers/svc.conf: changed _make_ACE_Logger() to _make_ACE_Logging_Strategy() svc.conf. Thanks to Per Andersson for reporting this. Sun Dec 15 13:01:17 1996 David L. Levine * ace/Naming_Context.cpp: reordered initializations in default ctor to match declaration order. * ace/Svc_Conf_y.cpp: added parens to a couple of combined assignments/conditionals to avoid compiler warnings. * include/makeinclude/platform_sunos5_sunc++*.GNU: reverted SOLINK step back to creating real .so files, because it seems to be necessary, sometimes, for template instantiation. * netsvcs/lib/Server_Logging_Handler.cpp: removed ACE_INLINE's. * tests/MM_Shared_Memory_Test.cpp: declare shm_key as char[] instead of char *, so that the string gets put into the data segment rather than the text segment. The string gets modified, which causes a core dump with the g++/SunOS5.5 build if the string is in the text segment. Sun Dec 15 10:29:20 1996 Douglas C. Schmidt * netsvcs/servers/svc.conf: Removed the "lib" prefix for the netsvcs DLL. This is now added automatically by the ACE::ldfind() operation. * ace/SString.cpp (ACE_CString): Removed the #pragmas for Win32. They aren't necessary since we should replace the ACE_USHORT16 cast with a char cast. Thanks to Amos Shapira for reporting this. Sat Dec 14 14:25:38 1996 Douglas C. Schmidt * build/SunOS5.5/tests/UPIPE_SAP_Test.cpp (main): Fixed several minor bugs with UPIPE_SAP_Test.cpp. * ace/OS.i (thr_join): Added implementations for Solaris threads and most versions of POSIX pthreads where ACE_hthread_t and ACE_thread_t are the same type! * ace/OS: Began adding hooks so that we can eventually move away from the current split between ACE_thread_t and ACE_hthread_t and unify them via ACE_Thread_ID. * ace/{OS,Thread}.h: Changed the interface of thr_getprio() so that it takes an int & rather than an int *. * ace/OS.i (thr_getprio): Fixed a minor bug for Win32 where we weren't depositing the thread priority into the return value! * Makefile: Changed the order in which things are built so that netsvcs are built right after libACE, followed by the tests. Sat Dec 14 11:54:22 1996 Douglas C. Schmidt * apps/Gateway/Gateway/Consumer_Map: Change the Consumer_Map class so that it was no longer templatized. There isn't any point in doing this since we aren't going to be changing these types for this application. * apps/Gateway/Gateway: Factored out the code for selecting the concurrency strategy into a separate *.h file called Concurrency_Strategy.h. * apps/Gateway/Gateway: Began revising the Gateway application to use the new ACE Event Channel. * ace/Svc_Handler: Now that we've got put() and svc() with no-op defaults in class ACE_Task_Base, we don't need them in ACE_Svc_Handler anymore, so I removed them! * ace/Task: Finally got sick of having to provide no-op open()/put()/close() routines in all ACE_Task subclasses, so I changed these methods from pure virtual to virtual with default no-op behavior. Updated all the tests, as well. Sat Dec 14 11:39:15 1996 David L. Levine * ace/{Module,Stream,Svc_Handler,Synch_T,Task_T}.cpp and Synch_T.i: removed ACE_INLINE qualifier from functions in .cpp files; in the case of Synch_T, moved ACE_INLINE functions from .cpp to .i file * apps/Gateway/Gateway/Routing_Table.cpp, examples/ASX/Event_Server/Event_Server/Peer_Router.cpp, examples/ASX/UPIPE_Event_Server/Peer_Router.cpp: removed ACE_INLINEs from .cpp files * ace/CORBA_Handler.h and ace/Token_Collection.{h,cpp}: changed __INLINE__ to __ACE_INLINE__ * ace/Svc_Conf_y.cpp: commented out unused arguments to suppress compiler complaints Fri Dec 13 22:07:11 1996 David L. Levine * include/makeinclude/platform_sunos5_sunc++*.GNU: replaced SOLINK step in build of shared objects for SunOS5 with SunC++ with symlink from .so to .o file. * ace/config-vxworks*.h: added ACE_NEEDS_SYSTIME_H to VxWorks configs because it's needed with inlining * include/makeinclude/platform_vxworks*.GNU: cleaned up VxWorks config files Fri Dec 13 00:53:34 1996 Douglas C. Schmidt * ace: Replaced all uses of #if defined (.....) // .... with #if defined (.....) /* ... */ so that broken C++ compilers won't complain. Thanks to John Cosby for reporting this. * ace/Thread.i: Updated the signature of getprio() and setprio() so that they take ACE_hthread_t. Thanks to Wayne Vucenic for finding this. * Reran all the tests on NT and Solaris. Everything seems to work. Therefore, incremented the version number to 4.1 and put it out for ftp and http. Thu Dec 12 18:51:04 1996 Douglas C. Schmidt * tests/Priority_Task_Test.cpp (svc): Added a new test to exercise the new "priority" feature of ACE_OS::thr_create() (which is also available to ACE_Task). * ace/Thread: Added getprio() and setprio() methods to ACE_Thread. Fri Dec 13 13:44:12 1996 David L. Levine * ace/config-vxworks*.h: added ACE_NEEDS_SYSTIME_H to VxWorks configs because it's needed with inlining * include/makeinclude/platform_vxworks*.GNU: cleaned up VxWorks config files Thu Dec 12 18:51:04 1996 Douglas C. Schmidt * ace: Added a new macro called ACE_UNUSED_ARG() to keep the compiler from outputting warnings about unused arguments. So far, this is mostly done for Win32, but it should be easy to do it for other compilers. Thanks to Matthias for these changes. * ace/OS.cpp: Added support so that thread priorities will automatically be set when we spawn threads using ACE_OS::thr_create(). * ace/OS.cpp: Simplified the logic for handling NULL thr_handles and thr_ids. Now, we set all this stuff in one place at the beginning of the function, rather than recomputing it all over the place. * ace/config-aix-{3.2.5,4.1.x}.h: Added the ACE_HAS_RECURSIVE_THR_EXIT_SEMANTICS flag. * ace/Thread_Manager.cpp (ACE_Thread_Control): Conditionally compiled the logic for calling this->exit() in the destructor for ACE_Thread_Control so that we only make this call if ACE_HAS_RECURSIVE_THR_EXIT_SEMANTICS is *not* set. This will prevent infinite recursion on platforms like AIX. Thanks to Chris Lahey for reporting this. * apps/Gateway/Gateway/Channel.cpp (recv_peer): Added the logic that makes sure we don't get screwed up by partial headers. Thanks to Chris Cleeland for this. Thu Dec 12 20:55:02 1996 David L. Levine * include/makeinclude/platform_sunos5_sunc++*.GNU: removed SOLINK step in build of shared objects for SunOS5 with SunC++: it's not necessary. Thu Dec 12 03:48:26 1996 Irfan Pyarali * ace/Naming_Context: Modified ACE_Naming such that on Win32, you can use ACE_Registry_Name_Space. * ace/Registry_Name_Space: ACE_Registry_Name_Space is a Name_Space which uses ACE_Registry as the persistence mechanism. Win32 clients of ACE_Naming can now start using (the more robust and reliable) Registry persistence without any major code changes. * tests/Naming_Test.cpp: Added the use of Registry_Name_Space to the test if we are on Win32 and UNICODE is turned on. * examples/Registry: Fixed UNICODE behavior of the tests Wed Dec 11 20:33:28 1996 Douglas C. Schmidt * ace/Synch_T.h: Added a warning that indicates why it isn't possible to use ACE_Process_Condition on Win32... * tests/TSS_Test.cpp: Moved the Errno class to a file TSS_Test_Errno.h and replaced the Errno class with the #include "TSS_Test_Errno.h" to work around "features" with AIX C++'s template instantiation scheme. * ace/OS.i (inet_aton): Replaced the use of ((ACE_UINT32) -1) with ((ACE_UINT32) ~0). I expect this is more portable... * tests/run_tests.bat: Added "Service_Config_Test" to the run_tests.bat file. Tue Dec 10 22:59:26 1996 Irfan Pyarali * tests: Added Service_Config_Test to Win32 makefiles. * ace/OS.i (inet_aton): We need to cast htonl to (long) * tests: Added/Fixed UNICODE behavior of the following: MM_Shared_Memory_Test.cpp Mem_Map_Test.cpp Mutex_Test.cpp Naming_Test.cpp Process_Mutex_Test.cpp SPIPE_Test.cpp Time_Service_Test.cpp Tokens_Test.cpp UPIPE_SAP_Test.cpp * netsvcs/lib: Added/Fixed UNICODE behavior of the following: ACE_TS_Clerk_Processor::poolname_ Tue Dec 10 00:33:08 1996 Douglas C. Schmidt * tests/Service_Config_Test.cpp (main): Added a new method called run_test() to ensure that ACE_Service_Config daemon is destroyed before we try to end the test. * ace/OS.i (inet_aton): We need to cast -1 to (ACE_UINT32). * tests/Process_Mutex_Test.cpp (main): Added a minor change to make gcc happy by moving the definition of int i *outside* the loop. Thanks to Thilo Kielmann for reporting this. * ace/OS.h: gcc complains about memcmp, memcpy, strcmp, and strcpy (from ACE_OS::) being used before defined inline. This is due to the include of SString.h at the end of OS.h. So I reordered things in accordance to the changes from Thilo Kielmann . * build/SunOS5.5/examples/Shared_Malloc/test_multiple_mallocs.cpp: Changed the definition of char *base_addr to void *base_addr. * ace/Memory_Pool.cpp (ACE_MMAP_Memory_Pool_Options): Changed the definition of char *base_addr to void *base_addr. * Put out what is hopefully the final beta release of 4.0.33. * ace/Message_Queue: Added the enqueue() method again to maintain backwards compatibility. Thanks to Karlheinz for pointing out the need for this. * ace/Service_Config.h: The svc.conf factory functions were begin defined as extern "C", but the function pointer defined in the ACE_Static_Svc_Descriptor struct is not declared as extern "C", therefore, there was a mismatch. Here's how to fix this: In Service_Config.h, before the struct ACE_Static_Svc_Descriptor add: extern "C" { typedef ACE_Service_Object *(*ACE_SERVICE_ALLOCATOR)(void); } Then in the struct alloc_ field was changed as follows: from: ACE_Service_Object *(*alloc_)(void); to: ACE_SERVICE_ALLOCATOR alloc_; Thanks to Chuck Gehr for this. * ace/Memory_Pool.cpp (commit_backing_store_name): Changed uses of "counter" from int to size_t to remove warnings. * ace/ACE.cpp: Reimplemented the ACE::daemonize() method to conform to the latest version in Richard Steven's new UNP book. * ace/INET_Addr.cpp (set): Replaced the use of ACE_OS::inet_addr() with ACE_OS::inet_aton(). Thanks to W. Richard Stevens for this idea ;-). * ace/OS: Added a new function called inet_aton(), which is based on a new POSIX socket addressing function that is non-ambiguous in its return value (unlike inet_addr). * tests: Added a new Service_Config_Test.cpp to make sure that the timeout features mentioned below work. * ace/Service_Config.cpp: Changed the implementation of run_{reactor,proactor,reactorEx}_event_loop so that it returns if the corresponding handle_events() method times out. Thanks to Phil Logan for reporting this. * ace/LSOCK_Stream: Moved get_remote_addr() from the private part of the class and implemented it using get_local_addr(). This fixes problems that previously occurred when using the ACE_Connector with ACE_LSOCK_Stream. Thanks to Stuart Powell for this suggestion. Mon Dec 9 22:03:30 1996 Douglas C. Schmidt * examples/Threads: Updated the test.mak and test.mdp files to reflect the new name changes. Thanks to Matthias for this. * ace/ACE.cpp (ldfind): Added new code that will work if the "base" part of the filename to look for is the same on both UNIX and NT. The library name will be made up of three parts [ACE_DLL_PREFIX]base part[ACE_DLL_SUFFIX], where prefix is "lib" on UNIX and nothing on NT and suffix is ".dll" on NT and ".so" on UNIX. If either prefix or suffix are missing from the filename you supply to ldfind they will be added automagically. This all will work independent from the pathname, which will be treated completely separately from the filename and can contain either UNIX style or NT style separators. Examples: Source NT UNIX =============================================================== netsvc netsvc.dll libnetsvc.so (PATH will be evaluated) (LD_LIBRARY_PATH evaluated) libnetsvc.dll libnetsvc.dll libnetsvc.dll + warning netsvc.so netsvc.so + warning libnetsvc.so ..\../libs/netsvc ..\..\libs\netsvc.dll ../../libs/libnetsvc.so (absolute path used) (absolute path used) The first and the last of these 4 examples is the way the new functionality is supposed to be used. You simple supply the pathname and the base part of the filename and ldfind will figure everything out. Thanks to Tilo Chris for this code. * ace/OS.h: Added a new macro called ACE_DLL_PREFIX, which is defined to "" on Win32 and "lib" on UNIX. Thanks to Tilo for this. * ace/Reactor.cpp (detach): After further thought, I have commented out the eh->reactor (0); call since I don't think we really need it. * ace/Reactor.cpp (detach): There was a problem with ACE_Reactor::detach(). The following lines: // Reinitialize the Reactor pointer to 0. eh->reactor (0); should be moved before: eh->handle_close (handle, mask); This will render the reactor handle not available in the handle_close method but at least handle_close can delete itself. Thanks to Luca for reporting this. * examples/Reactor/Ntalker: Replaced the use of ACE_OS::getopt() with the ACE_Get_Opt iterator. Thanks to Alexandre Karev for suggesting this. * ace/OS.h: Moved the #endif /* ACE_HAS_DCETHREADS || ACE_HAS_PTHREADS */ once again in order to make sure that the right things happen when #if defined (ACE_HAS_THREADS) is *false*. Thanks to Robert Lyng for reporting this. Mon Dec 9 02:06:48 1996 Irfan Pyarali * ace/SString: Made accessors return const references. * ace/OS.h: Added macro ACE_WIDE_STRING which allows the conversion of char* to wchar_t* when UNICODE is turned on. * ace: Added/Fixed UNICODE behavior of the following: /* Local_Name_Space */ ACE_Local_Name_Space_T::context_file_ /* ACE */ ACE::basename /* Token */ ACE_Token::ACE_Token /* Synch */ ACE_File_Lock::ACE_File_Lock /* SPIPE_Addr */ ACE_SPIPE_Addr::addr_to_string ACE_SPIPE_Addr::set /* FILE_Addr */ ACE_FILE_Addr::addr_to_string /* DEV_Addr */ ACE_DEV_Addr::addr_to_string /* Addr */ ACE_Addr::addr_to_string ACE_Addr::string_to_addr Note: These two were removed from the base class since they are not common to all Address classes. /* Malloc */ ACE_Allocator_Adapter::ACE_Allocator_Adapter ACE_Malloc::ACE_Malloc /* Process */ ACE_Process::start /* Shared_Memory_MM */ ACE_Shared_Memory_MM::ACE_Shared_Memory_MM ACE_Shared_Memory_MM::open /* Proactor */ ACE_Overlapped_File::ACE_Overlapped_File ACE_Overlapped_File::open /* Log_msg */ ACE_Log_Msg::open /* Naming_Context */ ACE_Name_Options::namespace_dir ACE_Name_Options::process_dir ACE_Name_Options::database /* Registry */ ACE_Predefined_Naming_Contexts::connect ACE_Predefined_Naming_Contexts::is_local_host /* SString */ ACE_CString::ACE_CString /* Mem_Map */ ACE_Mem_Map::ACE_Mem_Map ACE_Mem_Map::map /* Service_Config */ ACE_Service_Config::logger_key_ /* System_Time */ ACE_System_Time::ACE_System_Time /* Memory_Pool */ ACE_Sbrk_Memory_Pool::ACE_Sbrk_Memory_Pool ACE_Shared_Memory_Pool::ACE_Shared_Memory_Pool ACE_Local_Memory_Pool::ACE_Local_Memory_Pool ACE_MMAP_Memory_Pool::ACE_MMAP_Memory_Pool ACE_Lite_MMAP_Memory_Pool::ACE_Lite_MMAP_Memory_Pool /* OS */ ACE_OS::strstr ACE_OS::strdup ACE_OS::hostname ACE_OS::open ACE_OS::unlink ACE_OS::dlopen ACE_OS::dlsym ACE_OS::cuserid ACE_OS::fork_exec ACE_OS::sprintf ACE_OS::access ACE_OS::fopen ACE_OS::getenv ACE_OS::system ACE_OS::mkdir ACE_OS::mktemp Sun Dec 8 19:00:45 1996 Tim H. Harrison * ace/Reactor.cpp (handle_events): Updated this method to use the ACE_Countdown_Time::update method after the mutex has been acquired. * ace/Time_Value.cpp (update): Added an ACE_Countdown_Time::update method that calls stop and start. This is useful for methods such as ACE_Reactor::handle_events that need to update timeout values after acquiring locks, but before waiting on the demultiplexing mechanism (e.g. select). * ace/ReactorEx.cpp (handle_events): Modularized the implementation of handle_events. Now it uses helper functions to significantly simplify the implementation. Also updated the header file documentation. * ace/Timer_Queue: Added a timer_skew_ data member and accessor methods to ACE_Timer_Queue. Also added an expire method that calls gettimeofday and adds the timer_skew_ for you. These changes will help simplify Reactor, Proactor, and ReactorEx code. * ace/Reactor : Removed timer_skew_. This code now just calles timer_queue->expire () with no parameters. Very clean. * ace/ReactorEx : Removed timer_skew_ code. * ace/Proactor : Removed timer_skew_ code. * examples/Proactor/test_proactor.cpp: Fixed this application so that it exits when all the data has been sent and received. Previously, it used a cool timeout mechanism to "guess" when all the data had been received. Ahh, but we can't have too much fun, or people start to get nervous. * ace/Service_Config.cpp (run_reactorEx_event_loop (Time_Value)): Fixed the implementation of this method. It now handles reactorEx events until end_reactorEx_event_loop is called, or the specified time value expires. Also fixed the run_proactor_event_loop (Time_Value) method. * examples/ReactorEx/test_timeout.cpp: Added a new example application that shows how to use Service_Config::run_reactorEx_event_loop with timeouts. Check the examples/ReactorEx/README file for more details. * examples/Proactor/test_timeout.cpp: Added a new example application that shows how to use Service_Config::run_proactor_event_loop with timeouts. Yes, this screams for common dispatcher interfaces for Reactor, Proactor, and ReactorEx. Sun Dec 8 10:27:19 1996 Douglas C. Schmidt * ace/Service_Manager.cpp (init): Changed all uses of "int port" to "u_short port" to be consistent with socket types. * ace/ACE.cpp (bind_port): Changed all uses of "int port" to "u_short port" to be consistent with socket types. * ace/Remote_Name_Space.cpp: Changed all uses of "int port" to "u_short port" to be consistent with socket types. * ace/SV_Semaphore_{Simple,Complex}: Changed all uses of "int n" to "u_short n" to be consistent with the SYSV types! * ace/OS.h: Moved the location of the ACE_HAS_USING_KEYWORD macros until *after* we #include "ace/Time_Value.h". Thanks to Matthias for this. * ace/Signal.cpp: Finished implementing the ace_signal_handlers_dispatching logic, which wasn't done entirely earlier. Thanks to Alexandre Karev for reporting this. * netsvcs/servers/main.cpp (main): Fixed several small bugs in the netsvcs main test program. Thanks to Alexandre Karev for finding this. * ace/Reactor: Removed the timer_skew_ data member from the ACE_Reactor since this is now covered by the ACE_Timer_Queue. * ace/Reactor.cpp (handle_events): Added the new version of the ACE_Countdown_Time to simplify the code. * ace/Time_Value: Added a new class called ACE_Countdown_Time, which is used by the Reactor, ReactorEx, and Proactor to keep track of how much time elapsed. * ace/config-win32-msvc4.0.h: Added a change that forces the MSVC compiler to reference the proper Winsock - lib during linking of ACE. This change is necessary because a) in the release version the link to the winsock.lib was completly missing and b) only wsock32.lib has been included (which is wrong when WinSock2 is used). Thanks to Matthias for this. * ace/Module.cpp (ACE_Module): Added code to zero-out the q_pair_[2] pointers. Thanks to Matthias for this. * tests: Removed the argv name from most main() functions so that we don't get warnings... * examples/Threads: Fixed some errors in the threads examples directory, most of which are ambigious overloads. Also included a (MSVC 4.1) makefile for all tests in this directory. Thanks to Matthias for this. * examples/Threads: Renamed all the files by removing the word "test_" at the beginning. This is redundant! * tests/TSS_Test.cpp: If we are running AIX (i.e., if ACE_TEMPLATES_REQUIRE_PRAGMA), then conditionally avoid compiling this test program because it doesn't work unless we split off class Errno due to AIX's rules for generating templates. This is too much work to get right... * ace/OS.i (thr_self): Updated the conditional compilation tests so that we check for ACE_HAS_THREAD_SELF first. Thanks to Chris Lahey for this. * ace/{config-osf1-3.2.h,config-aix-4.1.x.h}: Updated this file so that is has the new ACE_HAS_THREAD_SELF macro, which indicates that the platform uses thread_self() rather than pthread_self(). * ace/config-aix-4.1.x.h: According to Chris Lahey , AIX 4.1.x should have ACE_HAS_PTHREADS rather than ACE_HAS_DCETHREADS. * ace/Thread_Manager: Removed the thread_descriptor_i() methods and replaced them by generalizing the find() method to become find_thread() and find_hthread(). Thanks to Hamutal Yanay for suggesting this. Sun Dec 8 14:39:53 1996 Tim H. Harrison * ace/Timer_Queue: Added a timer_skew_ data member and accessor methods to ACE_Timer_Queue. Also added an expire method that calls gettimeofday and adds the timer_skew_ for you. These changes will help simplify Reactor, Proactor, and ReactorEx code. Sat Dec 7 01:14:04 1996 Irfan Pyarali * tests/Process_Mutex_Test.cpp: Added new test which checks the functionality of a ACE_Process_Mutex. Abandoned mutexes can be created by selecting the correct command-line arguments. * examples/Reactor/ReactorEx/test_reactorEx.cpp: Reverted back to old scheme which does not utilize traits. * ace/Task_T.h: Removed the synchronization trait in Task. This is because template typedefs are only supported by a few platforms. Sigh ;-) Sat Dec 7 16:55:37 1996 Douglas C. Schmidt * ace/Thread_Manager.cpp: Because thread_descriptor_i() only returns 0 or -1 on failure the code for ACE_Thread_Manager::thr_self(ACE_hthread_t &) should read: if (-1 == this->thread_descriptor_i (id, td)) return -1; handle = &td.thr_handle_; Thanks to Matthias for reporting this. * ace/OS: Added a new static instance of ACE_thread_key_t to work around the pthreads implementation on MVS (which doesn't store TSS keys as ints!). Thanks to Chuck Gehr for reporting this. * ace/config-mvs.h: Added #define ACE_TEMPLATES_REQUIRE_SOURCE for MVS C++. Thanks to Chuck Gehr for reporting this. * ace/Signal.cpp: ace_dispatcher was being set to ace_signal_handlers_dispatch() which calls ACE_Sig_Handlers::dispatch (when ACE_HAS_SIC_C_FUNC is defined), whereas it was set to ACE_SigHanlder::dispatch (no s) if not defined. I intended to set this to ace_signal_handler_dispatch (no s). Thanks to Chuck Gehr for reporting this. * ace/Makefile: Fixed a small typo where I wasn't matching char *getenv in the sed regular expression. * ace/{OS,Synch}: Moved various classes around so that things will compile correctly when ACE_WIN32 is defined but ACE_HAS_THREADS is *not* defined. Thanks to Robert Lyng for reporting this. Sat Dec 7 16:55:37 1996 Matthias Kerkhoff * ace/Module: Added some values to the enum so Module clients can decide whether the reader, the writer or both should be automatically deleted. * ace/{Stream,Module,Task}: Changed some function arguments from u_long to int (because enums are represented as ints). * ace/Task: Added a new virtual function to ACE_Task_Base (module_closed), which by default calls ACE_Task_Base::close(1). Please note the changed flags argument. This allows clients to differ between calls originated from a Module and/or Stream from those which result from ~ACE_Task_Exit(). ~ACE_Task_Exit() calls ACE_Task_Base::close(0). This may be or not be a problem to existing applications. It may (hopefully not) be neccessary to change ACE_Task_Base::module_close back to calling ACE_Task_Base::close(0). Fri Dec 06 14:44:20 1996 David L. Levine * ace/OS.cpp: added ::spa () function to allow command line args to be passed to programs in VxWorks * ace/OS.i: (ACE_OS::gettimeofday): VxWorks returns nsec instead of usec, so convert Fri Dec 6 01:21:48 1996 Irfan Pyarali * examples/Reactor/ReactorEx/test_reactorEx.cpp: Rewrote the example such that the test now uses the new Notification Strategy scheme in ACE. This allows a message queue consumer to wait in ReactorEx without spawning a new thread, or creating extra Win32 events. This make the example smaller and much cleaner. * ace/Task_T.h: Added synchronization trait to Task. * ace/Task_T.i (msg_queue): Added a check to delete the old message_queue if we had created it. * ace/ReactorEx.cpp (remove_handler): Removed the call to set reactorEx of the event handler to zero becauses the event handler may no longer be there after the handle_close() completes. Thu Dec 05 21:18:49 1996 David L. Levine * ace/OS.cpp (thr_create): Oops, needed to add another check if thr_id == 0 before assigning *thr_handle = *thr_id, for systems such as Solaris 2.4 that don't have PTHREADS. Wed Dec 4 09:09:56 1996 David L. Levine * ace/Log_Msg.cpp (log): added printout to stderr before call to exit(). Silent calls to exit() are bad :-} * performance-tests/Synch-Benchmarks/Options.cpp (print_results): only use rusage if ACE_HAS_PRUSAGE_T is #defined * examples/IPC_SAP/SOCK_SAP/CPP-in{client,server}.cpp: use blocking connect on VxWorks * ace/config-vxworks*.h: added ACE_LACKS_MPROTECT and ACE_HAS_STRERROR * include/makeinclude/platform_vxworks*: removed INCLDIRS and added indlib.o to GreenHills LIBS * Makefile (cleanrelease and release): changed "rm -r" of ACE.tar.gz to "rm -f", that's probably what was meant Wed Dec 4 00:27:07 1996 Irfan Pyarali * ace/config-win32-msvc*.0.h: Added NOMINMAX. * ace/Registry: Removed NOMINMAX and VC_PLUS_PLUS_NESTED_CLASS_PROBLEM flags from the header file. The VC_PLUS_PLUS_NESTED_CLASS_PROBLEM flag is no longer needed and NOMINMAX is defined at the project level. Thanks to Matthias Kerkhoff for suggesting this. Mon Dec 2 14:13:44 1996 Douglas C. Schmidt * ace: Changed all occurrences of ACE_Event_Handler reactorex() to reactorEx() to be consistent. Thanks to Matthias for suggesting this. * ace/Message_Queue.cpp (close): We didn't allocate the memory for the notification_strategy_, so we darn well can't delete it! Thanks to Matthias for finding this. * ace/Log_Msg.cpp (ACE_TSS_cleanup): Made the ACE_TSS_cleanup function extern "C" for MVS C++ and compilers like it... Thanks to Chuck Gehr for reporting this. * tests/Naming_Test.cpp (main): Added delete ns_context to close things down and free up the semaphores. Thanks to David Levine for suggesting this. * examples/Reactor/Misc/test_demuxing.cpp (handle_input): Fixed a "typo" where we were accessing mb->msg_priority() *after* deleting it! Thanks to Matthias for finding this. Mon Dec 2 09:57:15 1996 David L. Levine * tests/run_tests.*: updated lists of tests to be run * tests/*.cpp: removed trailing .cpp from argument to ACE_START_TEST because it would appear in the log file name Mon Dec 2 00:08:51 1996 Douglas C. Schmidt * ace/Log_Record.cpp (dump): There was an error on line 19 of Log_Record.cpp: ACE_DEBUG ((LM_DEBUG, "\npid_ = %s\n", this->pid_)); should be changed to: ACE_DEBUG ((LM_DEBUG, "\npid_ = %d\n", this->pid_)); Thanks to Sandro Doro for reporting this. * examples/Reactor/Misc/test_handle_set.cpp: Updated the test to remove a warning caused by sloppy nesting of loop counters. Mon Dec 2 00:23:23 1996 Irfan Pyarali * ace/Strategies.{h,cpp}: Update the base-class and added documentation. * tests/test_config.h: Added ACE_INIT_LOG, ACE_APPEND_LOG and ACE_APPEND_LOG to facilitate the appending of log messages to a file. Also changed Pipe_Test to use this new mechanism. * test/Naming_Test: Changed test to use "lite" implementation to speed things up. * netsvcs/lib: Fixed multiple type mismatch warnings. * ace/ReactorEx: Fixed syntax errors in recently modified ReactorEx.* files * ace/ace.{mdp.mak}: Added Strategies.cpp to VC++ makefile. Sun Dec 1 19:19:02 1996 Douglas C. Schmidt * ace/Service_Config: Moved the #inclusion of ace/Proactor.h and ace/ReactorEx.h from the *.h file to the *.cpp file to avoid problems with circular dependencies. * ace/Reactor: Added a new parameter to the Reactor's initialization methods so that we can install a subclass of ACE_Timer_Queue. This is in anticipation of Tim's new "real-time" implementation of a timer queue. * ace/Reactor: Changed the internal Reactor name ACE_Notification_Handler to ACE_Reactor_Notify to be consistent with the ACE_ReactorEx_Notify class. * examples/Reactor/Misc/test_demuxing.cpp: Revised this test so that it now illustrates the new notification mechanism of the ACE_Message_Queue class. * examples/Reactor/Misc: Changed the name of the signal_tester.cpp file to test_demuxing.cpp, which is really what this does. * ace/{Strategies,Message_Queue}: Created a suite of "Notification Strategies" that are used with the new ACE_Message_Queue notification scheme. This works as follows: 1. There's a new virtual hook method on ACE_Message_Queue called notify(). Whenever a new Message_Block is enqueued the notify() hook is called. By default, this does nothing. 2. If you want to do something with the notify() hook, you have two choices: a. You can subclass from ACE_Message_Queue and override this method. This is an example of the "Template Method" pattern. b. You can configure an ACE_Notification_Strategy * into an ACE_Message_Queue. An ACE_Notification_Strategy is the vehicle for extending the behavior of ACE_Message_Queue wrt notification *without subclassing*. Thus, it's an example of the Bridge/Strategy patterns. 3. ACE_Notification_Strategy is defined in ace/Strategies.{h,cpp}. There are two pre-defined subclasses: a. ACE_Reactor_Notification_Strategy -- integrates the ACE_Message_Queue notification into the ACE_Reactor::notify() method. b. ACE_ReactorEx_Notification_Strategy -- integrates the ACE_Message_Queue notification into the ACE_ReactorEx::notify() method. Both of these can be used almost identically in order to seamlessly integrate multiple threads of control, inserting ACE_Message_Blocks in one or more ACE_Message_Queues, with the various ACE event demultiplexors (i.e., ACE_Reactor and ACE_ReactorEx). * ace: Created a new pair of files called Strategies_T.cpp and Strategies_T.h and move the template ACE_*Strategies classes into those files. This was necessary since there are now new non-template notification strategies in Strategies.{h,cpp}. * ace/Message_Queue: Created a new "notification hook" mechanism that makes it possible for event demuxers (like ACE_Reactor and ACE_ReactorEx) to be informed automatically when a Message_Block is inserted into the Message_Queue. This is useful for sitations where you'd like to integrate multiple threads (each of which is pumping data into an ACE_Message_Queue) with an ACE_Reactor or an ACE_ReactorEx. Thanks to Matthias Kerkhoff and Luca for suggesting this. * ace/Synch.h: Modified the implementation of ACE_Null_Condition_Mutex::wait() so that it always returns -1 and sets errno to ETIME. This reflects the fact that if you'll never be awakened if you "sleep" on a Null_Condition... * ace/ReactorEx: Generalized the ACE_ReactorEx so that its notify() method now behaves like the ACE_Reactor, i.e., it can queue up ACE_Event_Handlers that are dispatched in the ReactorEx thread of control. * tests: Renamed the Shared_Memory_MM_Test.cpp to MM_Shared_Memory_Test.cpp and remove the Shared_Memory_SV_Test.cpp since it was redundant to the SV_Shared_Memory_Test.cpp. * tests/SV_Shared_Memory_Test.cpp (main): Revised the SVSV IPC shared memory test to be more robust. * ace/SV_Semaphore_Simple.cpp (open): If the char *name == 0 then use ACE_DEFAULT_SEM_KEY instead. * ace/Memory_Pool: Generalized the ACE_Shared_Memory_Pool so that there can be more than 1 shared memory pool active at a time (similar to what we did for ACE_MMAP_Memory_Pool). * ace/Memory_Pool.h: There was an unnecessary ACE_SV_Semaphore_Complex in ACE_Shared_Memory_Pool that was left over from earlier days. I've removed this. * ace/Memory_Pool.cpp (ACE_Shared_Memory_Pool): Revised the constructor so that if we get a NULL pool_name we'll initialize the * examples/Makefile: Added the System_V_IPC and Shared_Memory directories. * ace/Message_Queue.h: Added a virtual destructor to ACE_Message_Queue so that it can be destroyed appropriately, even if subclassed. * ace/Message_Queue.h: Renamed enqueue() to enqueue_prio() to be consistent with the other names (e.g., enqueue_head() and enqueue_tail(). Updated the test programs to reflect this. Sun Dec 1 12:06:46 1996 David L. Levine * ace/config-vxworks*.h: Removed #define ACE_HAS_STRBUF_T: copy and paste error Sun Dec 1 00:15:45 1996 Irfan Pyarali * ace/OS.h: ACE_NEW_RETURN and ACE_NEW were reverted back to the old implementation. This is temporary till the infinite loop problem with ACE_ERROR, ACE_DEBUG and ACE_TRACE being called from ACE_Log_Msg::instance() is fixed. * ace/Synch.h: Repositioned ACE_Semaphore such that there are no problems in compiling ACE_Process_Semaphore under Win32. * ace/config-win32-msvc4.0.h: Changed ACE_HAS_STL to ACE_HAS_STANDARD_CPP_LIBRARY which is more descriptive (and what is expected by stdcpp.h). * ace/Registry.h: Added the setting of NOMINMAX and VC_PLUS_PLUS_NESTED_CLASS_PROBLEM flags so that STL behaves properly. * ace/Log_Msg.cpp (open): Fixed a small bug such that msg_ostream is only set this to cerr if it hasn't already been set. * STL: Updated the STL directory will latest code from http://www.rahul.net/terris/ and also added the original readme2.stl file. Created ACE_Changes which has the list of changes made to the STL distribution. Sat Nov 30 12:02:00 1996 Douglas C. Schmidt * ace/OS.h: Added a new pragma that disables warning #4097 in MSVC++ (typedef-name used as synonym for class-name). This keeps Win32 clients from getting warning on Win32. Thanks to Matthias Kerkhoff for this. * ace/Log_Msg.cpp: Created a new macro called ACE_NEW_RETURN_I, which is used withing ACE_Log_Msg::instance(). We can't afford to call ACE_LOG_MSG->instance() from within ACE_Log_Msg::instance() or else we will recurse infinitely! Thanks to Irfan for finding this. * ace/OS.i (mprotect): Added a #if !defined (ACE_LACKS_MPROTECT) conditional compilation directive to support the EPLX real time OS from CDC (based on LYNX). Thanks to Alexandre Karev for reporting this. Sat Nov 20 12:23:45 1996 Prashant Jain * tests/Naming_Test.cpp (main): Added code that creates a unique backing store name and removes the backing store every time the test is run. Fri Nov 29 12:54:12 1996 Douglas C. Schmidt * ace/Stream.cpp (open): Changed tail->close() and head->close() to delete tail and delete head now that we've got our new changes. * ace/Module: Moved the destructor from the private part of the class to the public part and changed things so that close() no longer "deletes this." This is too confusing and error-prone. In addition, changed the Module destructor so that it will try to call close() only if close hasn't already been called. * ace/Synch.h: Moved ACE_Process_Semaphore out of the ACE_HAS_THREADS section since this is available on platforms that don't have threads. * Now that Log_Msg.h is being #included in OS.h, I removed all other #includes of Log_Msg.h throughout the rest of ACE. * ace/OS.h: Rearranged the definition of the ACE_NEW and ACE_NEW_RETURN macros so that they come at the end of OS.h. This enables us to #include "ace/Log_Msg.h" here, as well, so that we can make use of the ACE_LOG_MSG macro in the definition of ACE_NEW and ACE_NEW_RETURN. * ace/Singleton.cpp (instance): Updated the ACE_Singleton implementation to use the new ACE_NEW and ACE_NEW_RETURN macros. * ace/OS.h: Revised the ACE_NEW and ACE_NEW_RETURN macros so that they check to see if the constructor of the newly allocated object failed (i.e., by checking the ACE_LOG_MSG->op_status() value). * tests/Reactors_Test.cpp: Added an ACE_ASSERT() after each Reactor we create in order to make sure it worked. * tests/Reactors_Test.cpp: Added an ACE_Service_Config daemon instance within main() in order to ensure that the Reactor is cleaned up appropriately. This avoids problems with NT 4.0, where there seems to be a bug if you don't shut down sockets explicitly when the process exits. * tests/Pipe_Test.cpp (main): Improved the pipe test so that it automatically iterates multiple times in order to test whether there are problems with rapidly opening and closing NT socket handles... Thu Nov 28 03:07:48 1996 Irfan Pyarali * netsvcs: netsvcs.mak and netsvcs.mdp were changed such that it becomes easier to find ace.lib while compiling netsvcs.lib. * tests/Pipe_Test.cpp: Add more instances of ACE_Pipes to the test and also added an option to close down the pipe. Thu Nov 28 00:53:16 1996 Douglas C. Schmidt * ace/config-sunos4-g++.h: This config file contained two exclusive definitions #define ACE_HAS_SVR4_SIGNAL_T and #define ACE_HAS_SUNOS4_SIGNAL_T The first one was moved out. Thanks to Alexandre Karev for reporting this. * ace/OS.h: #elif defined (ACE_HAS_SUNOS4_SIGNAL_T) was changed from typedef void (*ACE_SignalHandler)(void); typedef void (*ACE_SignalHandlerV)(void); to typedef void (*ACE_SignalHandler)(...); typedef void (*ACE_SignalHandlerV)(...); to make gcc happy. The first one was moved out. Thanks to Alexandre Karev for reporting this. * ace/Pipe.cpp (close): Arrgh! Fixed a total braino where we weren't using ACE_OS::closesocket() to close down the Win32 ACE_Pipe implementation, which uses sockets... Thanks to Irfan and Tilo for helping me figure this one out! * tests/CPP_Test.cpp: Completely reworked this test so that it should run correctly on Win32 and UNIX. Wed Nov 27 16:50:17 1996 Douglas C. Schmidt * Put out a new beta of ACE 4.0.33. * tests/Mutex_Test.cpp (test): Fixed the test() function so that it doesn't use the ACE_Thread_Control unless we explicitly want to use threads. * tests/test_config.h: Added addition information about the process id and thread id of the main thread. * ace/Synch.h: Speed things up a bit by conditionally #including "ace/SV_Semaphore_Complex.h" only if we are compiling on a non-Win32 platform or a POSIX platform. Thanks to Matthias Kerkhoff for this. * ace/SV_Semaphore_Complex.h: Incorporated the new ACE_USING macro, which is useful if you have class b { a() }; class d : private b { b::a() // still works, but depriciated using b::a() // should be used instead }; Thanks to Matthias Kerkhoff for this. * ace/OS.h: Added a new macro called ACE_USING, which is used to distinguish between platforms that support namespace "using" semantics and those that don't. Thanks to Matthias Kerkhoff for this. * examples/Misc/test_XtReactor[12].cpp: Had to add the infamous #define String XtString before including Xm/PushB.h. Also, there were some references to XtReactor when the class is now ACE_XtReactor. Thanks to Gonzalo Diethelm for reporting this. * ace/XtReactor.cpp (ACE_XtReactor): timeout_ was not being initialized on the constructor, and that caused a core dump. Thanks to Gonzalo Diethelm for reporting this. * ace/SOCK.h: Put the open() call in the protected part of the class since we generally don't want clients to call this directly. Thanks to Eric Newton for pointing this out. * ace/ACE.cpp: Fixed a bug where sin.sin_family was being set rather than sin.sin_len. Thanks to Chuck Gehr for reporting this. * ace/ACE.cpp: Enhanced the ACE::{send_n,recv_n} methods so that they check to see if errno == EWOULDBLOCK when ACE_OS::send() or ACE_OS::recv() returns -1. If that's the case, then they keep iterating. Thanks to Mehdi TABATABAI for this suggestion. * ace/Log_Msg.h: Fixed ACE_RETURN so that it only has 1 parameter if ACE_NLOGGING is enabled. Thanks to Antonio Tortorici for reporting this. * ace/config-vxworks*.h: Added ACE_NTRACE macros so that tracing doesn't magically turn on! * ace/Task.cpp (activate): the &ACE_Task_Base::svc_run() argument needs a cast to ACE_THR_FUNC, because that's what ACE_Thread_Manager::spawn_n() requires. On VxWorks, ACE_THR_FUNC functions return an int, while svc_run() returns void *. Thanks to David Levine for this. * ace/Thread_Manager.cpp (kill_thr): I was mistakenly passing in the thr_handle_ where I should have been passing in the thr_id_. In addition, made sure we don't set errno to the wrong value... Thanks to Ross Dargahi for reporting this. * ace/{Synch_T,Synch}.h: If we don't actually own the lock anymore, don't try to do a release. Thanks to Jonathan Biggar for reporting this bug. * ace/ACE.cpp (handle_timed_complete): Added an ex_handles mask so that non-blocking connects will work correctly on Win32. Thanks to Antonio Tortorici for reporting this fix. * ace/Message_Queue.h: Updated the documentation to stress the fact that the timeouts are specified in *absolute* time, rather than in relative time. Thanks to Bob Dunmire for reporting this. * tests/test_config.h: Modified the ACE_END_TEST macro so that the log file is closed. This works around a problem on VxWorks where destructors of static objects don't get closed automatically. Thanks to David Levine for this fix. * ace/OS.i (rand_r): Added a fix for Digital UNIX so that rand_r works correctly in MT settings. Thanks to Thilo Kielmann for this. Wed Nov 27 16:12:00 1996 Tim H. Harrison * ace/Stream.cpp: Fixed a bug in ACE_Stream::open to allow applications to specify a tail or a head without having to specify both. This was needed by the ACE_Pipeline application since it only needs a Pipeline-specific tail (not a head). Tue Nov 26 18:00:25 1996 Douglas C. Schmidt * ace: Functions should not be declared with ACE_INLINE in a .cpp file. Fixed this problem in the following files: SPIPE_Acceptor.cpp:116:ACE_INLINE TLI_Acceptor.cpp:145:ACE_INLINE int TLI_Acceptor.cpp:192:ACE_INLINE Task.cpp:121:ACE_INLINE int Task.cpp:130:ACE_INLINE void * ace/{OS,Thread}: Added Chuck Gehr's suggested change for the pthread_keycreate() routine, which must take extern "C" functions on MVC C++. This fix isn't perfect, but it should allow the ACE library to build... * man: Updated all of the manual pages and HTML files. * ace/Signal.cpp: Updated the code so that we don't try to register a static C++ dispatch method if ACE_HAS_SIG_C_FUNC is defined. This fixes problems with the MVS C++ compiler... Thanks to Chuck Gehr for this suggestion. * ace/OS.h: Added extern "C" { } wrappers around the signal handling mechanisms if ACE_HAS_SIG_C_FUNC is defined. This fixes problems with the MVS C++ compiler... Thanks to Chuck Gehr for this suggestion. * ace/Reactor.cpp (open): Moved the initialization of the ACE_Timer_Queue field to *before* the handler_rep_.open() call. We do this first in case the handler_rep_ call fails (which it sometimes does on Win32 when we restart applications quickly due to the use of sockets as a notification mechanism). At least this way the timer_queue_ isn't 0, so we can still use the Reactor as a timer... Thanks to Tilo Christ for motivating me to fix this. * ace/OS.i: Apparently, DIGITAL_UNIX gethostbyname() returns thread-specific storage, so we can use this for gethostbyname_r(). * ace/OS.i: Need to add: #else after line 3268: return (size_t) ACE_OS::sysconf (_SC_THREAD_STACK_MIN); otherwise we get a compile error: line 3296.1: CBC1331(W) Return value of type "unsigned int" is expected This is because no code ends up getting generated. Thanks to Chuck Gehr for this fix. * ace/OS.i (ACE_PTHREAD_CLEANUP_PUSH): Removed an extraneous set of parens. Thanks to Chuck Gehr for this fix. * ace/OS.cpp (thr_create): Oops, needed to add a check if thr_id == 0 before assigning *thr_handle = *thr_id! Thanks to Prashant for finding this. Tue Nov 26 21:06:13 1996 Irfan Pyarali * ace/Pipe.cpp (open): This change relates to Win32 code only. Removed the reuse_addr flag to acceptor.open() so that we don't try to reuse the acceptor socket immediately. Apparently, this causes no end of trouble on Win32 as the following connect() call fails (randomly). Now it should be possible to create multiple ACE_Pipes in one process and hence create multiple Reactors also without any problems. * tests/Pipe_Test.cpp: Added a ACE_Pipe test to check for the creation of multiple pipes in a process. Also changed the relevant makefiles and scripts. Tue Nov 26 11:27:33 1996 David L. Levine * tests/{CPP_Test,Mutex_Test,Shared_Memory_MM_Test,SPIPE_Test}.cpp: added VXWORKS support for these tests by spawning a new thread instead of forking a new process (the same as on Win32) * netsvcs/clients/Naming/Client/Client_Test.cpp (open): Added a return 0 for success. * ace/Singleton.h: Modified the use of the ACE_NEW_RETURN macro so we not only check if new has failed, but also check that the constructor has succeeded. If it hasn't, we bail out... Thanks to Luca for this suggestion. * ace/Log_Msg: Added a 4th parameter to log_hexdump() in order to print out a comment. Thanks to Luca for this. * ace/ACE.cpp (ldfind): Changed the implementation to look for ACE_DLL_SUFFIX rather than '.' since '.' might exist in the pathname already... * Removed all the NT-specific svc.conf files and updated the other files to use the new "auto-dll-suffix" feature in ACE. * ace/Synch_T.cpp (ts_get): Fixed a nasty bug introduced by recent changes to ACE_TSS<>::ts_get(). The ACE_Mutex should be ACE_Thread_Mutex. This should fix lots of nasty run-time bugs seen with recent versions of the ACE 0.33 beta... Tue Nov 26 14:40:00 1996 David L. Levine * Log_Msg.cpp: fake out TSS on VxWorks in Log_Msg::instance() by using a spare field in the task control block * tests/{CPP_Test,Mutex_Test,Shared_Memory_MM_Test,SPIPE_Test}.cpp: added VXWORKS support for these tests by spawning a new thread instead of forking a new process (the same as on Win32) * OS.h: VxWorks can't handle the ACE_THR_FUNC typedef if it's in the extern "C" block, so I moved it back out. Also, the horrible GreenHills hack is no longer required. * OS.i: there's an ACE_OS_CALL_RETURN before a ::strncpy() call, I changed it to ACE_OS_CALL. * OS.i: Added call to VxWorks ::mkdir() * Pipe.cpp: VxWorks doesn't know about TCP_NODELAY. * INET_Addr.cpp: get_host_name() is missing a return statement, on VxWorks only * Thread_Manager.i: in ACE_Thread_Control::thr_mgr(), there were two consecutive return statements, removed the first one. * Time_Request_Reply.{h,cpp}: GreenHills warns that "type qualifiers are meaningless" for declaration of const ACE_UINT32 time(), so I removed them. * UPIPE_Stream.cpp, line 95: warning: integer conversion resulted in a change of sign, so we cast n to int. * Map_Manager.cpp: in ACE_Map_Manager::resize_i(), variable foo is unnecessary, so we omitted it. * tests/CPP_Test.cpp (and a few others) have references to argv[0]: Tue Nov 26 03:15:22 1996 Irfan Pyarali * tests: Added Map_Manager_Test and Message_Queue_Test to makefiles (NT and UNIX) and one-button scripts. * tests: (Barrier_Test.cpp Buffer_Stream_Test.cpp Mutex_Test.cpp Priority_Buffer_Test.cpp Recursive_Mutex_Test.cpp Shared_Memory_MM_Test.cpp) Fixed typos mainly and other small changes. Also fixed logging file problems so to make logging of tests more accurate. Mon Nov 25 00:23:40 1996 Douglas C. Schmidt * performance-tests/Synch-Benchmarks/Options.cpp (Options): Reordered the initialization of data members to keep G++ from complaining. * performance-tests/Synch-Benchmarks/pipe_thr_test.cpp: Changed some types so that we don't get warnings. * tests/Mutex_Test.cpp (test): Added a "return 0". Thanks to David Levine for reporting this. * ace/TTY_IO.cpp: Rearranged some definitions so that we don't get "unused variable" warnings from g++. * ace/SOCK_Dgram.cpp (recv): Rearranged some definitions so that we don't get "unused variable" warnings from g++. * tests/Priority_Buffer_Test.cpp (consumer): Fixed a typo -- I was missing a *... Thanks to David Levine for reporting this. * ace/OS.h (ACE_SVC_FACTORY_DECLARE): Changed the macro so that it defines a function with `extern "C"' linkage in order to be consistent. * ace/OS.cpp (thr_create): Moved the conditional compilation test for ACE_HAS_THR_C_FUNC outside of ACE_HAS_SETKIND_NP since MVS doesn't have this! Thanks to Chuck Gehr for this info. * ace/OS.i (thr_sigsetmask): Replaced the tests for ACE_HAS_DCETHREADS and ACE_HAS_SETKIND_NP with ACE_LACKS_PTHREAD_THR_SIGSETMASK, which is more appropriate. * ace/OS.cpp (ace_mutex_lock_cleanup_adapter): Changed the signature so that it returns "void" rather than "void *". Thanks to Chuck Gehr for this. * ace/OS.h: Removed #include to avoid problems on MVS. Thanks to Chuck Gehr for this. * ace/config-sunos5.5-sunc++-4.1.h: It looks like SunC++ 4.1 still doesn't fix their template typedefs bugs. So I've commented this out in the config file. Thanks to Fred LaBar for reporting this. * ace/ACE.cpp (ldfind): Added support for a new feature that will append the default suffix (e.g., ".dll" or ".so") for a shared library on the current platform to the name of the file if it cannot find an suffix. It will also check that a provided suffix will match the default suffix for that platform and if it doesn't it will produce a log entry with a warning. This change will allow unified svc.conf-files for both UNIX and WinNT. Thanks to Tilo Christ for this. * ace/OS.cpp (thr_create): Came up with a remarkably clever scheme that should make it possible to utilize the ACE library *without change* on MVS, where the frigging C++ compiler requires all functions passed to pthread_create() have an extern "C" linkage. The trick was to generalize the thread adapter mechanism used for Win32. * ace/OS: Added a new macro called ACE_PTHREAD_CLEANUP_PUSH that selects the right mechanism (e.g., ace_spawn_adapter or not) for passing functions to pthread_cleanup_push(). * ace/config-mvs.h: Added a new macro called ACE_HAS_THR_C_FUNC which expresses the fact that the MVS C++ compiler *must* have an extern "C" function passed to pthread_create(). * ace/OS.h: Modified all uses of ACE_OS::mutex_lock_cleanup() to use the extern "C" ace_spawn_adapter() on platforms MVS like MVS that can't deal with non-C functions to pthread_create. Thanks to Chuck Gehr for reporting this. * ace/OS.cpp (thr_create): Added Chuck Gehr's patches for MVS. Sun Nov 24 12:30:45 1996 Douglas C. Schmidt * ace: Added Chuck Gehr's config-mvs.h file! * ace: Began adding support for WinSock 2.0. Thanks to Luca for this. * ace/UPIPE_{Acceptor,Connector,Stream}: Updated the UPIPE components so that they keep a reference count that keeps track of the number of "owners" (which should always be 2 -- one for the connector-side and one for the acceptor-side). By keeping this count, we can ensure that we don't close down the underlying ACE_Stream until both sides have called close(). This will remove a nasty bug that was lurking in some of the tests. * ace/Message_Block.h: Added a new copy() method that assumes the buf passed in is a NUL-terminated string. * tests/UPIPE_SAP_Test.cpp: Modified this test so that threads exit in a well-defined order. This should prevent problems on Win32. * ace/OS.i: Changed SIGNAL_SAFE_OS_CALLS to ACE_HAS_SIGNAL_SAFE_OS_CALLS to be consistent... * ace/config-vxworks*.h: Removed the SIGNAL_SAFE_OS_CALLS #define from the VxWorks config files. There's no need to use this by default. * ace/Event_Handler: Moved all the default implementations of the virtual methods in ACE_Event_Handler from the *.i file to the *.cpp and made them no longer be inlines. This will fix some problems with some compilers (e.g., MSVC++ 4.1) and is also more reasonable since there's really no purpose for inlining these virtual functions since they are rarely called. Thanks to James Michael Dwyer for reporting this problem. Sat Nov 23 12:39:03 1996 Douglas C. Schmidt * ace/Svc_Conf.y: Changed the parser so that it accepts DLL pathnames that lack *.dll or *.so suffixes. This is necessary so that we can automatically append the correct suffix depending on the platform. Thanks to Tilo Christ for suggesting this. * ace/Makefile: Updated the Makefile so that it will automatically insert the appropriate so that conditions for include of ace/OS.h can be checked correctly. Fri Nov 22 18:12:49 1996 Douglas C. Schmidt * ace/OS.i (thr_sigsetmask): DCE threads (at least as implemented by Digital) have no means for setting the signal mask on a per-thread basis. Therefore, modified the code so that it correctly returns ACE_NOTSUP_RETURN(-1) for DCEthreads. Thanks to Thilo Kielmann for chasing this down. * performance-tests/Synch-Benchmarks/synch_driver.cpp (run_test): Fixed this implementation so that it will shut down correctly when a signal occurs or a timeout occurs (whichever comes first). Fri Nov 22 08:02:39 1996 Irfan Pyarali * ace.{mdp,mak}: Changed ace.mak so that it links with the non-debug version of Microsoft's multithreaded dll when compiled with the release option Thu Nov 21 10:37:40 1996 Douglas C. Schmidt * ace/Service_Config: Changed the implementation of the Service_Config class so that it no longer inherits from ACE_Event_Handler. This was causing problems because the new reactor() method in the ACE_Event_Handler was conflicting with the static reactor() method on ACE_Service_Config. * ace/OS.cpp (detach): Since we no longer use an ACE_Recursive_Thread_Mutex, we can remove the line else if (ACE_TSS_Cleanup::lock_.get_nesting_level () > 1) // ... Thanks to Matthias Kerkhoff for reporting this. * ace/Thread_Manager.cpp (spawn_n): Replaced int i with size_t i to avoid warnings between signed and unsigned values. * ace: There is an easy way to speed up the "Update dependencies" in MSVC. Just keep the the compiler from complaining about missing header by inserting a comment like below in the #include-directives which are not used in Win32. Therefore, instead of #include we use #include /**/ Please let me know if this causes problems for any pre-processors. Thanks to Matthias Kerkhoff for this suggestion! * ace/OS.cpp: Added support for AfxBeginThread in ACE_OS::thr_create() and ACE_OS::exit(). Now ACE should work with MFC when you give the THR_USE_AFX flag to ACE_OS::thr_create()! Thanks to Matthias Kerkhoff for this! * ace/Malloc_T.cpp (avail_chunks): Changed the return value to ssize_t so we can return -1 if we can't get the lock. Thanks to Tilo for reporting this. * ace/config-sunos4-sun3.x.h: Added new #ifdefs for Sun C++ 3.0.1 on SunOS 4.1.3. Thanks to Eric Parker for these fixes. * ace/Stack.h: Added a new method called peek() to the ACE_Unbounded_Queue classes so that the first element can be retrieved without removing it. Thanks to Luca for this suggestion. * ace/SString.cpp (ACE_CString): Changed ACE_CString so that it uses memcpy() rather than str(n)cpy() so that we can store any structure into it. Thanks to Luca for this suggestion. * ace/Acceptor: Since we moved the reactor() accessors to ACE_Event_Handler we can omit these from the Acceptor and Svc_Handler. * ace: Updated the ACE_Reactor and ACE_ReactorEx so that they automatically sets the pointers in ACE_Event_Handlers. Thanks to Luca for this suggestion. * ace/Event_Handler: Added pointers to all the ACE demultiplexors (e.g., ACE_Reactor, ACE_ReactorEx, and ACE_Proactor) to ACE_Event_Handler, along with set/get accessor methods. This supports a very common use-case where an event handler keeps track of its demultiplexor. Thanks to Luca for this suggestion. * ace/OS.cpp: Since we do not use the recursion count from the Recursive Mutex any more in ACE_TSS_Cleanup::exit() we can replace the Recursive Mutex by a regular ACE_Thread_Mutex that is recursive on NT natively and more efficient. Thanks to Detlef for suggesting this. * ace/OS.cpp: Since we do not use the recursion count from the Recursive Mutex any more in ACE_TSS_Cleanup::exit() we can replace the Recursive Mutex by a regular ACE_Thread_Mutex that is recursive on NT natively and more efficient. Thanks to Detlef for suggesting this. * ace: Backed out all of Detlef's changes to ACE_OS and ACE_TSS::ts_get(). It turns out that this is unnecessary since he reimplemented ACE_TSS_Cleanup so that it no longer needs to hold the lock when callbacks are made. Once again, Detlef proves that he's a macho man, not a boy ;-) Thu Nov 21 08:12:51 1996 David L. Levine * include/makeinclude/platform_sunos5_sunc++_4.1.GNU: put back the LD definition * include/makeinclude/platform_osf1_4.0_g++.GNU: added LD definition to work with latest wrapper_macros.GNU Wed Nov 20 10:32:52 1996 Irfan Pyarali * tests: Mutex_Test.cpp Priority_Buffer_Test.cpp Reader_Writer_Test.cpp Thread_Pool_Test.cpp were changed slightly to remove some compile time warnings. Wed Nov 20 21:35:28 1996 David L. Levine * ace/Svc_Conf_l.cpp: added #include of ace/config.h so that conditions for include of ace/OS.h can be checked. Wed Nov 20 02:38:40 1996 Douglas C. Schmidt * ace/Service_Config.cpp: Moved the definition of logger_key_ to OS.h and changed it to a macro (ACE_LOGGER_KEY) so that it will be portable to Win32 and UNIX. Thanks to Tilo for reporting this. * ace/OS: Changed the return value of ACE_OS::getgid() from uid_t to gid_t to be POSIX compliant. * ace/OS.cpp (thr_create): Fixed a typo where we were assigning stacksize rather than size. Thanks Thilo. * ace/OS.cpp (thr_create): Added a new piece of code for ACE_NEEDS_HUGE_THREAD_STACKSIZE, which is necessary to create a larger per-thread stack size in order to run ACE_Log_Msg::log. Thanks to Thilo for this. * tests/TSS_Test.cpp: Changed the name of the static variable "lock" to "cout_lock" to avoid a potential namespace clash on Digital UNIX. Thanks to Thilo Kielmann for reporting this. * ace/SOCK_Dgram.cpp (recv): Added a cast (char *) io_vec->iov_base so that this would work correctly on platforms where iov_base is a void * (e.g., AIX and HP/UX). Thanks to Alan Stewart for the change. * ace/OS.h: Added a few new changes for Digital UNIX 4.0a. These should fix problems with ctime_r() and asctime_r(). Thanks to Dave Trumble for the fixes. * tests/UPIPE_SAP_Test.cpp: Disabled this test if we don't have threads and (STREAM Pipes or Win32). Thanks to Thilo Kielmann's for this info. Tue Nov 19 23:09:08 1996 Tim H. Harrison * ace/Log_Record.cpp (print): Added a call to ACE_OS::fflush before returning. This change was suggested by Luca in order to help prevent messages from getting lost when applications exit. We're unsure of the affects this will have on performance, so we may change this back in the future. Tue Nov 19 00:06:57 1996 Douglas C. Schmidt * Released a beta version of ACE 4.0.33 for testing. * ace/TTY_IO.h: Added the ACE_Export macro before the ACE_TTY_IO class to make things work correctly for Win32 DLLs. Thanks to William L. Gerecke for fixing this. * ace/OS.h: Improved the support for RLIMIT_NOFILE. Thanks to Alan Stewart for reporting this. * ace/OS.h: Removed the following code from OS.h because it is causing problems on some platforms: #if (!defined (timespec) && !defined (m88k)) #define timestruc_t struct timespec #endif /* timespec */ Thanks to Fred LeBar for reporting this. * ace/OS.cpp (thr_create): Needed to create an ACE_OS::NULL_hthread so that we can assign the "NULL thread handle" on POSIX platforms. Thanks to Alan Stewart for reporting this. * ace/OS.i: The HP/UX C++ compiler is unable to grok inline functions with multiple returns. So I recoded the ACE_OS::event* methods to avoid this. Thanks to Alan Stewart for reporting this. * ace/OS.h: Moved the "undef" of t_errno until after the inclusion of mman.h and dlfcn.h to prevent problems with DU4.0a. Thanks to David Trumble for reporting this. * ace/Pipe.cpp (open): Fixed a typo where this->ACE_SOCK::set_option() was being used instead of writer.set_option(). Thanks to Tilo Christ for reporting this. * ace/Message_Queue.h: Fixed a bug where ACE_Message_Queue &queue_; should be: ACE_Message_Queue &queue_; Thanks to Rick Orr for reporting this. * apps/Makefile: Updated the Makefile so that it no longer tries to look for Synch-Benchmarks. Thanks to Amos Shapira for reporting this. * ace/Activation_Queue.cpp (dequeue): Added a sanity check to make sure that we actually deleted the first element in the queue. Thanks to Andres Kruse for reporting this. * include/makeinclude/platform_sunos5_sunc++_4.1.GNU: Added a minor change to remove the libACE.a archive prior to creating a new one. This works around bugs with the SunOS 4.x C++ compiler. Thanks to Andres Kruse for reporting this. * ace/Malloc_T.cpp (avail_chunks): Added Fred LeBar's code and comments for computing the available chunks. * tests/Mutex_Test.cpp: Rewrote the Mutex_Test so that it behaves correctly on UNIX and Win32. Thanks to Irfan for reporting the problem. * ace/Log_Msg.cpp (sync): Somehow, the statement that updated the pid_ after sync() is called following a fork() got removed, so I put it back in. * ace/config-sunos5.*-g++.h: Added the -D_REENTRANT flag to the config files for the G++ version of ACE. This fixes a nasty problem that otherwise arises when compiling on SunOS 5.x. Thanks to Hanan Herzog for reporting this. Tue Nov 19 21:14:15 1996 David L. Levine * performance-tests/Synch-Benchmarks/Benchmark.{h,cpp}: use thread ID class for VxWorks as well as Pthreads. * OS.i, config-{osf1-4.0,sunos5.[45]}-g++.h: Moved GNU #include out of config files and into OS.i. * ace/Svc_Conf_l.cpp: added #include of ace/OS.h for HPUX and VxWorks. * ace/Token.cpp: reordered initializations in Ace_Queue_Entry ctor to match declaration order. Mon Nov 18 00:47:27 1996 Douglas C. Schmidt * ace/OS.h: Added a new #define called ACE_HAS_BROKEN_CONVERSIONS to workaround problems with the HP/UX C++ compiler, which doesn't seem to be able to grok foo->operator T *(). Thanks to Alan Stewart for reporting this bug and the fix. Also updated the config-hpux*.h files with this define. * examples/Misc: Added a new test (test_get_opt.cpp) which exercises the ACE_Get_Opt class. Sun Nov 17 13:00:02 1996 Douglas C. Schmidt * ace/Get_Opt: Replaced the GNU-based implementation of class ACE_Get_Opt with an implementation based on BSD UNIX. The advantage here is that the BSD version is not encumbered by the GNU GPL. Thus, ACE has no more dependencies on GNU GPL. Thanks to James Hu for finding the BSD code. Mon Nov 18 00:13:25 1996 Tim H. Harrison * ace/stdcpp.h: Added this file to ACE. This file contains the portability ugliness for the Standard C++ Library. As implementations of the "standard" emerge, this file will need to be updated. Although not very useful now, we are gearing up for a support for STL on UNIX and NT. * ace/OS.h: Added an include "ace/stdcpp.h". * ace/Log_Record.h (ACE_Log_Record): Removed the iostream include mess that got accidentally committed to the release. Sun Nov 17 00:13:25 1996 Tim H. Harrison * For some totally evil reason, MSVC++ will not allow any use of the "allocator" symbol. It's an STL thing. As a result, I've had to change all of the following files to rename allocator to alloc: Local_Name_Space_T.cpp, Map_Manager.cpp, Malloc_T.cpp, Message_Block.cpp, Read_Buffer.cpp, SString.cpp. The root of the problem can be seen by compiling the code below: template class foo {}; int foo; // compile error because of the foo<> class. int main () { return 0; } * Service_Config.{h,cpp}: We have to change the allocator accessors to alloc. This is probably going to break many things. If necessary, we can conditionally compile in the old accessors for platforms that are not using STL and MSVC++. * ace/Task.h: Added ACE_Export macros to the class definitions. Sun Nov 17 13:00:02 1996 Douglas C. Schmidt * ace: Added Thilo Kielmann's patches for OSF/1 4.0a. * ace/OS: Revised the implementation of ACE_OS::asctime_r() and ACE_OS::ctime_r() to simplify common cases. However, this may have broken some code on OSF/1 4.0a. Can someone please check this? * tests/SPIPE_Test.cpp: Conditionally compiled this file so that we only build the SPIPE test if (1) we're running on Win32 or (2) ACE_HAS_STREAM_PIPES. Thanks to David Levine for this suggestion. * ace/OS.i (ctime_r): Fixed a typo that was caused by a misplaced #endif. Thanks to Eshel Liran for reporting this. * ace/Time_Value: Disabled ACE_TRACE within these method in order to prevent infinite recursion. * ace/Log_Record: Originally, when verbose mode was enabled you can get the date and time down to the seconds. However, it is useful for performance testings to have milliseconds displayed in the log. To accomplish this, I changed ACE_Log_Msg and ACE_Log_Record to they also keep track of and print the microsec time, as well. Thanks to Luca for suggesting this. * ace/Map_Manager.cpp: updated all the ACE_Map_Manager methods so their read and write Guards use the ACE_*_GUARD macros. * ace/Malloc_T.cpp: Updated all the ACE_Malloc methods so their read and write Guards use the ACE_*_GUARD macros. * ace/OS.cpp (svc_run): Added an ACE_DEBUG announcing that an exception has propagated beyond the outermost svc_run() function. Thanks to Luca for this suggestion. * tests/test_config.h: VxWorks passes in a NULL argv (arrghhh...). Therefore, to work around this in the ./tests directory, I changed the ACE_START_TEST macro to take a NAME parameter, and then I added the following local variable: const char *program = argv ? argv[0] : NAME; Thanks to David Levine for this fix. Sat Nov 16 12:01:08 1996 Douglas C. Schmidt * examples/Threads/test_tss2.cpp: Added Detlef's new test for ACE_TSS. * ace/Synch_T.cpp (ts_get): Added Detlef's changes to fix deadlock problems with ACE_TSS on NT. Fri Nov 15 18:01:26 1996 Douglas C. Schmidt * ace/ACE_SOCK_Stream.cpp: NT will signal an abortive close to the opposite party if a socket is closed before all of its data has been sent out. According to the NT SDK-docs, you should do a shutdown before the closesocket() in order to prepare a graceful close. Thus, I've placed an ACE_SOCK_Stream::close_writer() method just before the call to ACE_SOCK::close() in the new close() of the ACE_SOCK_Stream class. Thanks to Tilo Christ for this suggestion. * ace/INET_Addr.cpp: The function ACE_INET_Addr::addr_to_string was a virtual function that is also inline and defined in the .i file. Some compilers have a problem with this, so I moved it into the *.cpp file. In addition, its sister function was also virtual and is defined as: ACE_INLINE int ACE_INET_Addr::string_to_addr (const char s[]) in the .cpp file. I removed the ACE_INLINE directive. Thanks to Fred LaBar for reporting this. Thu Nov 14 16:20:20 1996 Douglas C. Schmidt * ace/Malloc_T.cpp: Added a new method to ACE_Malloc that will return the number of chunks available on the free list. Thanks to Fred Labar for this. Wed Nov 13 01:22:16 1996 Douglas C. Schmidt * ace/ReactorEx.cpp (handle_events): I've changed siginfo_t on Win32 (which was previously typedef'd to int) so that it has the following structure: struct siginfo_t { siginfo_t (ACE_HANDLE handle); ACE_HANDLE si_handle_; // Win32 HANDLE that has become signaled. }; Then, I've changed the ACE_ReactorEx::handle_events() method to look like this: // Assign the ``signaled'' HANDLE so that callers can get // it. siginfo_t sig (relative_handles[relative_index]); if (relative_handlers[relative_index]->handle_signal (0, &sig) == -1) Thus, you can refer to the signaled handle as si_handle_ within the handle_signal() call back. Thanks to Matthias Kerkhoff for suggesting this. * ace/System_Time.h: Made ACE_System_Time::get_local_time() a static member function. Thanks to Matthias Kerkhoff for suggesting this. * ace/Message_Queue.h: The internal variables for counting the bytes stored in the queue were declared as of type int (in Message_Queue.h). But they are set (e.g. with ACE_Message_Queue::ACE_Message_Queue) with values of size_t. When running tests/Priority_Buffer_Test, the high_water_mark_ is preset with the value LONG_MAX. While assigning this value from size_t to int, this becomes -1 and the queue is always believed to be full :-( The fix is to change the internal data structures in Message_Queue.h from int to size_t. Thanks to Thilo Kielmann for reporting this. * tests: Fixed problems with the following three tests: Priority_Buffer_Test.cpp Reader_Writer_Test.cpp UPIPE_SAP_Test.cpp When these are compiled with gcc on Digital UNIX 4.0a the static ACE_Thread_Manager thr_mgr; was never getting initialized due to gcc compiler bugs. The fix is to replace the static thread manager with the ACE_Service_Config::thr_mgr() singleton. Thanks to Thilo Kielmann for reporting this. Tue Nov 12 19:43:12 1996 Douglas C. Schmidt * ace/Thread_Manager.cpp (spawn_n): Was missing a 0 after ?. Thanks to Thilo Kielmann for reporting this. * ace/Log_Msg.h: Created a new macro call ACE_ERROR_BREAK(X) { ACE_ERROR(X); break;} for use within switch and loop statements. Thanks to Luca for this idea. * ace/Pipe.cpp: Enabled the "reuse addr" flag for accepting and connecting the Win32 version of ACE_Pipe. Thanks to Luca for reporting this problem. * ace/OS.i (thr_join): ACE_Thread::join () has a default second parameter (the status) set to 0. This is not handled in ACE_OS::thr_join(). To avoid getting a system error in NT we handle this as we did with ACE_OS::thr_create() and the thr_handle parameter. * ace/config-irix6.2-sgic++.h: Updated the set of patches required for IRIX 6.2. Thanks to Amos Shapira for reporting this. Sun Nov 10 15:40:17 1996 Tim H. Harrison * ace/Token_Invariants.cpp: Moved static data declarations out of ACE_Token_Invariant_Manager::instance and into the header file. This is supposed to help with a g++ problem on VxWorks. Sun Nov 10 13:22:03 1996 Douglas C. Schmidt * ace/Pipe.cpp (open): Set the loopback socket into TCP_NODELAY mode so that we don't block for 200 ms... Thanks to Luca Priorelli . * ace/Thread_Manager: Created a new version of spawn_n() that gives parameters for stack, stack_size, and also for the assigned ACE_hthread_t's. Thanks to Thilo Kielmann for suggesting this. Sun Nov 10 13:56:38 1996 Prashant Jain * tests/Reactors_Test.cpp (main): Fixed the test so that the output of the test goes to a log file instead of STDOUT. Sat Nov 9 11:23:13 1996 Douglas C. Schmidt * ace/Synch.i: Fixed a bug in ACE_Thread_Mutex_Guard. The call: this->owner_ == block ? this->lock_.acquire () : this->lock_.tryacquire (); should be this->owner_ = block ? this->lock_.acquire () : this->lock_.tryacquire (); Thanks to Alexander Smundak for reporting this. Sat Nov 9 01:44:15 1996 Irfan Pyarali * ace/Message_Queue: Added forward and reverse iterators to Message_Queue. Also, added typedefs to Message_Queue for ITERATOR, and REVERSE_ITERATOR. This makes the Queue like an STL collection and also makes it easier to use since you don't have to define types for the iterators. Please see test/Message_Queue_Test.cpp for an example. * ace/Map_Manager: Added reverse iterator to Map_Manager. Also, added typedefs to Map_Manager for ENTRY, ITERATOR, and REVERSE_ITERATOR. This makes the Map more like an STL collection and also makes it easier to use since you don't have to define types for the iterators and the entry. Please see test/Map_Manager_Test.cpp for an example. Note that the new typedefs does not break existing code. Fri Nov 8 20:04:26 1996 Douglas C. Schmidt * ace/Malloc.h: Fixed a typo on line 176 that reads: #include "ace/Sync_T.h" It should read: #include "ace/Synch_T.h" Thanks to Todd Barkalow for reporting this. Wed Nov 6 00:38:02 1996 Douglas C. Schmidt * ace/Pipe: Added the const qualifier to the following methods: ACE_HANDLE ACE_Pipe::read_handle (void) const; ACE_HANDLE ACE_Pipe::write_handle (void) const; Thanks to Luca for reporting this. * ace/config-win32-msvc4.0.h: Redefined ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES since it looks like MSVC++ 4.0 still doesn't work. Maybe this is fixed in 4.2? Tue Nov 5 03:09:44 1996 Douglas C. Schmidt * ace/Strategies.cpp: I'd forgotten to update one of the accept(*svc_handler) calls to use the new accept(svc_handler->peer()) syntax. * netsvcs/lib/Server_Logging_Handler.cpp: Added a cast to (COUNTER) 0 when initializing ::request_count_ to avoid problems on Win32. Thanks to Luca for pointing this out. * ace/Thread_Manager: Added a new thr_self() method that return the unique ID of the thread. This is not strictly necessary (because a thread can always just call ). However, we put it here to be complete. Thanks to Hamutal Yanay for suggesting this. * ace/OS.cpp (thr_create): I was accidentally closing down ::CloseHandle (thr_handle) (where thr_handle is a HANDLE *) when I should have been doing a ::CloseHandle (handle) instead. Thanks to Luca for finding this! Tue Nov 5 14:26:32 1996 David Levine * include/makeinclude/wrapper_macros.GNU: Changed LINK.{c,cc} commands to use LD instead of CXX. Changed all platform macros files (except for g++ on VxWorks) to correspond. * tests/run_tests.sh: changed -e test to -f for portability and reordered tests. Thanks to Michael Michael Rueger for originally creating run_tests.sh, and for maintaining it, and to Alan Stewart for suggesting fixes/enhancements. * tests/Time_Service_Test.cpp and Tokens_Test.cpp: changed to return 0 on success instead of 42 Fri Nov 1 03:53:39 1996 Irfan Pyarali * STL: Added STL files to $WRAPPER_ROOT/STL. This code is a modified version (changes for VC++ compiler) of the publicly available implementation of STL from HP. Currently, ACE_Registry uses these STL classes. Fri Nov 1 00:25:01 1996 Douglas C. Schmidt * ace/CORBA_Handler.cpp (process_events): There was a very subtle race condition in the ACE_MT_CORBA_Handler. process_events() accessed the singleton directly without taking the mutex. At startup the process_event thread is kicked off from the constructor and the instance_ is set. Hence the race. The solution is to attempt to take the mutex before accessing the instance. Thanks to David Artus for reporting the problem and providing the fix. * ace/Log_Msg.cpp (log): Improved the performance of the Log_Msg mechanism by not doing any parsing of the format string if the user has disabled this priority. * ace/Reactor.cpp: Added a chance for the open() method of the Notification_Pipe failing. Thanks to Luca for pointing this out. * ace/Reactor.cpp (handle_events): Added a change to the semantics of the ACE_Reactor so that it doesn't fall out of the event loop when signals arrive that it handles. Thanks to Stuart Powell for this fix. * ace/Service_Repository.cpp (remove): Fixed a bug with Service_Record::remove() that was failing if there were only two records and we are removing the first one. Thanks to Alex Villazon for reporting this. * ace: Recompiled everything on Solaris with G++ and CC and it seems to work fine. * ace/Module: Replaced the use of char * with const char * for assigning the Module a name. * ace: Split the Task.{cpp,i.h} file into Task_T.{cpp,i,h} in order to factor out the new non-template ACE_Task_Base and ACE_Task_Exit classes. This is required for GCC-based compilers that include the *.cpp files... Thu Oct 31 00:36:38 1996 Douglas C. Schmidt * ace/Malloc_T.h: Made the destructor of ACE_Allocator_Adapter virtual. * ace/Thread: Reorganized the ACE_Thread so that the ACE_HAS_THREADS #ifdef is no longer required... * ace/Strategies.h: Changed all the destructors to be virtual so that G++ will stop complaining... * ace/Thread_Manager: Reorganized the ACE_Thread_Manager so that the ACE_HAS_THREADS #ifdef is no longer required... * ace/config-win32-msvc4.0.h: Added Dieter Quehl's great hack to get ACE to compile correctly on Win32 with MFC! * ace/Task: I've rearranged the implementation of ACE_Task<> in the following way: 1. Defined a non-template class ACE_Task_Base from which the ACE_Task<...> inherits (instead of inheriting from Ace_Service_Object, which ACE_Task_Base now inherits from. 2. Move all methods that don't depend on the or modifers from the ACE_Task template to ACE_Task_Base. There are two motivations for making this change: 1. It reduces ``template bloat'' by factoring out common code that can be shared between ACE_Task and ACE_Task. 2. It makes it possible for the Thread_Manager to use ACE_Task_Base *'s for managing groups of ACE_Tasks in a fully polymorphic manner. Note that the new changes don't break any existing code that uses ACE_Task. Thanks to Hamutal Yanay and Ari Erev's for suggesting these changes. * ace/Thread_Manager: Changed the use of ACE_Task to ACE_Service_Object because this avoids nasty problems with template type conflicts. The right solution is probably to create a new non-template base class for ACE_Task called ACE_Task_Base and move all the ACE_Task operations into there that don't involve the Message_Queue directly. I'll need to think more about this... * ace/SOCK_Stream: Added new timed send_n() and recv_n() methods, which use the underlying timed ACE::send() and ACE::recv() calls. * ace/ACE.cpp: Added new timed send_n() and recv_n() methods, which use the underlying timed ACE::send() and ACE::recv() calls. Wed Oct 30 00:27:21 1996 Douglas C. Schmidt * ace/OS.h: Changed MAXHOSTNAMELEN on Win32 from (MAX_COMPUTERNAME_LENGTH+1) (which is around 16 or so) to 256. Thanks to Tilo Christ for this suggestion. * ace: Made #define STRICT a compile time option if the ACE_HAS_STRICT flag is enabled. This prevents ACE from breaking existing application (i.e., non-ACE) code. Thanks to Karlheinz for pointing this out! * ace/Synch_T.cpp: Fixed a typo in ACE_Condition::wait (void). return ACE_OS::cond_wait (&this->cond_, this->mutex_.lock_); should read return ACE_OS::cond_wait (&this->cond_, &this->mutex_.lock_); Thanks to Dieter Quehl for reporting this! * ace/Svc_Handler.h: Removed the operator ACE_PEER_STREAM &() from the ACE_Svc_Handler class since we don't need it anymore due to the changes below. * ace/{Acceptor,Connector}.cpp: Removed the use of operator ACE_PEER_STREAM &() in the Acceptor::accept() and Connector::connect() code and replaced it with svc_handler->peer(). This works much better and is more intuitive. Wed Oct 30 00:30:00 1996 Irfan Pyarali * Registry: Added a Name Service implementation to ACE based on Win32 Registry. The ACE_Registry interface is inspired by the interface specified in the CORBA Naming Service Specification. The implementation is done through Win32 Reg*() functions. Other than providing an OO wrapper for the Win32 Reg*() functions, ACE_Registry provides an abstraction for iteration over the elements of the Registry. This only works on Win32 platforms (unless you are brave enough to reimplement the Win32 Registry API on UNIX and link it in underneath ACE!). * ace/Local_Name_Space_T.cpp: Moved SEH out of methods of Name_Space_Map to the methods of Local_Name_Space. Some of the calls to Local_Name_Space methods used the allocator to either malloc or find or free shared memory. Adding SEH to these methods ensured that any exception raised due to remapping would be caught and handled appropriately. Also, to fool the stupid MFC compiler, we added _i methods so that it stopped bitching about destructors not getting called correctly. * Added three new tests to /examples/Naming. Thanks to Lothar for providing these tests. Tue Oct 29 18:10:09 1996 Douglas C. Schmidt * ace/ACE.cpp (send): Integrated a new and simpler version of timed ACE::send(). Thanks to Vital Aza for coming up with this. * ace/XtReactor.cpp: When the ACE_Reactor is constructed it creates the notify pipe and registers it with the attach() method. The XtReactor overloads this method BUT because the attach occurs when constructing the base class ACE_Reactor, the ACE_Reactor attach() is called not the XtReactor attach(). This means that the notify pipe is registered with the ACE_Reactor event handling code not the XtReactor and so notfications don't work. To get around this we simply close and re-opened the notification handler in the constructor of the XtReactor. Thanks to Rodney Skinner for this fix. * ace/XtReactor.cpp (schedule_timer): The ACE_Reactor returns a timer_id from it's equivalent call but the XtReactor always returns 0. To fix this we simply replaced the "return 0;" in the function with "return result;" Thanks to Rodney Skinner for reporting this. Tue Oct 29 00:02:44 1996 Douglas C. Schmidt * ace/config-win32-msvc4.0.h: Defined the STRICT symbol based on a suggestion from Luca. STRICT type checking in WINDOWS.H enhances type safety for Windows programs by using distinct types to represent all the different HANDLES in Windows. So for example, STRICT prevents you from mistakenly passing an HPEN to a routine expecting an HBITMAP. Note that if you have STRICT type checking enabled in one file, but not in another, the C++ compiler will generate different external link symbols for a single function. This will result in link-time errors If you are mixing STRICT and non-STRICT code, you must be aware of linkage inconsistencies. In general, all MFC programming and all C++ should be done with STRICT. If you have legacy C code, then not using STRICT is acceptable * ace/OS.cpp (thr_create): Added a special check for the situation where we have both ACE_HAS_PTHREADS and ACE_HAS_STHREADS defined. In this case, we are running on Solaris, where ACE_thread_t and ACE_hthread_t are the same. Therefore, we can copy the value of the *thr_id into the *thr_handle. This ensures that the ACE_Thread_Manager behaves correctly with respect to suspending and resuming threads and ACE_Tasks. * ace/Trace.cpp (ACE_Trace): Changed the use of LM_DEBUG to LM_TRACE in the constructor and destructor. Thanks to Luca for this! * ace/OS.i: Added a cast to of (HMODULE) handle so that the STRICT macro would work correctly for Win32. Thanks to Luca for this. * ace/config-win32-msvc4.0.h: According to Luca, ACE compiles file with ACE_LACKS_STATIC_DATA_MEMBER_TEMPLATES undefined on NT. So I undefined it! If there are any problems with this, please let me know. * ace/SOCK_Dgram: Added Luca Priorelli implementation of recv() for SOCK Dgrams that allows clients to read from a socket without having to provide a buffer to read. * examples/Threads/test_task_four.cpp: This is a new test program to test the new interfaces. Thanks to Hamutal Yanay & Ari Erev for this. * tests/test_config.h: Added a call to the new ACE_OS::mkdir() wrapper to create the log directory if one doesn't already exist. This should solve some nasty problems with NT reported by Tilo Christ . * ace/OS.h: Added a new macro ACE_DEFAULT_DIR_PERMS and changed the spelling of the existing ACE_DEFAULT_PERMS to ACE_DEFAULT_FILE_PERMS, which is more accurate. Mon Oct 28 21:35:12 1996 Douglas C. Schmidt * ace/OS.h: Added a wrapper for the mkdir() system call. We need it for some of the tests. * ace/Task: Changed the name of ACE_Task_Exit<>::set_this() to ACE_Task_Exit<>::set_task(). Thanks to Hamutal Yanay & Ari Erev for suggesting this. * ace/{Task,Thread_Manager}: Integrated Hamutal Yanay & Ari Erev's enhancements to add ACE_Task support to the ACE_Thread_Manager. This allows the ACE_Thread_Manager to know about ACE_Tasks directly, rather than knowing indirectly via their lower-level thread IDs. The changes are described below: - Added a parameter to the activate() method. It is used to pass an ACE_Task* to spawn_n(). - Modified suspend() and resume() to call thrMgr->suspend_task() and thrMgr->resume_task() instead of thrMgr->suspend_grp() and thrMgr->resume_grp(). - Added an ACE_Task * parameter to spawn_n(). - Added an ACE_Task * parameter to append_thr(). - append_thr() uses the ACE_Task * input parameter to initialize the thread descriptor. - Added the following methods: apply_task() suspend_task() resume_task() kill_task() resume_task() cancel_task() find_task() num_tasks_in_group() num_threads_in_tasks() task_list() thread_list() hthread_list() set_grp() Like the current set_grp() but gets an ACE_Task * as input. get_grp() Like the current set_grp() but outputs an ACE_Task *. wait_task() wait_group() Sun Oct 27 11:25:00 1996 Douglas C. Schmidt * ace/OS: modified the ACE_OSCALL_RETURN macro so that we'll no longer have zillions of warnings about _result not used... * ace/Synch_T: Changed the use of ACE_Mutex for ACE_TSS to ACE_Thread_Mutex. * ace: Added the necessary template specializations to get ACE compiled correctly with G++. * ace/Log_Msg.h: There were some places in the ACE_{DEBUG,ERROR} macros that should have been using __ace_error but there still using errno (which is wrong since this might be changed due to side-effects of calling ACE_Log_Msg::instance()). I found this problem due to the use of -Wall with G++! As a result of this fix, ACE now compiles much more cleanly with gcc -Wall. * ace/Strategy: Improved the scheme used to define the PEER_ADDR type of the ACE_Accept_Strategy so that it will work correctly on platforms whose C++ compilers aren't quite up to handling all variants of template typedefs. In particular, many platforms don't support the use of template typedefs in parameter names... * ace/OS: HP/UX omitted the const in the prototype of const_timewait(). Therefore, I added a new typedef to handle this and updated all the HP/UX config*.h files. * ace: Added a new config file (config-sunos5.5-sunc++-4.1.h) which reflects the fact that SunC++ 4.1 fixes template bugs that prevented earlier versions from supporting template typedefs correctly. The new config file #defines ACE_HAS_TEMPLATE_TYPEDEFS. Sat Oct 26 02:22:25 1996 Douglas C. Schmidt * ace: On the advice of David Levine, I compiled ACE with gcc -Wall and started to fix lots of minor warnings (e.g., misordered data member initializations). * ace/Local_Tokens.h: Changed the destructors of ACE_Mutex_Token, ACE_RW_Token, ACE_Token_Proxy, and ACE_RW_Token to be virtual. * ace/Synch_T.h: Changed the destructor of ACE_TSS to be virtual. * ace/OS: Changed the prototype of ACE_OS::select() so that it uses const ACE_Time_Value *. * Updated all uses of ACE_Malloc to use the new ACE_*_MEMORY_POOL #defines. This makes it possible to use the ACE_Malloc<> scheme with lame C++ compilers. * ace/ACE: Changed the interface of the new timed send/recv calls to use ACE_Time_Value *, which makes it easier to determine the blocking semantics at runtime. Thanks to Bill Fulton for suggesting this. Sat Oct 26 15:55:02 1996 Irfan Pyarali * ace/OS.h: We determined that MSVC++ is capable of supporting template typedefs. Therefore, we can enable the ACE_HAS_TEMPLATE_TYPEDEFS flag, which makes life much easier for end users! Fri Oct 25 23:16:16 1996 Irfan Pyarali * examples/Shared_Malloc/test_multiple_mallocs.cpp: Added a new test that demonstrates the new ability of ACE_Malloc<> to to handle multiple mallocs rooted at different base addresses. * ace/Memory_Pool: Fixed this stuff so that it works even when C++ compilers can't grok template typedefs. * ace: Put all the macros that handle the fact that many C++ compilers have broken template implementations into one place (OS.h), rather than having this spread out in many files. * In ACE_MMAP_Memory_Pool::init_acquire (), we reset errno to 0 in the case where the file already exists (and errno == EEXIST). * Added an ACE_*_Memory_Pool_Options class to each Memory Pool class. The Options class allows detailed parameters to be passed to the constructor of the Memory Pool class. Since a typedef'd Options class was added to every Memory Pool class, this gave us the ability to use traits in ACE_Malloc and ACE_Allocator_Adapter to construct generic Memory Pools that can be initialized uniquely for each instance of ACE_Malloc. Note that this new feature only works for C++ compilers that support template typedefs correctly (e.g., MSVC++ 4.x, SunC++ 4.1, and the AIX C++ compiler). * Added additional constructors to ACE_Malloc and ACE_Allocator_Adapter to allow Options to be passed in to Memory Pool. * Added an extra field in ACE_Name_Options which allows specification of the base address of the memory pool. This is now used by ACE_Local_Name_Space::create_manager() to create an ACE_Allocator_Adapter. This now allows us to have multiple ACE_Naming_Context simultaneously in the same process address space. * Also added error checking for constructors (in ACE_Local_Name_Space and ACE_Malloc) by checking errno values. This is a "hack" since we currently do not use exception handling. Thu Oct 24 02:43:11 1996 Douglas C. Schmidt * examples/Connection/misc/Makefile: The Makefile in ACE_wrappers/examples/Connection/misc seems to have been truncated. I replaced it. Thanks to Alan Stewart for reporting this. * examples/IPC_SAP/SOCK_SAP/CPP-{inclient,inserver}.cpp: Updated these examples to use the new timed send()/recv() operations. * ace/SOCK_IO: Added timed send()/recv() methods, using the base level implementations in class ACE. * ace/ACE: Added timed send()/recv() methods. Wed Oct 23 19:56:45 1996 Douglas C. Schmidt * examples/IPC_SAP/SOCK_SAP/CPP-inclient.cpp (main): Changed the behavior of the test program so that it doesn't take a local_addr, but rather will use the default (this prevents a common problem that happens when users run the test without reading the README file). * ace/ACE.cpp: Added a new method (get_flags) that returns the current setting of flags associated with handle. * Start of a brave new world: ACE is now under CVS version control... Thanks to David Levine and Chris Cleeland for making this happen. Sat Oct 19 12:33:56 1996 David L. Levine * added ACE threads mappings to VxWorks 5.2 tasks in OS.*. NOTE: this is _untested_ at this point, but only affects VxWorks code * changed name of first argument of ACE_OS::sigprocmask() and ACE_OS::thr_sigsetmask() from "signum" to "how" to better represent what it really is. Wed Oct 16 01:59:40 1996 Douglas C. Schmidt * ace/Log_Record.cpp (print): added Luca's suggestion for checking if host_name == 0 for the ostream version of print(), as well. * Released version of ACE 4.0.32 for testing. * ace/Synch.h: Added many small fixes for HP/UX 10.x. Thanks to Alan Stewart for providing these. * ace/OS.h: Added many new ACE_LACKS* and ACE_HAS* macros to support the MVS port. Thanks to Chuck Gehr for these. Tue Oct 15 11:56:59 1996 Douglas C. Schmidt * ace/OS.h: in a continuing effort to protect the ACE namespace, I've changed ace/OS.h around lines 127-137 so that "SYNCH" and "SYNCH_MUTEX", etc. are prefixed with "ACE_". Thanks to Alan Stewart for suggesting this. * ace/Local_Tokens.h: Removed an unnecessary parameter name that was unused. Thanks to Stuart Powell for reporting this. Tue Oct 15 17:03:37 1996 Tim H. Harrison * ace/ReactorEx.cpp (handle_events): Fixed a bug in handle_events so that the correct handlers get called when multiple handles become signaled simultaneously. Thanks to Ari Erev for pointing out this bug. I also took this opportunity to fix a bug when handlers are removed during handle_events. * examples/Reactor/ReactorEx/test_remove_handler.cpp: Added a new application that tests how the ReactorEx services simultaneous events and removes handlers. This example also illustrates the use of the new ACE_Events wrapper. Check examples/Reactor/ReactorEx/README for more details. Mon Oct 14 11:43:18 1996 Douglas C. Schmidt * tests: Added a new version of run_tests.sh, which was contributed by Michael Rueger . * examples/Logger/simple-server/Logging_Handler.cpp (handle_input) and examples/Logger/Acceptor-server/server_loggerd.cpp (handle_input): Changed from stderr to cerr to work around bugs with the C run-time libraries on Win32. Thanks to Tilo Christ for suggesting this. Mon Oct 14 11:09:42 1996 Prashant Jain * ace/Local_Name_Space_T.cpp (remap): Added processor specific stuff to remap(). The code was taken from the book "Win32 Network Programming" by Ralph Davis (p.18) and takes care of cases specific to the 80x86 processor. The code ensures that the registers are set properly when we continue execution after an exception. Sun Oct 13 21:18:38 1996 Douglas C. Schmidt * ace/Log_Record.cpp (print): Added a test to make sure that the value returned from ctime_r != 0 (e.g., if time_stamp_ == -1) in order to avoid crashes. * examples/Logger/client/logging_app.cpp (main): Moved the construction of the ACE_Log_Record log_record object into the loop so that it will be recreated each time through. If this isn't done, then we'll be continually "encoding" values into network byte order that have already been encoded and screwing things up on little-endian machines (such as Intel). Thanks to Irfan and Tilo Christ for pointing me in the right direction on this. * ace/Log_Record.cpp: Changed the default constructor so that it gives default initializations to the data members. * examples/Logger/Acceptor-server/server_loggerd.cpp (handle_input): Fixed a couple of typos where Logging_Handler::handle_input (int) should be: Logging_Handler::handle_input (ACE_HANDLE) and size_t len; should be: ssize_t len; Thanks to Irfan for finding these. Sat Oct 12 08:48:23 1996 Douglas C. Schmidt * Released a beta version of ACE 4.0.32 for testing. * ace/Log_Record.cpp: rewrote the code a bit to try and avoid problems on NT when host_name == 0. * ace/Log_Record.cpp: Changed the use of ACE_OS::ctime() to ACE_OS::ctime_r() to avoid problems that might arise when ACE_Log_Record::print() is called from multiple threads. * ace/Log_Record.cpp: Commented out calls to ACE_TRACE to avoid weird problems with circular dependencies. Thanks to Luca Priorelli for suggesting this. * build/SunOS5.5/examples/Makefile: Added the Logger directory to the list of targets that are build automatically by Make. Fri Oct 11 17:13:03 1996 Douglas C. Schmidt * ace: Fixed lots of small warnings revealed when using the Greenhills compiler on VxWorks. Thanks to David Levine for this. * ace/Pipe.h: In Pipe.h, the return value of ACE_Pipe::close() isn't explicitly declared, so some compilers gag. Thanks to David Levine for this. Thu Oct 10 12:05:55 1996 Douglas C. Schmidt * ace/Thread.cpp: Correctly wrapped the methods in the *.cpp file so that they are ignored if threads *aren't* supported. * ace/Service_Repository.cpp (remove): Added the ACE_MT in front of all the ACE_GUARD* macros that utilize ACE_Thread* locks in order to ensure that ACE compiles correctly on all non-MT platforms. * examples/Shared_Malloc/Malloc.cpp: Removed the special purpose class for PROCESS_MUTEX since ACE_Process_Mutex will now work for non-MT platforms. * examples/Misc/test_dump.cpp: Changed all occurrences of cerr << "string " << this << endl; to cerr << "string " << (u_long) this << endl; to work around problems with IRIX 5.3. Thanks to Tilo Christ for reporting this. * ace/config-linux.h: Added a // in front of a stray comment line. Thanks to Neil Cohen for pointing this out. * ace/config-hpux-10.x-g++.h: Added a new config file for HP/UX 10.x which should fix some problems with templates by using the G++ compiler. Thanks to for contributing this. Wed Oct 9 14:34:19 1996 Douglas C. Schmidt * ace/OS: Changed the logic of socket initialization, which has been moved out of ACE_SOCK and into ACE_OS. This makes it possible to program more fully at the ACE_OS API (if such a crazy thing is really necessary ;-)). * examples/IPC_SAP/SOCK_SAP/C-in{client,server}.cpp: Fixed up the client and server apps so they will work on NT (i.e., replaced the use of int with ACE_HANDLE). Thanks to Joe DeAngelis for suggesting this. * ace/Synch.h: Now that we've got support for POSIX semaphores on Solaris, then we'll use them (when they are supported...) as the implementation of ACE_Process_Semaphore rather than using the slower ACE_SV_Semaphore_Complex stuff... * ace/OS.{h,i}: Added David Levine's support for named POSIX semaphores. If ACE_HAS_POSIX_SEM is defined, then ACE_Semaphore will construct a named POSIX semaphore if passed a non-null name, or an unamed POSIX semaphore if passed a null name. This is a great addition because POSIX semaphores are more powerful and useful than the Solaris UI semaphores. Unfortunately, Solaris 2.5 doesn't support them (yet). Tue Oct 8 16:00:00 1996 Irfan Pyarali * ace/OS: Integrated Irfan's encapsulation/emulation for Win32 Events at the ACE_OS level. A new structure ACE_event_t was created to support Events on non-WIN32 platforms. On WIN32 platforms ACE_event_t is just a HANDLE. On non-WIN32 platforms, ACE_event_t uses a combination of mutexes, condition variables, and counters to emulate Events. Both auto-reset and manual-reset events are supported. * ace/Synch: Integrated Irfan's encapsulation/emulation for Win32 Events at the C++ wrappers level. There are three wrappers that were created: ACE_Event, ACE_Auto_Event, and ACE_Manual_Event. ACE_Event is a wrapper for the ACE_event_t structure. It provides functionality for signal, wait, pulse, and reset on an event. ACE_Event supports both auto-reset and manual-reset events. However, specializations of ACE_Event were created (ACE_Manual_Event and ACE_Auto_Event) to make it easier to use Events. * examples/Threads/test_manual_event.cpp: A test for manual-reset events. The test involves the creation and use of a barrier which uses an ACE_Manual_Event. * examples/Threads/test_auto_event.cpp: A test for auto-reset events. The test involves the use of an ACE_Auto_Event for signaling threads. Tue Oct 8 15:45:01 1996 Douglas C. Schmidt * ace/DEV.cpp (ACE_DEV): Removed a stray call to ACE_IO_SAP::dump(). Thanks to Brad Flood for this fix. * ace/OS.i: Added ACE_HAS_CHARPTR_SOCKOPT for VxWorks. Thanks to David Levine for this. * ace/Dump.cpp (instance): Added an ACE_MT() macro around the ACE_GUARD_RETURN macro so that this will compile correctly on non-threaded platforms. Thanks to David Levine for this. * ace/OS.h: the declaration of ACE_OS::msgctl needs "struct msqid_ds" instead of just "msqid_ds" to compile with the Greenhills C++ compiler. Thanks to David Levine for this... * ace/Local_Name_Space_T.h: Added #include "ace/Local_Name_Space.h" to avoid a problem during template generation. Thanks to Chris Lahey for this fix. * ace/OS.i (getprotobynumber_r): Added a pair of fixes from Chris Lahey to get the ACE wrappers for the getprotoby*_r() methods to compile on AIX. * examples/Threads: Added two new examples (test_auto_event.cpp and test_manual_event.cpp) that exercise the new ACE_Event mechanisms. * ace/Synch: Integrated Irfan's encapsulation/emulation for Win32 Events at the C++ wrappers level. * ace/OS: Integrated Irfan's encapsulation/emulation for Win32 Events at the ACE_OS level. Fri Oct 4 08:32:47 1996 Douglas C. Schmidt * ace/OS.i: Added David Levine's new ACE_OS::mktemp() implementation. Wed Oct 2 13:26:20 1996 Douglas C. Schmidt * ace/SV_Message_Queue.i: Changed the casts of (msgbuf *) to (void *). * ace/OS.i: Added David Levine's implementation of inet_addr() for VxWorks. * ace/OS.i: Continued to merge together various parts of Win32 and UNIX to reduce redundancies. Tue Oct 1 15:03:42 1996 Douglas C. Schmidt * ace/OS.i: Added Chuck Gehr's new changes to ACE_OS::mutex_init() and ACE_OS::cond_init() to handle the MVS Pthreads madness. * ace/OS.i: Added zillions of #ifdefs for VXWORKS. It's amazing these guys call themselves POSIX compliant -- lots of stuff is missing. Thanks to David Levine for doing this! * ace/OS.cpp: Added David Levine's implementation of mktemp() for platforms that don't support it. * ace/OS.h: Added a bunch of minor changes for VXWORKS. In addition, started to factor out common #ifdefs to make the code easier to maintain. * ace/OS.h: Added a new macro for ACE_LACKS_UTSNAME, and factored this out for both VxWorks and Win32. * ace/Time_Value.h: Added support for 2 VXWORKSisms: (1) we need to #include sys/times.h rather than the standard UNIX sys/time.h and (2) we need to change const timeval & to const struct timeval & to keep the Greenhills compiler happy. Thanks to David Levine for this. * ace/INET_Addr.cpp: Added support for the insane VXWORKS hostGetByName() function. Yikes! Thanks to David Levine for this. * ace/Memory_Pool.cpp: Added a new #define called ACE_LACKS_SBRK and ACE_LACKS_SYSV_SHMEM, which is enabled on Win32 and VxWorks. Thanks to David Levine for reporting this. * ace/OS.h: Added new macros that #define ETIME for platforms like VxWorks that don't support it, but do support ETIMEDOUT. * ace/OS.h: Added placeholder #defines for USYNC_PROCESS and USYNC_THREAD when !defined (ACE_HAS_THREADS). Thanks to Neil Cohen for reporting this. Tue Oct 1 00:42:35 1996 Douglas C. Schmidt * ace/Message_Block.cpp (size): Member base_ of ACE_Message_Block was being set to the new memory pointer before the old contents are saved in method size. So the line this->base_ = buf; was moved to a place some lines below. Thanks to Marco Sommerau for detecting this. * ace/Message_Queue.cpp: Changed the implementation of the enqueue_i() method so that FIFO order is maintained when messages of the same priority are inserted consecutively. Thanks to Jay Denkberg for suggesting this. Mon Sep 30 22:59:38 1996 Douglas C. Schmidt * ace/OS.i (thr_yield): Added a new macro ACE_HAS_YIELD_VOID_PTR to make pthread_yield work on MVS. Thanks to Chuck Gehr for this fix. * ace/OS: Added a new macro called ACE_HAS_TIMEZONE_GETTIMEOFDAY that handles problems on MVS. Thanks to Chuck Gehr for this fix. Mon Sep 30 13:45:10 1996 Tim H. Harrison * ace/Local_Tokens.h: Updated some documentation in all the Token files. Mon Sep 30 18:01:12 1996 Prashant Jain * netsvcs/lib/: Renamed files Logger.{h,cpp} to Logging_Strategy.{h,cpp} to avoid confusion with Server_Logging and Client_Logging stuff. In addition, I modified the affected files, including Makefile, README, and the config files in the tests directory. Sun Sep 29 12:47:37 1996 Douglas C. Schmidt * ace/OS.h: Added Chuck Gehr fixes for MVS to enable signals to work correctly. * ace/Time_Value.h: Added an extern "C" { } block around #include to solve a problem with Linux. Thanks to Padhu Ramalingam for reporting this. * netsvcs/lib/Server_Logging_Handler.cpp: Changed the initialization of a static template object from ::request_count_ (0L) to ::request_count_ = 0L. Thanks to Gonzalo Diethelm for reporting this. * ace/Remote_Tokens.h: Moved the inclusion of "Singleton.h" from Remote_Tokens.cpp to Remote_Tokens.h. This should avoid template instantiation problems on some platforms (e.g., Irix 6.2). * ace/config-irix6.2-sgic++.h: Changed ACE_HAS_SIGINFO to ACE_HAS_SIGINFO_T and added ACE_HAS_UCONTEXT_T. Thanks to Gonzalo Diethelm for reporting this. * ace/Token_Invariants.h: The ctor/dtor were private and the compiler would not allow a template of the class to be created. I switched them to public, but I wish there was a better way... Thanks to Gonzalo Diethelm for reporting this. * ace/Synch_T.h: #include'd "ace/Event_Handler.h". Thanks to Gonzalo Diethelm for reporting this. * ace/Synch.h: The parameter name gives warnings when instantiating templates. Thanks to Gonzalo Diethelm for reporting this. * ace/Process: Changed the definition of the get_pid() method to getpid() to avoid a conflict with Irix. Thanks to Gonzalo Diethelm for reporting this. * ace/Log_Msg.cpp (log): Added another #elif !defined (ACE_WIN32) to handle logging for OS platforms that (1) aren't Win32 and (2) are versions of UNIX that don't support STREAM pipes. Thanks to Gonzalo Diethelm for reporting this. * ace/Acceptor.cpp (handle_signal): Erased the signum parameter name to avoid a nasty warning about arguments not used when instantiating templates. Thanks to Gonzalo Diethelm for reporting this. * ace/OS.h: Added the ACE_Export symbol to the definition of ACE_Str_Buf. This makes it compile and link on NT. Thanks to Prashant for noticing this (our favorite Win32ism...). * ace/Thread.h (ACE_Thread): Removed a default argument for one of the ACE_Thread::join() wrappers so this won't be ambiguous with the other join() wrapper. * ace/OS: Added a new wrapper for strtok_r(). Sun Sep 29 16:12:01 1996 Prashant Jain * netsvcs/lib/: Renamed the project file for Win32 from lib.mdp to netsvcs.mdp. Also the original project file did not include some files such as Naming_Handler.cpp and Server_Logging_Handler.cpp and I fixed that. Finally removed two files System_Time.{h,cpp} which are already present in ace/. Sat Sep 28 16:34:56 1996 Douglas C. Schmidt * ace/OS: Added a new overloaded select() method that takes a const ACE_Time_Value &. This is useful for situations where you are passing in ACE_Time_Value::zero. Fri Sep 27 16:20:46 1996 Douglas C. Schmidt * ace/ACE: Added a fix for the fact that VxWork's write() call doesn't take a const char *. * ace: Started adding support for VxWorks and GreenHills compiler, e.g., added the config-vxwork-ghs-1.8.h file. Thanks to David Levine for getting this rolling! Thu Sep 26 00:15:46 1996 Douglas C. Schmidt * ace/Timer_Queue: Changed the public interface methods to be virtual in order to make it possible to override them in subclasses. This makes it feasible to implement different types of Timers. * ace/OS: Added a wrapper for the strspn() string call. Thanks to Irfan for noticing this omission. * ace/Synch_T.cpp (wait): Changed the line: return ACE_OS::cond_wait (&this->cond_, this->mutex_); to return ACE_OS::cond_wait (&this->cond_, &this->mutex_.lock_); Thanks to Dieter Quehl for noticing this. * ace/config-sunos5.4-g++.h: Removed the #define for ACE_HAS_BROKEN_RANDR and replaced the ACE_HAS_SVR4_SIGNAL_T with ACE_HAS_CONSISTENT_SIGNAL_PROTOTYPES since it looks like the latest gcc release (2.7.2) fixes this in their own header files. Sat Sep 21 10:45:43 1996 Douglas C. Schmidt * ace/OS.h: Added a new #define called ACE_HAS_BROKEN_MSG_H to the config-osf1-3.2.h file and used it in OS.h to work around problems with prototypes on that platform. Fri Sep 20 00:15:29 1996 Douglas C. Schmidt * Released version 4.0.31 for testing. * ace/Pipe.cpp: Initialize handles_ to ACE_INVALID_HANDLE in default constructor. Thanks to Tim Harrison for pointing this out. * ace: Copied in new versions of ace.{mak,mdp} for Win32. * ace: Added TTY_IO.cpp to the Makefile. * ace/config-win32-msvc[24].0.h: Updated the config file so that it *doesn't* #define ACE_HAS_STRBUF_T since this type clearly isn't available on Win32! * ace: Modified all of OS.i and config-*.h files so that they would be consisten with respect to handling the size_t and int differences in socket implementations. Thanks to Chuck Gehr for helping with this for AIX. * ace/ACE.h (ACE): Added a new method called max_handles() that returns the maximum number of open handles currently supported by the process. * examples/Reactor/Misc/signal_tester.cpp: Revised the test to utilize the new idioms for programming with signals. * ace/OS.h: added a new #define called ACE_DEV_NULL that defaults to "/dev/null" on UNIX and "nul" on NT. Thanks to David Trumble for reporting this fix. * ace/Log_Msg.cpp: Added some checks to make sure that we don't try to strdup() if we are passed a NULL pointer. Thanks to Luca for suggesting this. * ace/OS: Move ACE_Str_Buf into OS.{h,i} and remove the Str_Buf.h file. * Makefile: Added the "performance-tests" directory to the list of directories we build when making ACE. * ace: Moved the definition of strbuf from Str_Buf.h into OS.h. Thanks to Irfan for recommending this. * ace/Makefile: Added some additional sed magic on the Svc_Conf_y.cpp file in order to remove the very last warnings from MSVC++! Thu Sep 19 00:00:17 1996 Douglas C. Schmidt * ace/Service_Config.cpp (open): Only initialize the logger to use STDERR if the user hasn't already set the ACE_Log_Msg::flags(). Thanks to Tom Leith for suggesting this. * ace/OS: Removed all traces of the ACE_HAS_INT_SOCKNAME and ACE_HAS_LENPTR_SOCKOPT since Chris Lahey's new fixes for AIX obviate the need for these. * ace/OS.i: Only #include if the platform has RPC! Thanks to Chuck Gehr for suggesting this. * ace: Removed all uses of ACE_HAS_SETOWN and replaced them with explicit tests for F_SETOWN and FASYNC. This is more portable. Thanks to Chuck Gehr for suggesting this. * ace/OS: Added a new #define called ACE_HAS_SIZET_SOCKET_LEN to handle platforms where the length parameter of bind(), connect(), accept(), etc. uses size_t rather than int. This helps to get ACE working on MVS. Thanks to Chuck Gehr for suggesting this. * ace/OS: Added Chris Lahey's fixes that make the getprotoby{name,number}_r() functions work for AIX. * ace: Changed the ACE_HAS_STRUCT_HOSTENT_DATA to ACE_HAS_STRUCT_NETDB_DATA because we use a single symbol to refer to all of the odd netdb.h stuff that AIX has... * ace: Changed all uses of: iovec *iovp = (iovec *) alloca (total_tuples * sizeof *iovp); to iovec *iovp = (iovec *) alloca (total_tuples * sizeof (iovec)); to keep the AIX compiler from complaining (falsely) about using iovp before it is initialized. Thanks to Chris Lahey for reporting this. * ace/OS.h: Added Chris Lahey's changes that handle AIX's _XOPEN_EXTENDED_SOURCE features without polluting all the socket implementations! * ace/Thread.cpp (spawn_n): Removed an unreferenced local variable so that the Win32 compiler doesn't complain. * ace/OS.h: Added the definition for strbuf{} for NT. * ace: Removed the msg_hack.h file since it had OSF and DEC copyright info in it. Replaced this with Antonio Tortorici's clever use of _KERNEL and the new ACE_LACKS_SYSV_MSQ_PROTOS. * ace/INET_Addr.h: Updated the documentation to indicate more clearly the use of getservbyname(). * ace/OS.cpp (thr_create): Added basic hooks to support the use of AfxBeginThread on Win32. This is necessary to allow ACE to work seemlessly with MFC applications. Added an THR_USE_AFX flag that can be "or'd" in with the other thread flags in calls to ACE_OS::thr_create(). If this flag is enabled *and* if we are compiling with ACE_HAS_MFC enabled, then AfxBeginThread() is called rather than _beginthreadex(). * ace/INET_Addr.h (set): Fixed a typo in the documentation for set() (the order of "host:port" was backwards...). Thanks to Brad Flood for reporting this. Wed Sep 18 00:36:01 1996 Douglas C. Schmidt * ace/SOCK_IO.cpp: Added a new recv() method that allows a client to read from a socket without having to provide a buffer to read. This method determines how much data is in the socket, allocates a buffer of this size, reads in the data, and returns the number of bytes read. The caller is responsible for deleting the memory. Thanks to Luca Priorelli for suggesting this. * ace/OS.h: Added a special #ifdef for IRIX 6.2 threads so that THR_BOUND and THR_SCOPE_SYSTEM are different. Thanks to Gonzalo Diethelm for reporting this. * ace/Message_Block.i (msg_class): Added a new "class" of messages to ACE_Message_Block: MB_USER. This is useful for writing extensible applications a la Microslush Windows MSG stuff... Tue Sep 17 16:38:44 1996 Douglas C. Schmidt * ace/Message_Block: Changed the signature of the ACE_Message_Block constructors (and init()) so that they take const char * rather than char *. In addition, changed the definition of one of the constructors (and init()) so that it takes a size field in addition to the buffer. * ace/Message_Block.cpp (size): Fixed a bug in the ACE_Message_Block::size() method -- we were failing to deal with allocators and ownership correctly during a resize. Thanks to Amos Shapira for reporting this. * ace/Naming_Context.cpp: Removed the source of yet another warning about "inconsistent dll linkage. dllexport assumed." * ace/Mem_Map.cpp (map_it): Added a cast to size_t (file_len) because by this time we know that file_len >= 0. This avoids yet another warning on WinNT! * ace/Reactor.h: Fixed the remaining warnings about "signed/unsigned mismatch" in Win32 by changing the type of cur_size_ from size_t to ssize_t. * ace/Log_Msg.cpp: Modified the code so that on NT we use ACE_SPIPE_Msg rather than ACE_FIFO_Send_Msg. Thanks to Luca Priorelli for suggesting this. * ace/OS.i: Implemented the and put[p]msg() wrappers by being smart about allocating and copying data. * ace/TTY_IO.cpp (control): There was one too many end parentheses on line 192 of TTY_IO.cpp. Thanks to Dave Trumble for reporting this fix. * ace/Log_Msg.cpp (local_host): Fixed the use of program_name_ and local_host_ so that they strdup() the values passed by the users, rather than copying pointers. This avoids problems if the user doesn't pass in static memory. Thanks to Luca Priorelli for reporting this. Somehow this change got lost and I've reapplied it... * ace/Log_Record.cpp (round_up): Added an extra + 1 to the length since otherwise the final '\0' gets lots if len is a multiple of 8. Thanks to Luca Priorelli for reporting this. Somehow this change got lost and I've reapplied it. * ace/Memory_Pool.h: removed #if defined (ACE_HAS_SIGINFO_T) logic from both handle_signal() definitions (ACE_Shared_Memory_Pool and ACE_MMAP_Memory_Pool). Thanks to Chris Lahey for fixing this. * ace/OS.h: Moved the define of SA_RESTART below the #include for signal.h. Otherwise SA_RESTART will always be defined by OS.h, since SA_RESTART is defined on AIX in signal.h. Thanks to Chris Lahey for fixing this. * ace/OS.h: Added some new #pragmas to suppress harmless warnings for the MSVC++ compiler. Tue Sep 17 13:20:53 1996 Prashant Jain * ace/Local_Name_Space_T.cpp: Modified ACE_Local_Name_Space:: create_manager () so that all three naming scopes use the database variable defined in Name Options. This allows us to specify different names for databases for all three naming contexts. However, it is imporant to note that this can lead to potential problems where, for example, a process may use the same name for PROC_LOCAL database as an already existing NET_LOCAL database. Mon Sep 16 01:31:21 1996 Douglas C. Schmidt * examples/Logger/simple-server/Logging_Handler: get_handle(), handle_input(), and handle_close() want the right types (ACE_HANDLE instead of int). Thanks to Luca Priorelli for reporting these. * examples/Logger/simple-server/Logging_Acceptor.cpp: Fixed a typo (Log_Mskg.h should be Log_Msg.h of course...). In addition, changed the use of -1 to ACE_INVALID_HANDLE. Thanks to Luca Priorelli for reporting these. * ace: Changed all uses of ACE_HAS_ACE_INLINED_OSCALLS to ACE_HAS_INLINED_OSCALLS. This was a vestiage of a global replace gone amok. Thanks to Alan Stweart for reporting this! * ace/Log_Msg.cpp (open): Added a check for the OSTREAM flag in the ACE logger. Thanks to Rick Orr for noticing this. * Released version 4.0.30 for testing. * netsvcs/clients/Naming/Dump_Restore/Dump_Restore.cpp (Dump_Restore): Deleted an extra "return 0;" within a constructor (duh...). * examples/Threads/test_process_{semaphore,mutex}.cpp (main): Fixed some annoying G++ compiler bug related problems. We need to use old-style C casts to prevent ambiguous parsing. * examples/ASX/Event_Server/Transceiver/transceiver: Rewrote this example to illustrate how to use the ACE_Connector and ACE_Svc_Handler. * examples/ASX/Event_Server/Transceiver/transceiver: Finally clued in and realized that it is just not suitable to implement the event server transceiver with separate threads for input and output. It is simply to non-portable to get these shut down gracefully. I think John Ousterhout was right -- threads are evil! * examples/ASX/Event_Server: Merged the Consumer/Supplier directories into a single Transceiver directory to reflect the fact that the Consumer and Supplier were completely symmetrical! * ace/Module.cpp (close): Don't delete the Tasks in a Module if there are still threads running in them. Otherwise we'll end up with a big mess. Mon Sep 16 15:50:45 1996 Prashant Jain * performance-tests/Misc/test_naming.cpp: Added a new test to the performance-tests directory called test_naming which simply does performance testing on Naming Service. The test runs both the SYNC and the NO-SYNC version of Naming Service. Mon Sep 16 15:22:52 1996 Tim H. Harrison * ace/Proactor.cpp (initiate): Added a check for ERROR_NETNAME_DELETED after ReadFile/WriteFile. Now the initiating handler is immediately dispatched for EOF *and* closed connections. Thanks to Luca Priorelli for suggesting this change. Sun Sep 15 00:55:59 1996 Douglas C. Schmidt * Fixed all uses of ACE_Service_Config::end_event_loop() and ACE_Service_Config::run_event_loop() to be ACE_Service_Config::end_reactor_event_loop() and ACE_Service_Config::run_reactor_event_loop() since we now have to consider the other event loops (e.g., Proactor and ReactorEx) and it doesn't seem right to relegate those to 2nd class status. * ace: Finally got fed up with all the #ifdefs required to deal with extended signals and just changed the ACE_Event_Handler::handle_signal() method to always use the extended signal interface. Fortunately, we can use default values to hid this from callers (though you may need to change your class definitions if you were assuming the handle_signal(int) interface. * ace/Memory_Pool.h: Changed all the methods of the various Memory_Pool classes to be virtual so that subclasses can selectively override them. This shouldn't affect performance since all existing use cases work directly with the "derived" classes themselves, so there shouldn't be any overhead since the compiler can use direct calls rather than virtual function calls. * ace/OS.cpp (thr_create): Changed the call to CreateThread() to _beginthreadex() and the call to ExitThread() to _endthreadex() for Win32 in order to make ACE threads work correctly with Win32. Thanks to James Mansion for recommending this. * ace/ACE: Added two new static functions: read_adapter() and register_stdin_handler(). These are useful when writing code that must demultiplexing ACE_STDIN on both Win32 and UNIX. This works around Win32 limitations that don't allow us to select() on non-sockets (such as ACE_STDIN). * examples/ASX/CCM_App/SC_Server.cpp: Updated this test so that it should now work correctly on Win32, where it isn't possible to select() on STDIN... * ace/Synch_T: Added a new class to ACE called "ACE_Test_and_Set." As this name implies, this class implements an atomic ``test and set'' abstraction. This has all sorts of useful implications, particularly because it is a template that can be paramaterized by the type of LOCK (e.g., ACE_Null_Mutex, ACE_Thread_Mutex, etc.) and the type of TYPE (e.g., int, double, sig_atomic_t, etc.). In addition, because this "is-a" ACE_Event_Handler it instances can be registered with the Reactor and used to shut down event hoops gracefully upon receipt of certain signals (e.g., SIGINT). In fact, I've redone many of the example applications (e.g., ./examples/Logger/server/server_loggerd.cpp) to illustrate how this works. Sun Sep 15 20:40:17 1996 Tim H. Harrison * ace/ReactorEx.cpp (notify): I've redesigned this code. Previously, ReactorEx was explicitly managing a handle that it kept in handles_[0]. handles_[0] was used to implement ReactorEx::notify, which allowed other threads to wake up the thread waiting in ReactorEx::handle_events. Now ReactorEx has an Event_Handler (ReactorEx_Notify) that is registered in the constructor of ReactorEx. This allows us to treat events from handles_[0] just like every other event (i.e. by dispatching to handles_[0]->handle_signal). One of the results of this change is that code in remove_handler() is simplified a bit. Sun Sep 15 17:56:52 1996 Prashant Jain * ace/Naming_Context.cpp: Added a new flag to the constructor and open() method of ACE_Naming_Context that allows us to specify which Memory_Pool to use when creating ACE_Local_Name_Space (that is choose between ACE_MMap_Memory_Pool and ACE_Lite_MMap_Memory_Pool). * ace/Memory_Pool.cpp: Added a new class called ACE_Lite_MMap_Memory_Pool which subclasses ACE_MMap_Memory_Pool and overrides the sync method so that it is a no-op. * ace/Local_Name_Space.cpp: Made some siginificant changes in ACE_Local_Name_Space. Here is what the problem was: ACE_Name_Space_Map (which is an ACE_Map_Manager) used an ACE_RW_Process_Mutex for synchronization. However, since the Map was kept in shared memory and was shared by all the processes, it got instantiated only by the first process which came along. Therefore, only the first process got around to creating and initializing the lock. In fixing the problem, we made some other changes to ACE_Local_Name_Space and ACE_Name_Space_Map. Both classes are now template classes. ACE_Local_Name_Space needs to be parameterized with a Memory_Pool (thus giving us a hook to implement the NO-SYNC option) as well as a LOCK. ACE_Name_Space_Map needs to be parameterized by an ALLOCATOR which is created by ACE_Local_Name_Space. Note that the reason we need to parameterize ACE_Name_Space_Map is so that we can pass an ACE_Allocator_Adapter (which subclasses from ACE_Allocator) with every method. It is not possible to pass an ACE_Allocator since the ::remap() method relies on an allocator() method defined on the ALLOCATOR that is passed in (and ACE_Allocator does not define an allocator() method). The purpose of the class ACE_Name_Space_Map still remains the same. It IS_A Map_Manager and provides the hook to set the allocator to the process specific one. However, none of its methods acquire any locks. For that reason, the Map_Manager is parameterized with the Null_Mutex. All synchronization takes place inside ACE_Local_Name_Space. ACE_Naming_Context instantiates ACE_Local_Name_Space (depending upon the scope) and by default parameterizes it with ACE_MMap_Memory_Pool and ACE_RW_Process_Mutex. Also made some more fixes to ACE_Local_Name_Space. In create_manager(), after we create the allocator, we now check to see if the backing store was created successfully and if not, we return -1. Sat Sep 14 00:00:31 1996 Douglas C. Schmidt * examples/Logger: Renamed the original server directory to "simple-server" and added a new directory called "Acceptor-server" which implements the Logger using the ACE_Acceptor. Note that almost all of the implementation code disappears! * ace/Local_Name_Server_T.cpp: Removed the name_server_map_ array and replaced it with the ACE_NAME_SERVER_MAP #define, which is now contained in OS.h. * ace/Malloc.h: Added "virtual ... = 0" to the bind() and trybind() methods of the ACE_Allocator since they should be pure virtual functions... * ace/Synch{_T}: Separated out the wait (ACE_Time_Value *) and wait (void) methods in order to optimize the call sequence for the common case when there is no timeout. * ace/Synch: Added a new wait(ACE_Thread_Mutex &) method to ACE_Condition_Thread_Mutex so that we are consistent with the templated ACE_Condition_Mutex. * include/makeinclude: Changed uses of -pic to -PIC because ACE is now creating more than 2082 symbols. It's probably time to split up the library... * ace/DEV_IO: Moved the ACE_DEV_Addr instance from ACE_DEV_IO into ACE_DEV so that it will be available for the ACE_DEV_Connector. This fixes a bug that prevented us from using the ACE_Connector in conjunction with the ACE_DEV_* classes. Thanks to Karlheinz for clarifying what had to occur. Fri Sep 13 00:16:32 1996 Douglas C. Schmidt * ace/OS.h: Changed the order of #includes so that comes before . This fixes some bugs with the Siemens SVR4 C++. Thanks to Antonio Tortorici for this fix * ace/ACE.cpp (handle_timed_complete): Added yet another weird hack to deal with the insanity that is TLI... * ace/Synch.cpp: Replaced all uses of ACE_Thread_Mutex_Guard with ACE_GUARD macros in order to avoid problems when mutexes fail. * ace/OS.h: Changed the definition of the ACE_*GUARD macros so that they are always enabled, even when we turn off ACE_MT_SAFE. This avoids a nasty semantic problem for components that use ACE_Process_Mutex. Thanks to Avraham Nash for reporting this problem. * ace/OS: Removed ACE_OS::fork_exec() since its functionality has been subsumed by ACE_Process. * ace/Thread_Manager: Added a new thread_descriptor_i() method that *doesn't* grab the lock in order to avoid deadlocks. * include/makeinclude/platform_sunos5_sunc++.GNU (CXX): had to add the -pta option so that we achieve template closure in ACE. * include/makeinclude: Added -lthread to the platform_sunos5_sunc++.GNU file. I don't know how this slipped through the cracks! * ace/{DEV_IO,FILE_IO,SOCK_IO,SPIPE_Stream}: Fixed a braino with alloca where I was failing to multiply by sizeof (iovec). Isn't C great? ... Thanks to Chuck Gehr for reporting this. * ace/SOCK_Dgram_Mcast.cpp: Added two changes to the ACE multicast code in order to get it to work on Win32. The first change is to put the IP_ADD_MEMBERSHIP setsockopt() call *after* the bind() (in shared_open()). The second is to convert the ACE_INET_Addr::get_ip_address() from host byte order into network byte order. Thanks to Todd L. Montgomery and Steve Weismuller for helping with this. * examples/Threads/test_barrier2.cpp: Incorporated Karlheinz's new ACE_Barrier test program. * ace/Synch.h: Added Karlheinz's ACE_Null_Barrier class. Fri Sep 13 00:30:50 1996 Tim H. Harrison * tests/{Tokens_Test,Time_Service_Test}.cpp: Updated tests to use ACE_Process instead of ACE_OS::fork_exec. * ace/Process.cpp: Added a new ACE_Process abstraction that is a Portable encapsulation for creating new processes. It allows assignment of STDIN, STDOUT, and STDERR of the new process. On UNIX, ACE_Process uses fork and exec. On Win32, it uses CreateProcess. Since we can set the standard handles, we can mimic UNIX pipes on Win32 by building chains of processes. This class should be used instead ACE_OS::fork_exec. * examples/OS/Process/process.cpp (main): Added new example application to show how to use ACE_Process. Thu Sep 12 00:55:25 1996 Douglas C. Schmidt * ace/DEV_IO: Added methods get_local_addr() and get_remote_addr() so that ACE_Connector will work correctly. Thanks to Brad Flood for reporting this. * ace/Thread_Manager.cpp (thr_self): Added a fix to solve the problem that Win32 GetCurrentThread() returns a pseudo-handle rather than a real handle. Now, we just look things up using the thread id rather than the thread handle. Thanks to Luca Priorelli" for clarifying this. * ace/Proactor.cpp (initiate): Fixed an incorrect set of return values -- they were reversed. Thanks to Brad Flood for reporting this. * ace/OS.i (thr_cmp): Added a check for !defined(ACE_HAS_SETKIND_NP) to avoid a problem with OSF/1. Thanks to Martin Schoeckle for reporting this. * examples/IPC_SAP/DEV_SAP: Updated these examples to use the new ACE_TTY_IO classes. * ace: Moved the TTY_IO code from the examples/IPC_SAP/DEV_SAP/{reader,writer} directories into the files TTY_IO.{h,cpp} in the main part of ACE and integrated Brad Flood's changes for Win32. * ace/DEV_IO.i: Changed the mapping of send_n() and recv_n() methods to use write_n() and read_n() respectively so they will work on NT. Thanks to Brad Flood for reporting this. * ace/Thread_Manager.h: Implemented a non-synchronized version of the lookup function for the . This version assumes that the lock is help. We need this to avoid intra-class method deadlock on systems (such as Solaris) that lack recursive mutexes. * ace/Log_Msg.cpp (ACE_Log_Msg): made sure to initialize ACE_Log_Msg::thr_handle_ to 0. I'm not sure how this got changed... Thanks to Luca Priorelli for reporting this. * examples/Reactor/ReactorEx/test_reactorEx.cpp (register_thread_exit_hook): Changed hthread_t to ACE_hthread_t. Thanks to Luca Priorelli for reporting this. * apps/Gateway/Gateway/Channel.h: Due to inconsistencies between the semantics of sockets and TLI with respect to establishing non-blocking connections it's not a good idea to use TLI in conjunction with select(). Therefore, I've #if 0'd out the use of TLI in the Gateway application. Wed Sep 11 00:25:38 1996 Douglas C. Schmidt * ace/ACE.cpp (handle_timed_complete): Fixed a typo that was failing to set n = ACE::recv(...). In addition, rethought how we figure out if a connection completes for the nth time... * ace/TLI.cpp (open): Modified the implementation of open() so that if oflag == 0 it is given an initial value of O_RDWR. Otherwise we'll get a "badflags" t_errno. * ace/Connector.h (connect): Modified connect() so that the default value of the flags parameter is O_RDWR. This is necessary to make TLI_Connector::connect() work correctly by default. * examples/Logger: Updated the example logger client and server to illustrate more clearly how things like the Singleton Reactor and the ACE_Reactor timer mechanism work. Thanks to Joe DeAngelis for suggesting this. * ace/Pipe: Added a new constructor that makes it possible to initialize the from the and handles. Thanks to Stevan Warwick (sjw@aesthetic.com) for suggesting this. * config-irix5.3-sgic++.h: Added #define for ACE_NEEDS_SYSTIME_H. Thanks to Stevan Warwick (sjw@aesthetic.com) for reporting this. * examples/Logger/server/Client_Acceptor: Fixed some stray mis-uses of int that should have been ACE_HANDLE. Thanks to Luca Priorelli" for reporting this. * ace/{ACE,Log_Msg}.cpp: Added fixes for hexdump(). Thanks to Luca Priorelli" for supplying these. * ace/Reactor.cpp (ACE_Reactor): Fixed a typo: "this->max_handlep1 ()" should be "this->handler_rep_.max_handlep1 ()". Thanks to Scott Shupe for reporting this. * apps/Orbix-Examples/Event_Comm: Added a bunch of changes to make this application compile with Orbix 2.0. Thanks to Mike O'Malley for the fixes. * ace/OS.cpp (thr_create): Added yet another fix for the IRIX 6.2 pthreads implementation. Thanks to Gonzalo Diethelm for reporting this. * ace/config-irix6.2-sgic++.h: Changed ACE_HAS_IRIX53_GETTIMEOFDAY to ACE_HAS_IRIX_GETTIMEOFDAY because this also seems to be the case for IRIX 6.2... Thanks to Gonzalo Diethelm for reporting this. * ace/TLI_{Connector,Acceptor}.cpp: Added tests against NULL pointers to avoid segmentation faults when the TLI implementation doesn't allocate memory for the udata and opt fields of netbuf structures. * ace/Mem_Map.i (ACE_Mem_Map): Added an accessor so that callers can get the name of the filename that is being used as the backing store. Thanks to the James Mansion for recommending this. Tue Sep 10 00:26:52 1996 Douglas C. Schmidt * ace/OS.cpp (thr_create): Modified the thr_create() implementation for Win32 so that if the caller doesn't care about this value we can avoid a HANDLE leak. Thanks to the James Mansion for recommending this. * ace/Thread.cpp (ACE_Thread): Moved both definitions of spawn_n() into the Thread.cpp since they have loops and don't benefit from being inlined. * ace/Svc_Handler.h: Moved operator delete() into the public part of the class in order to make various compilers happy... * ace/OS.i (ACE_OS): Fixed the #define that selects the (union wait *) alternative of wait(). This original was protected by ACE_LACKS_POSIX_PROTO, but it should be ACE_HAS_UNION_WAIT. * performance-tests: Created a new directory that will contain all of the ACE performance tests. Move the Synch-Benchmarks and the TTCP tests from ./apps into here, and also moved the test_mutex.cpp and test_singleton.cpp files from ./examples/{Threads,Misc}, respectively. Thanks to Tim Harrison for this suggestion. * ace/OS.i (ACE_OS): in WIN32 closesocket() returns 0 if call is OK, so I changed the return value to be the other way around. Thanks to Luca Priorelli for reporting this. * ace: Changed the ACE_NO_POSIX_PROTO #define to something more meaningful: ACE_LACKS_POSIX_PROTO. Thanks to Jonathan Biggar for suggesting this. * ace/config-sunos4-g++.h: Added the #define ACE_NEEDS_SYSTIME_H. Thanks to Alexandre Karev for reporting this. * ace/OS: Fixed a bunch of pthreads portability problems that showed up on OSF/1 4.0. Also added support for asctime_r() and ctime_r() for OSF/1 4.0. Thanks to Dave Trumble for reporting these fixes. * ace/Synch_T.cpp (ACE_TSS_Read_Guard): Removed a stray "new" that was causing problems for the ACE_NEW macro. Thanks to Dave Trumble for reporting this. * ace/Local_Tokens.h: Fixed a broken use of "friend", which was missing the keyword "class." Thanks to Dave Trumble for reporting this. * ace/config-osf1-4.0.h: Included Dave Trumble's config file for OSF/1 4.0. * include/makeinclude/platform_osf1_4.0.GNU: Included Dave Trumble's platform macros file for OSF/1 4.0. Also renamed platform_osf1.GNU to platform_osf1_3.2.GNU to deal with the new version. * ace/Proactor: There wasn't a way to destroy an ACE_Overlapped_File object without closing the ACE_HANDLE attached to it. Therefore, I added a flag that keeps track of whether we have to delete this or not. Thanks to Amos Shapira for suggesting this. * examples/Threads/test_future[12].cpp: Updated the tests to use the new call() semantics in order to shut down the Scheduler's event loop gracefully. * ace/Method_Object.cpp: Added a return value to the call() routine. This can be used to indicate to the caller that it is necessary to shut down the event loop. Mon Sep 9 02:07:08 1996 Douglas C. Schmidt * ace/Service_Config.cpp (ACE_Service_Config): #ifdef's out the registration of signal handling to control reconfiguration on Win32 since it doesn't really handle signals very well. Thanks to John Morey for bringing this to my attention. * ace/CORBA_Handler: Replaced CORBA_[123] with ACE_CORBA_[123]. * examples/CORBA: Updated the test programs to work portably across different versions of Orbix. * ace/OS: Added a new wrapper for the getcwd() call. * examples/Threads/test_recursive_mutex.cpp: Added the use of ACE_Guard<> to illustrate how these work with the ACE_Recursive_Thread_Mutex. Thanks to Gonzalo Diethelm for motivating me to do this. * examples/Threads/test_process_{mutex,semaphore}: Added two new tests to illustrate how the ACE_Process_Mutex and ACE_Process_Semaphore work, respectively. * ace/Synch: Replaced the implementation of ACE_Process_Semaphore to use SV_Semaphore_Complex on UNIX platforms in order to get the same semantics for Win32 and for UNIX. Thanks to the James Mansion for recommending this. * ace/OS.h: Added some parens around the ACE BIT* macros so that the precedence levels would be dealt with correctly and we don't get any nasty surprises... * ace/{Synch_T,Synch}: Modified the implementation of all the *acquire()/release() methods so they keep track of whether they own the mutex. Thus, if a code path needs to give up the mutex within the lifetime of the mutex, and it calls mutex_.release(), then the destructor will not call it again. Thanks to the James Mansion for recommending this. * ace/{Synch_T,Synch}: Changed the name of the field result_ to owner_ for the ACE_Thread_Muetx_Guard and ACE_Guard. This is more representative of the true purpose of this field. * ace/Synch: Updated ACE_Thread_Mutex_Guard so that it has the same interface and semantics of ACE_Guard. Thanks to the ever-vigilant James Mansion for noticing this. * examples/Log_Msg/test_log_msg.cpp (main): Added a test of the new ACE_Log_Msg::priority_mask() functionality. * ace/Log_Msg.cpp: Added a new method called priority_mask(), which updates the new thread-specific priority_mask_ data member with the new mask and returns the old mask. This is useful for applications written using ACE_Log_Msg. Often, these have log() calls with low priority such as LM_DEBUG that don't need to be printed, but for which the logging code should not be removed. The priority_mask() scheme makes it possible to selective enable printing of certain priorities. Thanks to Rochi Febo Dommarco for suggesting this. * netsvcs/clients/Logger/indirect_logging.cpp (main): Modified the test program so that it randomly selects logging priorities that are powers of two. * ace/Log_Priority.h: Renumbered the LM_* logging flags so that they are all powers of two. This makes it easy to implement a scheme for selectively printing only certain logging values. Sun Sep 8 10:46:40 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Proactor.cpp: Fixed up the error handling in ACE_Proactor so that it returns an error both in case of "bad errors," as well as when ACE_WIN32 isn't defined. Thanks to Amos Shapira for reporting this. Sun Sep 8 14:11:08 1996 Tim H. Harrison * examples/Reactor/Proactor/README: Updated the test_proactor.cpp and README files to clarify the relationship between the Proactor and ReactorEx. This example uses the Proactor as the main event loop (not the Reactor or ReactorEx). Thus, this application can only do overlapped I/O and timers asynchronously. To be able to react to other Win32 events, see the ACE_ReactorEx and the examples/Reactor/ReactorEx/ test. Thanks to Amos Shapira for pointing out the ambiguity. Sat Sep 7 14:09:21 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Task.cpp: Enhanced the activate() method so that the caller can set the priority and the thread group id. Thanks to Karlheinz for this suggestion. * ace/OS.h: Added default values of 0 for the trailing arguments for the {mutex,sema,cond}_init() methods. * examples/Threads/test_mutex.cpp: Added a new test program that illustrates the difference between implementations of thread mutex wrappers that use inheritance and dynamic binding vs. the ACE approach (which doesn't use inheritance and dynamic binding). The results I got on my SPARCstation 20 model 712 is included in the source file. Thanks to James Mansion for motivating me to write this. * examples/Misc/test_singleton.cpp: Added a new test program that illustrates the performance of using the Double-Checked Locking pattern compared with the standard "Mutex::acquire()/release()" approach. Thanks to Jim Coplien for encouraging me to get these performance numbers. Tue Sep 3 00:38:47 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/XtReactor: Added minor fixes to XtReactor to fix complaints about "bool" not being defined and the destructor ~ACE_XtReactor() has already having a body. Thanks to Andres Kruse for these fixes. * ace/Mem_Map.cpp: Make sure that this->length_ is initialized to 0 in ACE_Mem_Map::map (). Thanks to James Mansion for pointing this out. * ace/Thread.i (spawn_n): In ACE_Thread::spawn_n the sense of the following check is wrong: for (i = 0; i < n; i++) // Bail out if error occurs. if (ACE_OS::thr_create (func, arg, flags, &t_id, 0, priority, stack == 0 ? 0 : stack[i], stack_size == 0 ? 0 : stack_size[i]) != 0) thread_ids[i] = t_id; else break; The '!=' should be '=='. Thanks to James Mansion for pointing this out. * include/makeinclude/rules.local.GNU (MAKEFILE): Changed the $WRAPPER_ROOT/include/makeinclude/rules.local.GNU line that says: sed -e "s:$(WRAPPER_ROOT);$$(WRAPPER_ROOT);g" \ so that the double dollar is now "\$$" (prefixed the first dollar sign with a backslash). If not, my shell will try to execute WRAPPER_ROOT for some reason. With "\$$" it works as it should. Thanks to Marius Kjeldahl for reporting this. * Released version 4.0.29 for testing. * ace/OS.i (thr_getspecific): Added a new case for OSF/1. Thanks to Martin Schoeckle for reporting this. * ace/Thread_Manager.cpp (spawn_i): Removed an invalid initialization of ACE_hthread_t = 0, which doesn't work on all pthreads platforms because pthreads uses a struct in some implementations. Thanks to Martin Schoeckle for reporting this. * man: Updated all the nroff and html documentation to conform to the latest version of ACE. * netsvcs/lib/{Name_Handler,TS_Server_Handler}.cpp: Fixed some mistakes in the ACE_TEMPLATES_REQUIRE_SPECIALIZATION code so that all the services can be linked together without multiply defined symbols. * netsvcs/lib/Name_Handler.cpp: Fixed a spot where we weren't passing in an lvalue to send_request(). Why this wasn't showing up earlier I don't know, but GCC caught it! Mon Sep 2 00:47:00 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Thread_Manager.cpp: Updated all comparisons of ACE_thread_t and ACE_hthread_t so that they use the ACE_OS::thr_equal() and ACE_OS::thr_cmp() methods, respectively. Thanks very much to Martin Schoeckle for identify the need for this. * ace/OS: Added a new method called thr_cmp() which compares two ACE_hthread_t values for equality. Unfortunately, we can't just compare these directly via == because on some platforms they are implemented as structs. Right now, I'm assuming that if ACE_HAS_TID_T is enabled that we can compare tid_t's using ==. If this turns out to be incorrect (e.g., if tid_t's are also implemented as structs, please let me know). * ace/Future: Changed the overloaded result() method to a pair of get()/set() methods. * tests/test_config.h: Fixed a bug in the reset() routine. This was originally deleting the global static ace_file_stream. However, this was causing segmentation faults if destructors for objects local to main() were trying to write to the output file. Therefore, instead of deleting the ostream, we simply flush() it! In addition, also renamed the various functions in test_config.h to make sure they don't conflict with any other names by prefixing them with ace_test_... * ace: Added many small fixes for IRIX 6.2. Thanks to Gonzalo Diethelm for reporting all of these! * ace/OS: Added a wrapper for the UNIX syscon() system call. * ace/LSOCK.cpp (recv_handle): Rearranged the casts so that things work correctly on platforms with odd definitions ot struct iovec. Thanks to Gonzalo Diethelm for reporting this. * ace/Task.cpp (ACE_Task_Exit): Rearranged the order in which we shut down a Task via the Task_Exit hook so that we first decrement the count of the threads in the task and *then* call its close() hook. This guards against cases where the close() hook does something crazy like "delete this". * ace/XtReactor.h: Changed #include "X11/Intrinsic.h" to #include . Thanks to Gonzalo Diethelm for suggesting this. * ace/Future.cpp (ACE_Future): Added some strategic "consts" to the assignment operator and copy constructor for ACE_Future and ACE_Future_Rep. * examples/Threads/test_task_three.cpp (main): Revised the test so that it will shut itself down automatically when all the threads have finished. * examples/Threads/test_task_two.cpp (main): Revised this test so that it doesn't run forever, but only runs either 1000 times or as many times as the user specifies on the command line. Thanks to Gonzalo Diethelm for suggesting this. * ace/OS.i: Added an extra #else for thr_sigsetmask(), thr_min_stack(), and thr_kill() for weirdo platforms that don't conform to the other threading APIs... Sun Sep 1 20:15:28 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * examples/ASX/Message_Queue: Changed the use of read(0, ...) and write(1, ...) to ACE_OS::read(ACE_STDIN, ...) and ACE_OS::write(ACE_STDOUT, ...) in buffer_stream.cpp and bounded_buffer.cpp. * ace/OS.i: Fixed the errno mapping of the cond_timedwait() functions so that they set errno to ETIME rather than EBUSY when timeouts occur. This is necessary to support Solaris and POSIX pthreads semantics on Win32. * build/SunOS5.5/examples/ASX/Message_Queue/buffer_stream.cpp: Modified the example somewhat so that it uses the Singleton thr_mgr() method from ACE_Service_Config. Sun Sep 1 17:29:58 1996 Tim H. Harrison (harrison@lambada.cs.wustl.edu) * ace/ACE.cpp (map_errno): Added a new static method to the ACE class. This method allows us to map troublesome win32 errno values (e.g. WSAEWOULDBLOCK) to values that standard C strerr function understands. Thank you Microsoft. * ace/Log_Msg.cpp (log): Added a call to ACE::map_errno to the %p option. Now the ACE logger can begin to map Win32 error values into meaningful strings. * netsvcs/lib/lib.mdp: Added a project file for the netsvcs library. This builds a dll into ace/netsvcs.dll (not into the netsvcs/lib directory). This reduces the number of paths needed in %PATH%. * examples/Tokens: Renamed this directory netsvsc/clients/Tokens. * ace/ace.mdp: Removed wsock32.lib from the ace files listing. The problem is that we can't assume where MSDEV is installed. I added wsock32.lib and advapi32.lib to the build/settings/link/library_modules line. * ace/config-win32-msvc4.0.h: Disabled the "C4355: 'this' : used in base member initializer list" warning. Thanks to Amos Shapira for figuring this out for us. Although "this" is unneeded for win32, it is required for compilers on other platforms (e.g., AIX). * ace/Message_Queue.cpp (dequeue_head_i): Andres Kruse pointed out that we weren't doing head_->prev (0), when dequeuing! Tue Aug 27 21:00:25 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * include/makeinclude/platform_sunos5_sunc++_4.1.GNU (CXX): Added Andres Kruse's changes for SunC+ 4.1. * ace: Fixed line # 12 of ace/config-sunos4-sun4.1.4.h, which read: "#define ACE_HAS_SVSV_IPC" (ACE_HAS_ ess vee ess vee _IPC) to "#define ACE_HAS_SYSV_IPC" (ACE_HAS_ ess wye ess vee _IPC) Fix another problem: #define ACE_LACKS_THREAD_STACK_ADDR (OS.cpp) was inconsistently defined in: #define ACE_LACKS_THREAD_STACK_ADDRESS (config-aix-4.1.x.h) Thanks to Alan Stweart for reporting this! Mon Aug 26 00:34:05 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * Updated all of ACE such that the ACE_GUARD* macros now all take the name of the ACE_*Guard* that they will use as the scoped locking object. This is important for several reasons: 1. It make it more clear what is going on in the code, rather than hiding behind the macros! 2. It is now possible to have multiple ACE_GUARD* macros in the same scope by calling each scoped locking object a different name. This is used in the Local_Tokens.cpp file. * ace/Synch.h (ACE_Null_Mutex_Guard): Added the locked() method so that this signature will conform to the one expected of ACE_Guard. * tests: Added a new file Test_Future.cpp, which tests the new ACE Futures mechanism using Active Obejcts. Thanks to Andres Kruse for contributing this test. * ace: Added three new files: Future.{h,cpp}, Method_Object.{h,cpp}, and Activation_Queue.{h,cpp}, which implement Polymorphic Futures. Thanks to Andres Kruse for contributing these. * ace/Stream.cpp (dump): Replaced LM_INFO with LM_DEBUG. Sun Aug 25 21:57:57 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace: Rather than using operator new directly, most of ACE now uses the ACE_NEW and ACE_NEW_RETURN macros. For instance, rather than writing: if (token_manager_ == 0) token_manager_ = new ACE_Token_Manager; we should write: if (token_manager_ == 0) ACE_NEW_RETURN (token_manager_, ACE_Token_Manager, 0); The reason for this is that it makes it much easier to ensure that all dynamic memory allocation errors are treated uniformly. I've updated the entire ACE library code tonight to make this usage consistent whenever possible. Sat Aug 24 11:51:38 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Time_Value.h: Simplified various things so that the nasty macros necessary to build DLLs on Win32 will be simplier. In addition, I will only #include for those platforms that don't already do this in (i.e., if ACE_NEEDS_SYSTIME_H is defined in config.h). Please let me know if you run across any platforms like this. * ace/TLI_{Connector,Acceptor}: Added two additional parameters at the end of the connect() and accept() methods, respectively, so that the ACE TLI wrappers can be used with X.25. Thanks to Ajit Sagar for suggesting this fix. * ace: Integrated Eric Newton's XtReactor into the Makefile. If you want to include this into ACE, make sure to define ACE_HAS_XT in the config.h file. * examples/Misc: Integrated the XtReactor tests. * ace/OS.i (getservbyname,gethostby*): Fixed a suble omission -- any calls to socket function should be wrapped by the ACE_SOCKCALL_RETURN macro in order to make the errnos work correctly on Win32. * ace/OS: Added support for the getprotoby{name,number} wrappers. Thanks to Joe DeAngelis for suggesting this. * ace/Connector.cpp: Fixed a subtle bug in the ACE_Connector. The problem centered around the following line in cleanup_AST(): if (this->handler_map_.find (handle, ast) == -1) This lookup always failed because the key, the handle of the service handler, was always -1. The service handler's handle is not set until a successful connection is made and connector transfers ownership of the handle to the service handler. The fix for this is to store the ACE_HANDLE in the ACE_Svc_Tuple *separately* from the ACE_Svc_Handler. Thanks to Bill Gerecke for being so persistent in tracking this down. * ace/ARGV.cpp (ACE_ARGV): Added a nifty new constructor that converts argv-style vectors of strings into a single string (this is the reverse of what the original constructor does!). * ace/ACE: Added a new utility method called strecpy(), which copies to , returning a pointer to the end of the copied region (rather than the beginning, a la . Thu Aug 22 15:43:58 1996 * ace/OS.h: Changed the interface of ACE_OS::fork_exec (char *const argv[]). (There is no longer a separate const char *path parameter. Now, argv[0] must be the full path name to the executable. * tests/Time_Service_Test.cpp: Updated the Time Service one-button test to use the new ACE_OS::fork_exec. I didn't event break it. * tests/Tokens_Test.cpp: Updated the Tokens one-button test to use the new ACE_OS::fork_exec. It actually works now. * tests/test_config.h: Added some more #defines to help simplify path differences between NT and UNIX. Perhaps these should be moved into OS.h? Thu Aug 22 13:46:58 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Thread_Manager.cpp (ACE_Thread_Control): The status_ member in ACE_Thread_Control() was not being initialized! This caused Purify to complain loudly about invalid memory accesses. I have added an initialiser to ACE_Thread_Control::ACE_Thread_Control to set status_ to 0. Thanks to Ross Dargahi for reporting this. * ChangeLog: The ACE configuration files "config-irix*.h" defined 'ACE_HAS_SIGINFO' to indicate that IRIX supports SVR4 extended signals. This should be 'ACE_HAS_SIGINFO_T' instead. Thanks to Craig Johnston for reporting this. Wed Aug 21 21:09:01 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/Time_Value.h: Added an extra condition, #if defined (ACE_BUILD_DLL) so that ACE_Svc_Export evaluates to something. Previously, it was evaluating to nothing in some files such as Naming_Context.cpp where we were doing #define ACE_BUILD_DLL and not #define ACE_BUILD_SVC_DLL. Wed Aug 21 00:33:17 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/ACE.cpp (format_hexdump): Fixed a minor bug in format_hexdump(). If the buffer to dump is a multiple of 16 it prints an extra blank line. ALso fixed the code to use spaces rather than tabs and put an extra space between the first 8 HEX bytes and the second. Thanks to Luca Priorelli for this code. * ace/Log_Msg.h (ACE_HEX_DUMP): Added a new logging macro: #define ACE_HEX_DUMP(X) \ do { int __ace_error = errno; \ ACE_Log_Msg *ace___ = ACE_Log_Msg::instance (); \ ace___->set (__FILE__, __LINE__, 0, errno, ace___->restart (), ace___->msg_ostream ()); \ ace___->log_hexdump X; \ } while (0) which makes it possible to dump info in HEX. Thanks to Luca Priorelli for suggesting this. * ace/config-win32-msvc4.0.h: Added #define _WINSOCKAPI_ To avoid multiple inclusions. Thanks to Luca Priorelli for suggesting this. * ace/OS.h: enclosed the #define of WIN32_LEAN_AND_MEAN macro definition between #ifndef ... #endif to avoid compiler warnings. Thanks to Luca Priorelli for suggesting this. * ace/SOCK.cpp (win32_fini): Fixed a potential problem in ACE where any code of the form: ACE_DEBUG ((LM_DEBUG, "%d", GetLastError())); will reset errno a couple of times before GetLastError() gets called. So the result is always 0. The fix is to say: int ret = GetLastError(); ACE_DEBUG ((LM_DEBUG, "%d", ret)); Thanks to Luca Priorelli for noticing this. * ace/Connector.cpp (create_AST): Was missing a return 0; if we successfully register a cancellation id. Thanks to William L. Gerecke for reporting this bug. * ace/Module.h: Added a non-existent friend class to get ACE to stop complaining private: friend class ACE_Shutup_GPlusPlus; // Turn off g++ warning ~ACE_Module (void); // *Must* use dynamic allocation. Thanks to Eric Newton for the suggestion. * ace/Svc_Conf.y (ace_create_service_type): Removed some stray calls to ACE_ERROR that were left over from earlier configurations of ACE. Thanks to Gonzalo Diethelm for reporting this. * ace/Log_Msg.cpp (instance): Fixed the #ifdefs so that ACE_MT_SAFE implies ACE_HAS_THREAD_SPECIFIC_STORAGE. Thanks to Gonzalo Diethelm for reporting the need for this. Tue Aug 20 13:09:55 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * INET_Addr.cpp, line 84: Irix's C++ is not able to determine whether to use the set(u_short,ACE_UINT32,int) or the set(u_short,const char [],int), since on Irix, INADDR_ANY is 0. I cast the value so that the call would read set(port, ACE_UINT32(INADDR_ANY)) and everything went fine. Thanks to Gonzalo Diethelm for reporting this. * ace/Synch[_T]: Added a new wait() method that takes a first parameter which is the mutex used to serialize access to the condition. This is useful if you want to store the ACE_Condition object in shared memory (in which case, the use of a reference to mutex_t doesn't work!). Thanks to Mark Patton for recommending this approach. * ace/Task.h: Added a forward template declaration for ACE_Task_Exit so that it will compile on HP/UX. Thanks to Tim Ottinger for pointing this out. * ace: changed line 19 of ace/Str_Buf.h from #include "OS.h" to: #include "ace/OS.h" Fixed similar problems with OS.h at line 1154 and Dump.h at line 150. Thanks to Alan Stewart for reporting this. Tue Aug 20 20:18:49 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * tests/TSS_Test.cpp (main): Fixed a small typo. I was referencing the wrong variable but didn't catch it since it was in the #if !defined (ACE_HAS_THREADS) section. Fixed the typo and also renamed the variable called big_count to iterations. Thanks to Tim Ottinger for pointing this out. Mon Aug 19 19:25:50 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * {examples,apps,tests}: Removed the use of zerop from these files, as well... * ace/{Acceptor.cpp,Name_Proxy.cpp,Token.i}: Removed the use of zerop from these files, as well... * ace/Connector.cpp (connect_svc_handler): It looks like our good friend ACE_Time_Value::zerop isn't getting initialized correctly on Win32. Therefore, I've replaced it with a direct use of &ACE_Time_Value::zero. * ace/Time_Value.cpp: Removed the static pointer variable "zerop" since there was no guarantee it was getting intialized before it is used! Instead of using ACE_Time_Value::zerop, use &ACE_Time_Value::zero. Thanks to William L. Gerecke for reporting this problem. * ace/OS: Added zillions of changes to make ACE compile with OSF/1 and its DCE threads implementation. Thanks to Martin Schoeckle for sending these. * ace/config-osf1-3.2.h: Updated this file with fixes for OSF/1 by Martin Schoeckle . * ace/ACE.cpp (handle_timed_complete): Added new logic to ACE::handle_timed_complete() so that it sets errno to ECONNREFUSED if the connection is refused by the server. When you issue an asynchronous connect request, to complete it, you will use complete() with a timeout. However, complete can fail, and then it will deallocate any resource, (i.e. close down the socket handle), also for timeout expiration. So, a user interested in retrying to complete a connection while the timeout expires will not use complete(); but rather will use handle_timed_complete(). In fact, using handle_timed_complete() the user could detect the reason of a failure (by examining errno) and decide how to proceed. In the old ACE version the problem was that, if handle_timed_complete() failed because of the recv() returning 0, errno remained unchanged and so its value could be quite misleading with respect to the reasons of the failure. Thanks to Antonio Tortorici for this fix and the explanation above. * ace/OS.h: Added support for Borland 5.0's uint64. Thanks to Hani Yakan for suggesting the strategy to accomplish this. Mon Aug 19 15:52:07 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * tests: Added new macros to the test_config.h file in order to simplify the testing. Mon Aug 19 00:21:22 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * Re-released version 4.0.28 for testing (will change the version number after Tim gives me the new Token stuff). * {netsvcs/lib,tests/test_config.h}: Removed spurious dependencies on fstream.h and iostream.h. Thanks to Alan Stewart for reporting this. Sat Aug 17 17:25:49 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Reactor: Removed the use of "inline" in the Reactor.cpp files because this was causing problems with some compilers/linkers. Thanks to Gonzalo Diethelm for recommending this. * examples/Misc/test_XtReactor1.cpp: Added a new test of the XtReactor, courtesy of Eric Newton . * ace/config-hpux-10.x.h: According to Eugene K. Plaude , HP-UX 10.01 supports user-level threads based on the pthreads interface specified by POSIX in 1003.4a, Draft 4 (which is basically DCE threads). Therefore, I've enabled the ACE_HAS_DCETHREADS symbol in the config-hpux-10.x.h configuration file. If this isn't correct, please let me know. Sat Aug 17 02:18:39 1996 Tim H. Harrison (harrison@lambada.cs.wustl.edu) * examples/Tokens/manual/README: Added a new Token example application. The manual test gives users a text-based interactive interface to local or remote tokens. This is extremely useful for manually testing the token server and setting up deadlock scenarios. See the README file for more details. * examples/Tokens/deadlock/README: Updated the deadlock example application to test the new deadlock detection algorithm for readers/writer locks. I also added the use of Token Invariants to ensure correctness of the mutexes and readers/writer locks. See the README file for more details. Fri Aug 16 22:16:05 1996 Tim H. Harrison (harrison@lambada.cs.wustl.edu) * ace/Token_Manager.cpp: Updated all Token code to use ACE_OS::last_error instead of errno. Fri Aug 16 00:03:24 1996 Douglas C. Schmidt * After a long hiatus, released version 4.0.28 for testing. Thu Aug 15 21:04:35 1996 Douglas C. Schmidt * man: Updated all the ACE manual pages and html pages to reflect recent changes. * netsvcs/lib/Server_Logging_Handler.cpp: Fixed an omitted "ACE_BUILD_SVC_DLL" that was causing linker errors on NT. Thanks to Luca Priorelli for reporting this. * examples/Log_Msg/test_log_msg.cpp: Added a test for the new log_hexdump() function. * ace/Log_Msg.cpp (log_hexdump): Integrated the log_hexdump() code into the ACE Log_Msg abstraction. Thanks to Luca Priorelli for fixing this and for Todd Montgomery for originally supplying the code. * ace/Signal.cpp (ACE_Sig_Handlers): Moved the #endif /* HPUX */ down to the end of the file so that it works correctly on HPUX. Thanks to Eric C. Newton for report this bug. * ace/OS.i: Updated the behavior of thr_join() so that it will do a ::CloseHandle after getting the exit status. Thanks to the ever vigilant James Mansion (mansionj@lonnds.ml.com) for noticing this. * examples: Finally added Tim and Prashant's examles/OS directory, which contains a test that illustrates a "portable" means to spawn processes on NT and UNIX. * ace/Malloc_T.cpp (next): Added an overloaded next() method that returns the name that is bound to the pointer in the Malloc_Iterator. This is useful in order to differentiate entries in the pool based on their name. Thanks to Kim Gillies for suggesting this. * ace: Changed all uses of thread_t, thread_key_t, mutex_t, rwlock_t, sema_t, cond_t, etc. to ACE_* in order to avoid polluting the name space. Also switched from using macros to using typedefs whereever possible. Thanks to Gonzalo Diethelm for recommending this. * ace/System_Time.cpp: Added template specializations for templates used in the ACE_System_Time class. This should solve some nasty undefined templates problems with GCC... Thanks to Joseph DeAngelis for pointing out the problem. * ace/Name_Space.cpp: Fixed the file Name_Space.cpp as follows: // Name_Space.cpp #define ACE_BUILD_DLL //#include "Name_Space.h" #include "ace/Name_Space.h" Thanks to Eugene K. Plaude for fixing this! * ace/config-hpux-10.x.h: Added support for TLI since according to Eugene K. Plaude this should work. If not, please let me know. Wed Aug 14 21:29:46 1996 Douglas C. Schmidt * examples/Reactor/Logger: rearranged the Logger directory so it would be more clear what the client and server programs did and how to run them. * examples: Merged the contents of the SVR4 examples directory into the IPC_SAP/SOCK_SAP directory so that we can remove the SVR4 directory altogether (it wasn't contributing much...). * examples: Removed the vestigal Win32 tests since ACE now runs on Win32 and we don't need a separate test directory. * netsvcs/client: Renamed the file remaining file in this directory to logging_app.cpp since I moved the other file to the examples/Reactor/Logger directory. * ace/Reactor.cpp (check_handles): If eh->get_handle() returns -1 the select() code will index the [-1] element of an array. To fix this, I've added a check of the value returned from eh->get_handle(). Thanks to Eric C. Newton for reporting this. * ace/OS.i (sema_wait): Fixed a subtle bug in the Pthreads wrappers that surfaced on the SGI IRIX 6.2 port. There was some code that looked like this: pthread_cleanup_push(); int result = 0; ... pthread_cleanup_pop(); return result; However, on Irix 6.2, the push introduces a new scope that is closed by the pop, so result goes out of scope before returning. Thanks to Gonzalo Diethelm for pointing this out. * ace/OS.h: Changed the definition of pthread_mutex_t and pthread_cond_t to mutex_t and cond_t to be consistent with other usage in ACE. Thanks to Gonzalo Diethelm for pointing this out. Wed Aug 14 01:25:47 1996 * ace/SPIPE_Acceptor.cpp: Added the PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE flags to CreateNamedPipe pipe options so that data is received in messages rather than as a stream. This is consistent with the behavior of the SPIPE_Connector. When we have time, we need to extend the interface so that stream pipes are also supported, as well. * SPIPE_Acceptor.cpp: Made the ACE SPIPE in and out buffer sizes 10 k. The previous size was just 512 bytes. This larger buffer size helps decrease flow control. Tue Aug 13 23:21:46 1996 * examples/Connection/blocking: Updated the blocking SPIPE example application to use a pool of threads in the proactor to handle incoming client messages. The SPIPE-acceptor example illustrates how named pipes are used on NT. Once the server establishes a connection to a single client, it spawns a thread pool to handle incoming requests via the proactor event loop. That is, a separate thread from the pool is used to process each message sent by a client. The size of the thread pool can be specified by command-line arguments. This example leverages the queueing performed by the NT kernel to trivially implement a thread pool architecture. See examples/Connection/blocking/README for more details. * Service_Config.h: Added a parameter (with a default size of 0) to the proactor accessor method. This allows applications to specify the size of the thread pool that can block on Proactor::handle_events. Tue Aug 13 02:30:58 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Task: Added a new public interface called thr_count(). This returns a count of the number of threads running within a Task. If the value returned is 0, then the Task is a Passive Object. If the value returns is > 0 the task is an Active Object, and the value is a count of the number of threads running within the object at this snapshot of time. * ace/OS: I implemented Karlheinz's suggested optimizations for the ACE condition variable implementation under Win32. Here's the deal... The original implementation used an internal_mutex to ensure that access to the count of the number of waiters was serialized between the waiter and signaler threads. The new implementation is designed so that only the waiter threads access the waiter count. Therefore, we can utilize the external_mutex to serialize access to this, thus eliminating the need for the internal_mutex. However, this means that code *must* be written using the standard condition variable idiom, i.e., int resources () { external_mutex.acquire (); // ... cond.signal (); external_mutex.release (); } Rather than like this: int resources () { external_mutex.acquire (); // ... external_mutex.release (); cond.signal (); } which is what some thread programming books recommend as an optimization. However, you should be careful not to use this form since it can lead to "lost wakeup" bugs caused by the fact that the implementation of ACE_OS::cond_signal will test if the waiter count > 0 *without holding any locks*!!! Fortunately, ensuring this shouldn't be a problem since most ACE code uses the following idiom: int resources () { ACE_Guard mon (external_mutex); // ... cond.signal (); // Destructor of mon releases external_mutex. } Clearly, there are subtle tradeoffs between performance and programmability here... * ace/Synch: Updated all of the ACE semaphore wrappers to take the new "max" value as their final constructor argument. * ace/OS: Added a new default argument to the end of the sema_init() method. This allows us to specify the maximum value of the semaphore (this is only important on NT). Currently, it is hard-coded to 0x7fffffff in uses. The new approach makes it possible to set the max to a different value. Thanks to Karlheinz for requesting this. * ace/Message_Queue.cpp: Added an implementation of the dump(). Thanks Karlheinz. * ace/Synch.cpp: Added an implementation of the dump() method. Thanks Karlheinz. * ace: Updated all usage of ACE_Thread_Mutex_Guard so that it now uses the ACE_GUARD* macros correctly. Thanks to Chris Eich for pointing out the need for this. * examples/Threads: Added Karlheinz's new test_barrier2.cpp test program that makes sure that the ACE_Message_Queues are working correctly when accessed by multiple threads. * netsvcs/lib/Server_Logging_Handler.cpp (handle_logging_record): Fixed an errant use of ACE_Guard, which wasn't properly checking of the Guard acquired the lock. Thanks to Chris Eich for pointing this out. * ace/OS.h (ACE_GUARD): Added default "ace_mon" implementations of type ACE_Null_Mutex even in cases where there's no threading defined so that code accessing ace_mon.release() and ace_mon.acquire() will compile correctly. * apps/Gateway/Gateway/Channel.h: Fixed the code so that we don't try to use TLI if the platform doesn't support it (instead, we'll use sockets). Thanks to Marius Kjeldahl for reporting this problem. * examples/ASX/Event_Server/{Supplier,Consumer}: Fixed the code so that we don't try to use TLI if the platform doesn't support it (instead, we'll use sockets). Thanks to Marius Kjeldahl for reporting this problem. Mon Aug 12 14:50:47 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * examples/Misc: Added Eric Newton's test case for his XtReactor integration. * ace: Included Eric Newton's code that integrates ACE with the Xt event loop. This still needs a bit of work (e.g., making it thread-safe and incorporating signal support), so I haven't added it to the Makefile yet. If someone can take the time to fix it up, I'll be happy to integrate it into ACE. * ace/Message_Queue.cpp (dequeue_head): Fixed the mother of all bugs in the ACE_Message_Queue implementation... The problem was that I was trying to be too clever by optimizing the number of Condition::signal() calls by only calling signal() when the queue changed state from empty to non-empty (or full to non-full). It turns out that this optimization works fine for a single producer/consumer case, but fails when there are multiple consumers. The fix was just to call signal() every time. This should be ok because the underlying Condition variable implementation will perform the optimization in the correct fashion. Thanks to the omniscient Karlheinz for detecting this problem and reporting it. Sun Aug 11 15:52:07 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * tests: Made minor changes to test_config.h, SPIPE_Test.cpp, and UPIPE_SAP_Test.cpp to accomodate the change made to SPIPE_Addr. SPIPE_Addr now accepts a string of the form [host:]port and then creates the rendezvous point. Originally, SPIPE_Addr would assume that the string being passed in was the actual rendezvous point. Sat Aug 10 18:41:21 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * netsvcs/lib/Logger.cpp (init): Added a new service to netsvcs called ACE_Logger which allows us to control the output of all the services. The ACE_Logger service can be invoked with different flags (such as STDERR|OSTREAM) which in turn sets ACE_Log_Msg to direct the output of all the services to the appropriate stream(s). Note that if a service needs to stay unaffected from ACE_Logger, it should be invoked before ACE_Logger gets invoked. Also note that like other services in netsvcs, ACE_Logger can also be dynamically linked in. Sat Aug 10 14:23:07 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * Added Steve Huston's patches to get ACE to compile on UnixWare 2.01. This mostly involved changes to the internal types used by the socket wrappers. Thanks Steve! Fri Aug 9 01:34:19 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * examples/ASX/UPIPE_Event_Server/Options.cpp (print_results): Added a typedef to avoid problems if a platform doesn't support prusage_t. Thanks to Marius Kjeldahl for reporting this. * include/makeinclude/platform_linux_pthread.GNU. The line that say: LIBS = -lpthreads -lstdc++ was modified to say: LIBS += -lpthreads -lstdc++ Thanks to Marius Kjeldahl for reporting this. Fri Aug 9 18:26:16 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/Local_Name_Space.cpp (reset): Fixed a subtle (yet very annoying bug). In switching contexts a test program would hang after a certain number of switches. Having gone through the code thoroughly and with the aid of Purify, the bug was narrowed down to an extraneous delete taking place in ACE_Name_Space::reset(). Essentially, we do not need to delete ACE_Name_Space_Map::instance() which is actually the SHARED_MALLOC since it gets deleted in the destructor of ACE_Local_Name_Space. Thu Aug 8 17:55:20 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/SPIPE_Addr.cpp (set): Implemented ACE_SPIPE_Addr::string_to_addr(). Modified ACE_SPIPE_Addr::set() using code provided by Brad Flood to create the rendezvous point. Note that originally ACE_SPIPE_Addr constructor and set() would take the actual rendezvous point but now they rely on being passed a string which is of the format "[host]:port" (where host is optional). The rendezvous point is then created by extracting from the string the hostname (if any) and also using the port number as the unique pipe name. Note that this approach works on both UNIX and Win32. Mon Aug 5 20:15:59 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/OS.i (last_error): Fixed a typo. In the set and get methods last_error(), there should be a check for "if defined (ACE_WIN32)" and not "if defined (ACE_HAS_WIN32)" Wed Aug 7 00:21:42 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Log_Msg.h: Replaced all uses of errno *following calls to ACE_Log_Msg::instance()* so that we first cache errno in a local variable called __ace_errno. We need to do this because ACE_Log_Msg::instance() can reset errno == 0. Thanks to Tim for pointing this out. Mon Aug 5 20:15:59 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/OS.i (last_error): Fixed a typo. In the set and get methods last_error(), there should be a check for "if defined (ACE_WIN32)" and not "if defined (ACE_HAS_WIN32)" Sat Aug 3 14:52:32 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * examples/Win32/win32_client.cpp: Changed ACE_GUARD_RETURN to ACE_GUARD in the method Errno::flags since the return type is void. * examples/Connection/non_blocking/CPP-connector.cpp: Made some minor changes to get things compiling on Win32. The call to handle_close now takes zero as the first argument (which is never used). Also the arguments to ACE_SERVER_ADDRESS are now swapped (hostname followed by port number) to be consistent with the change made to the macro. Thanks to Brad Flood for suggesting these changes. * examples/Connection/non_blocking/CPP-acceptor.cpp: Made minor changes to some of the methods to make sure all control paths return a value. Also changed the default port number to ACE_DEFAULT_SERVER_PORT_STR to match what the connector tries to connect to. Thanks to Brad Flood for suggesting these changes. * ace/OS.h (ACE_SERVER_ADDRESS): Modified the macro ACE_SERVER_ADDRESS so that it creates a string of a server address with a "host:port" format. Previously the order was reversed. Thanks to Brad Flood for suggesting this change. Sat Aug 3 00:07:26 1996 Douglas C. Schmidt (schmidt@lambada.cs.wustl.edu) * ace: Fixed problems with recursive tracing of ACE_TRACE by commenting out certain constructors in IPC_SAP.cpp, FIFO_Send_Msg.cpp, FIFO_Send.cpp, and FIFO.cpp. Thanks to Karlheinz for finding and reporting these fixes. Fri Aug 2 22:19:05 1996 Douglas C. Schmidt (schmidt@lambada.cs.wustl.edu) * ace/ACE.cpp (format_hexdump): Fixed an infamous "off by one" bug that was causing this to fail on Win32 (time to switch to Java? ;-)). Thanks to lucapri@mbox.vol.it for finding this. Thu Aug 1 14:08:30 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/CORBA_Handler.cpp (activate_service): Fixed a typo caused by an omitted ENDTRY. Thanks to Garrett Conaty for noticing this. Mon Jul 29 10:03:16 1996 Douglas C. Schmidt (schmidt@lambada.cs.wustl.edu) * examples/Win32/win32_client.cpp: There was a typo in one of the ACE_GUARD macros. Thanks to Tim Ottinger for pointing this out. Mon Jul 22 12:41:22 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/Local_Name_Space.cpp (reset): Added a new method ACE_Name_Space_Map::reset() which deletes the instance of ACE_Name_Space_Map. This forces instance() to create a new instance using a new context file in the case of the context having changed. I make use of this in ACE_Local_Name_Space::create_manager(). Fri Jul 19 12:28:07 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/System_Time.cpp (get_master_system_time): Modified ACE_System_Time::get_master_system_time() so that if an entry for the time is not found in shared memory (indicating that no Clerk is running), then we should just return the local time of the host. * netsvcs/lib/TS_Clerk_Handler.cpp (update_time): Modified ACE_TS_Clerk_Handler::update_time() so that if the Clerk is not connected to any servers, is sets the delta time to zero allowing clients to then use the local time of the host. Wed Jul 17 22:19:53 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/UPIPE_Connector.cpp (connect): Added an #ifdef around the check of ACE_OS::isastream (handle) in ACE_UPIPE_Connector::connect() since the call is not supported on NT. Thu Jul 11 22:22:57 1996 Tim H. Harrison (harrison@lambada.cs.wustl.edu) * ace/OS.i (kill): Modified ACE_OS::kill so that it works on NT. It takes a process ID, creates a handle for the associated process, and calls TerminateProcess on the handle. This is actually pretty dangerous according to the NT documentation. Can majorly confuse DLLs. Does the same old thing on UNIX. * ace/OS.cpp (fork_exec): Added a fork_exec operation to ACE_OS. This works on UNIX and NT. It combines the forking and exec'ing into one call. This has to be combined since Win32 CreateProcess only starts applications from scratch (unlike UNIX fork). * examples/OS/test_os.cpp: Added a new example application to test the new ACE_OS::fork_exec and ACE_OS::kill operations. Tue Jul 9 13:04:14 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Service_Manager.cpp (reconfigure_services): To improve portability on Win32 and UNIX I replaced the use of a signal to trigger reconfiguration to instead make a call to the new ACE_service_Config::reconfig_occurred() method. This should actually perform the same as the original approach, since all the signal handler ever did was to set this flag! Thanks to Karlheinz for pointing out the need for this. * ace/Service_Config.h: Added a new static public method called reconfig_occurred(sig_atomic_t) to set if a reconfiguration should take place the next time through the event loop. Mon Jul 8 14:20:01 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/Time_Value.h: Added "ACE_Export" before all global operators to allow them to be dll-exportable on NT. Mon Jul 8 13:12:05 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/{Message_Block,DEV_IO,SPIPE_Stream}.cpp: Fixed several more cases of delete array that should have been delete [] array. Thanks to Tom Leith for pointing out some of these. I can hear the ghost of James Mansion coming closer... ;-) * INSTALL: Added tips on how to install ACE on a Win32 platform that lacks a network card. * ChangeLog: Split ChangeLog-96 into two files (ChangeLog-96a and ChangeLog-96b) since it was becoming quite large! Thanks to Chris Lahey for pointing this out. * ace/Stream.cpp: Was missing a "return 0;" at the end of the close() method. Thanks to Tom Leith for finding this. Mon Jul 8 14:20:01 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/Time_Value.h: Added "ACE_Export" before all global operators to allow them to be exportable from Win32 DLLs. Sun Jul 7 10:34:48 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * Released version 4.0.27 for testing. * config-sunos5.5*.h: Removed all uses of ACE_HAS_SVR4_SIGNAL_T in the config files since Solaris 2.5 has consistent signal and sigaction types (at last!). * Installed and compiled ACE successfully with the new SunC++ 4.1 compiler on Solaris 2.5. However, there seems to be major problems with the interaction of the SunC++ exception handling runtime system and the Solaris multi-threading mechanisms. This is causing the ACE multi-threading tests to bomb with segmentation faults inside of the _ex_unwind() library function. If you read the /opt/SUNWspro_3.1/READMEs/c++ file you'll see why this problem is occurring (apparently due to bugs in the Solaris libC.so.5 C++ runtime library). There seem to be two fixes for this problem: 1. Add the following to *all* threads (including main): #include void *my_thread_entry_point (void *) { set_terminate (abort); set_unexpected (abort); // Do real work... } This is the approach recommended by the README file in SUNWspro_3.1. However, it is *clearly* a horrible hack and very non-portable (therefore, I deem it worthy of Microsoft ;-)). 2. Compile ACE (and applications?) with -noex in order to avoid this bug. This is clearly not desirable either since it precludes the use of exception handling with C++ and threads on Solaris... Since ACE doesn't use exceptions internally on Solaris option 2 seems like the best approach for the time being. When Sun gets it act together and releases a bug-free library and C++ software, I'll fix ACE accordingly. * tests: Integrated the latest of Prashant's "one-button" tests into the main ACE release. These will run on both UNIX and Win32 now. * ace/UPIPE_Stream.cpp (recv): Changed the semantics of the ACE_UPIPE_Stream::recv (char *, size_t, ACE_Time_Value *) method. Currently, the behavior is to block until *exactly* N bytes are read. However, this is incorrect for 2 reasons: 1. It makes it hard to write a server that doesn't know precisely how big the messages are from the client. In particular, if the receiver doesn't know how big the buffer messages are from the client it will block indefinitely! 2. It is redundant with respect to the ACE_UPIPE_Stream::recv_n(), which also blocks until all N bytes are received. Therefore, I've made the new UPIPE_Stream::recv() method block only until it's received the first block of data that allows it to fulfill its size request, or anything that is smaller than that size. * ace/OS.cpp (thr_create): Since POSIX pthreads doesn't provide an equivalent of THR_NEW_LWP in the pthreads_attr_* functions, I've added an emulation that should work for Solaris. Basically, if THR_NEW_LWP is set when ACE_OS::thr_create() is called, we use the ACE_OS::thr_{get,set}concurrency methods to increase the number of LWPs by one. * ace/Message_Block: Changed the default high water mark for an ACE_Message_Queue from 4K to 16K. This is useful since it allows applications to buffer more information before blocking. * ace/Log_Msg: Added a pair of operations that allow applications to acquire and release the synchronization lock used internally by the ACE_Log_Msg implementation. This allows applications to hold the lock atomically over a number of calls to ACE_Log_Msg, which is useful for composite operations like the following: // Make sure the following operations are run atomically! ACE_LOG_MSG->acquire (); while (c != '!') { if (c_stream.recv (&c, 1) == -1) ACE_DEBUG ((LM_DEBUG, "(%t) buffer recv from supplier failed\n")); else ACE_DEBUG ((LM_DEBUG, "%c", c)); } ACE_LOG_MSG->release (); * examples/IPC_SAP/UPIPE_SAP: Revised all of the UPIPE_Stream tests to make them more consistent and correct with respect to the new changes. * ace/Stream.cpp (link_i): There was a bug in the link_i() logic because we weren't also linking the other stream back to our stream. * ace/UPIPE_{Acceptor,Connector}: Modified both of these classes so that they don't * ace/Stream.cpp (close): Modified close() so that it now detects "double-closes" and ignores anything but the first one. * ace/UPIPE_Stream: Updated this class so that it no longer inherits from ACE_Stream (previously ACE_UPIPE_Stream had inherited from *both* ACE_Stream *and* ACE_SPIPE). There are several reasons we shouldn't inherit from ACE_Stream: 1. There are operations on ACE_Stream that don't make any sense on ACE_UPIPE_Stream (e.g., link(), unlink()). 2. ACE_Stream isn't really designed to be subclassed (e.g., it doesn't have virtual methods). 3. Not inheriting makes the interface cleaner, e.g., we now use send() and recv() methods consistently, rather than send_msg()/put() and recv_msg()/get(). 4. The return values from the I/O methods are now more consistent than they were before. * ace/Message_Block: The signature for the copy() method was incorrect. It should have been copy (const char *, .....) rather than copy (char *, ....). * examples/IPC_SAP/UPIPE_SAP: Together with Prashant, fixed up the ACE_UPIPE_Stream tests so they more cleverly (and correctly) utilize and illustrate various ACE concurrency features. Sat Jul 6 18:28:55 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Stream.cpp: Fixed some obscure bugs with Stream::unlink() and Stream::link(). These bugs were triggered by the ACE_UPIPE_Stream tests. We need to make sure that we don't have race conditions in the order in which ACE_UPIPE_Stream close() down. Prashant and I fixed this problem by (1) adding a lock to unlink() and link() and then creating unlink_i() and link_i() to perform the work and (2) being more careful about trying to unlink our side and the other side of a linked Stream. * ace/config-linux.h: According to Istvan Buki , Linux now supports the send_msg()/recv_msg() system calls, as well as UNIX domain sockets. Therefore, I've updated the config-linux*.h file to remove the existing restrictions. If this turns out not to be the case, please let me know. * ace/LSOCK.cpp (recv_handle): Added a change to some casts to make ACE compile with Linux. Thanks to Istvan Buki for reporting this. * apps/Gateway/Gateway/File_Parser.cpp (readword): Removed yet another use of: for (int x; foo(x); ) { } x = 10; Which is now a deprecated feature of C++. * include/makeinclude: added the -lw library to the GNU G++ platform*.GNU file in order to pick up the wide-character string functions. Fri Jul 5 18:11:44 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * Re-released version 4.0.26 for testing. * ace/CORBA_Handler.cpp (activate_service): Revised the code to use the Orbix macros for TRY/CATCH rather than try/catch. We need this to make legacy code work! Thanks to Irfan for pointing this out. * ace/Thread_Manager: Fixed a bunch of typos that grelims snuck in. Thanks to Jack Erickson for reporting this. * examples/IPC_SAP/TLI_SAP/ftp-server.cpp: Fixed some typos that were causing problems on AIX. Thanks to Greg Wilson for reporting this. * examples/Reactor/Misc/test_time_value.cpp (operator<<): Added a "const" in front of the ACE_Time_Value & in order to make things work correctly on AIX. Thanks to Greg Wilson for reporting this. * ace/SPIPE_Acceptor: Fixed some missing "returns" that had sprung up in the #else arm of the SPIPE code. Thanks to Greg Wilson for reporting this. * apps/Synch-Benchmarks/Benchmark: Fixed a typo that was causing the application to fail to compile on AIX. Thanks to Greg Wilson for reporting this. * Changed all uses of virtual int init (int, char **) to virtual int init (int, char *[]) to workaround bugs with MSVC++... * ace/OS.h: for POSIX pthreads, changed the definition of the THR_SCOPE_SYSTEM macro so that it has the same value as THR_BOUND. If this isn't done, then things don't quite work right when we implement the ACE_OS::thr_create() wrapper. Thu Jul 4 13:17:35 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Thread_Manager: Added a new method called thr_self() that *does* return a real handle that can be used by WaitForMultipleObjects, etc. Note that this new approach cleverly caches this handle in TSS in order to cut down on search time. Thanks to Jesper for pointing this technique out. * ace/OS.i (thr_self): After receiving comments from Jesper, undid the earlier change today that was returning a duplicated handle for ACE_OS::thr_self(). It turns out this is a bad idea because the handle most typically doesn't get released, which leads to handle leaks. * ace/Thread_Manager: Added a new private method called check_state(). This method extends existing code to be smarter about how we check to see what "state" (e.g., suspended, cancelled, etc.) a thread is in. The original code (which was a macro called ACE_CHECK_STATE) didn't behave correctly if we asked about the state of a thread that was different from ourselves! * ace/Thread: Modified the public interface to ACE_Thread::spawn_n() so that it now takes a void *stack[] and size_t stack_size[]. If stack != 0 it is assumed to be an array of n pointers to the base of the stacks to use for the threads being spawned. Likewise, if stack_size != 0 it is assumed to be an array of n values indicating how big each of the corresponding stacks are. This is useful since now we can spawn a group of threads each of which has its own custom stack and/or stack size. Thanks to Ashish Singhai for pointing out the need for this. * apps/Synch-Benchmarks: Updated the Synch benchmarks so that most of them work again. The trick is *not* to use ACE_OS::sleep () (which doesn't seem to be thread-friendly...) but instead to use ACE_OS::select() as a timer. * man: updated the manual pages and html pages to reflect all the recent changes. * ace/Malloc_T.cpp (open): Added a check to make sure that if init_acquire() fails we don't let this go by undetected... Thanks to Karlheinz for pointing out the need for this. * ace/OS.i (thr_getconcurrency): Fixed a subtle bug with the ACE_OS::thr_getconcurrency() function. I was mistakenly using ACE_ADAPT_RETVAL for the result of ::thr_getconcurrency(), which is clearly wrong! * ace/Service_Record.cpp (remove): Fixed a typo that was causing the removals of Modules in a dynamically configured Stream to go into infinite loops. * ace/OS.i (thr_self): Modified the ACE_OS::thr_self (hthread_t &) function so that it will return a *duplicate* of the current thread's pseudo-handle returned by GetCurrentThread(). This change is necessary because the pseudo-handle returned by GetCurrentThread() is pretty useless (e.g., it can't be used by any other thread to "wait" for this thread to exit). This new behavior is used in the examples/Reactor/ReactorEx test program. * ace/Service_Config.cpp: I'd forgotten to assign the delete_svc_rep_ flag when dynamically allocating the svc_rep_. This is fixed now. Wed Jul 3 20:09:44 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * Added a new subdirectory called $WRAPPER_ROOT/tests that contains the first phase of the ACE regression tests. * ace/Reactor.cpp (check_handles): Fixed an earlier fix with the ACE_Reactor::wait_for_multiple_events() method. The earlier fix had changed the exit condition of do/while loop to be while (nfound == -1 && this->handle_error () >= 0); However, this was causing signal handling to break... Therefore, the right fix is to keep the exit test as: while (nfound == -1 && this->handle_error () > 0); and instead fix handle_errors() so that it returns 1 if we're able to fix a bad handle... Thanks to Prashant and Irfan for tracking this down. * ace/OS: Finally broken down and added a new pair of ACE_OS functions called "last_error()". These basically call SetLastError/GetLastError on Win32 or they set/get errno on UNIX. * ace/config-linux.h: Fixed an annoying problem with struct msghdr in Linux by adding #define msg_accrights msg_control #define msg_accrightslen msg_controllen to the config-linux*.h files. Thanks to Michael R"uger for suggesting this. * ace/SOCK_IO.cpp (recv): Fixed a "bug" where ACE_SOCK_IO::{send,recv} allocates with: iovec *iovp = new iovec[total_tuples]; But deletes with: delete iovp; Thanks to the ever vigilant James Mansion (mansionj@lonnds.ml.com) for noticing this. Tue Jul 2 23:48:38 1996 Tim H. Harrison (harrison@lambada.cs.wustl.edu) * ace/Service_Config.h: Added ReactorEx to the singleton resources that the Service_Configurator holds. This includes accessors, destruction hooks, and event loop methods. * examples/Reactor/ReactorEx/README: There is a new example application for the ReactorEx. Please check out examples/Reactor/ReactorEx/README for details. Tue Jul 2 18:43:12 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * Released version 4.0.25 for testing. * examples/ASX/Message_Queue/priority_buffer.cpp: Added a new test program that illustrates the use of the new Message_Queue priority scheme. * ace/Message_Queue: Added new support for prioritized message enqueueing into the ACE_Message_Queue. Now, when an application uses ACE_Message_Queue::enqueue() the new Message_Block is inserted into the queue according to its msg_priority(). When dequeue_head() is used the item retrieved will then be the item of "highest priority" (priorities range from 0 to MAX_LONG). Note that the semantics of the existing enqueue methods, enqueue_head() and enqueue_tail(), remain unchanged. * ace/Message_Block: Changed the type of the priority in a message block to u_long rather than u_char. This gives us a much greater range of priorities! Mon Jul 1 01:12:08 1996 Douglas C. Schmidt (schmidt@tango.cs.wustl.edu) * ace/Thread.h: Changed a couple of mistyped comments. Thanks to the eagle eyes of Andres Kruse for noticing this. * ace/OS: added more comprehensive support for UNICODE to both the Win32 and UNIX OS adaptation layer. This new support automagically selects the appropriate implementation (i.e., either char * or wchar_t *) for the string comparison routines (which are used in places like ACE_Mem_Map). * ace/Service_Config: Split up the ACE_Service_Config::close() method into two parts: close_svcs() and close_singletons(). This makes it possible to remove svc.conf services without destroying Singletons like the Proactor, Reactor, etc. Thanks to Karlheinz for recommending this. * ace/Service_Config: Added flags for remembering who created the Singleton Proactor, Allocator, Thread_Manager, and Service_Repository (in addition to the Reactor, which I did last week). If we created these Singletons, then we are responsible for freeing them up. Thanks to Karlheinz for pointing out the need for this. Mon Jul 1 16:26:27 1996 Prashant Jain (pjain@merengue.cs.wustl.edu) * ace/Connector.cpp: Added two new arguments to connect () namely, "int flags" and "int perms". The Connector can now pass these two arguments to its template arguments (e.g., SOCK_Connector, SPIPE_Connector, etc.) when calling their connect() method. A consequence of doing this was that we had to modify the signature of the connect() method on some of the IPC_SAP classes (e.g., TLI_Connector, SOCK_Connector, and LSOCK_Connector). Note that these changes may break some existing code, particularly with TLI_Connector (see below), so beware... * ace/TLI_Connector.cpp: Changed the order of the connect() arguments to be more consistent with the rest of the IPC_SAP classes used with the Connector. Please note that existing examples which use TLI_Connector may need to be modified as a result of this change. * ace/OS.i (open): Modified ACE_OS::open() to use the argument perms to turn the flag FILE_FLAG_OVERLAPPED on and off for Win32. * ace/Service_Config.cpp (end_proactor_event_loop): Added new methods run_proactor_event_loop() and end_proactor_event_loop() which call handle_events on the Proactor. Mon Jul 1 02:15:34 1996 Tim H. Harrison (harrison@lambada.cs.wustl.edu) * ace/Proactor.h: Made ACE_Proactor an ACE_Event_Handler so that it can be registered with the ACE_ReactorEx. ACE_Proactor associates the same global HANDLE with every overlapped I/O operation. This global HANDLE can be registered with the ACE_ReactorEx. Therefore, by using the ACE_Proactor::handle_signal method as an adapter, we can now dispatch overlapped I/O and other "waitable" objects from a one ACE_ReactorEx running in a single thread of control. Thanks to James Mansion for setting us on the right path! * ace/ReactorEx.h: Added a ACE_ReactorEx to encapsulate Win32 WaitForMultipleObjects(). The ACE_ReactorEx handle_events() method calls ACE_Event_Handler::handle_signal when the corresponding Win32 HANDLE becomes signaled. This gives us a uniform abstraction for dispatching all "waitable" objects on Win32, including events related to I/O completion ports and events related to other forms of NT synchronization (such as mutexes, semaphores, threads, etc.). * ace/Timer_Queue.h (calculate_timeout): Added a calculate_timeout method to ACE_Timer_Queue. Also removed the same method from ACE_Reactor. This is so Reactor, ReactorEx, and Proactor can all reuse the calculations required by the Timer_Queue without duplicating code.