diff options
Diffstat (limited to 'ChangeLog')
-rw-r--r-- | ChangeLog | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog index a63b483848b..6b690b38a2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,82 @@ +Fri Sep 22 21:02:58 UTC 2006 Iliyan Jeliazkov <iliyan@ociweb.com> + + This change fixes bug#2612. See the description for the gory + details. In a nutshell, the problem is caused by the fact that + static services, loaded from a DLL, as part of a dynamic service + initialization can not be safely finalized when the dynamic + service's DLL gets unloaded. This was historically handled by + simply not unloading DLLs, and by finalizing all services at + process exit. With the introduction of the local configurations + feature, this changed. + + The finalization order was supposed to be guaranteed by the + ordering of the services in the repository. It really was a + kludge, because when dynamically loading and removing services + the order can change. Then whenever the process tries to clean + up, the dynamic service's DLL can be unloaded (because it gets + finalized first), and the static services' destructor code would + become inaccessible. The situation results in a SEGV at exit(). + + * ace/DLL.h: + * ace/DLL.cpp: + + Made assignment operator return a non-const reference to make it + well-formed. See C++ Standard, section "[special]". + + * ace/DLL_Manager.cpp: + * ace/Dynamic_Service_Base.cpp: + * ace/Parse_Node.cpp: + + Fixed formatting. + + * ace/Service_Gestalt.cpp: + + Added ACE_Service_Dynamic_Guard (formerly + ACE_Service_Type_Forward_Declaration_Guard) which helps to + resolve an issue with hybrid services, i.e. dynamic services, + accompanied by static services in the same DLL. Only automatic + instances of SDG are supposed to exist. Those are created during + (dynamic) service initialization and serve to: + + (a) Ensure the service we are loading is ordered last in the + repository, following any other services it may cause to + register, as part of its own registration. This is a common case + when loading dynamic services from DLLs - there are often static + initializers, which register static services. + + (b) The SDG instance destructor detects if the dynamic service + initialized successfully and "fixes-up" all the newly registered + static services to hold a reference to the DLL, from which they + have originated. + + Updated comments and formatting. + + * ace/Service_Object.h: + * ace/Service_Object.inl: + + Added void dll (const ACE_DLL&) to make it possible to + "relocate" services registered through static initializers found + in DLL's code segment(s). + + * ace/Service_Object.cpp: + + Modified ACE_Service_Type::fini() to ensure the DLL associated + with the service is properly closed. This in conjunction with + the gestalt changes above, makes it possible to safely and + completely unload a service. + + * ace/Service_Repository.h: + * ace/Service_Repository.cpp: + + Added relocate(), which allows association of a (static) service + objects with a DLL. Per changes to ACE_Service_Gestalt, + above. Added a counterpart private relocate_i(), which does not + obtain locks. + + * tests/Service_Config_Test.cpp: + + Minor test simplification. + Mon Sep 25 11:39:35 UTC 2006 Boris Kolpackov <boris@codesynthesis.com> * ace/Bound_Ptr.inl: |