summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Huston <shuston@riverace.com>2010-07-08 16:49:01 +0000
committerSteve Huston <shuston@riverace.com>2010-07-08 16:49:01 +0000
commit09d9419bafb28c7d36b5db544b1e0d30fa7464cf (patch)
tree2ec0209b4756660b59164f4a9726553898798bb5
parent3a3384d3e6710447adb08a481e6e03c3d155bb27 (diff)
downloadATCD-09d9419bafb28c7d36b5db544b1e0d30fa7464cf.tar.gz
ChangeLogTag:Tue May 4 21:23:44 UTC 2010 Chad Beaulac <chad@objectivesolutions.com>
-rw-r--r--ChangeLog19
-rw-r--r--ace/Service_Types.cpp9
2 files changed, 28 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index da08cca2e0d..e9f459deb0c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,6 +12,25 @@ Fri Jun 18 19:58:55 UTC 2010 Steve Huston <shuston@riverace.com>
a service contained in ACE itself.
Fix for Bugzilla #3856.
+Tue May 4 21:23:44 UTC 2010 Chad Beaulac <chad@objectivesolutions.com>
+
+ * ace/Service_Types.cpp:
+ One of problems is that ACE_Module_Type::name gets its
+ value from the svc.conf file. The ACE_Module that it references
+ gets its name from the static factory method used to create the
+ module. When the names don't match the call to ACE_Stream_Type::fini
+ fails to remove any ACE_Modules from the underlying ACE_Stream.
+ Since none of the ACE_Modules are removed, ACE_Module_Type::fini
+ tries to call fini on the ACE_Module reader and writer ACE_Task
+ instances. And they've already been deleted by ACE_Stream::close
+ called from ACE_Stream_Type::fini.
+
+ Reassigned ACE_Module::name in ACE_Module_Type::init to
+ ACE_Module_Type::name and fixed the SEGV at shutdown because of the
+ issue described above.
+
+ All of these issues are related: #3334 #3205 #2916 #3847
+
Fri Apr 23 09:38:35 EDT 2010 Steve Huston <shuston@riverace.com>
* ACE version 5.7a released.
diff --git a/ace/Service_Types.cpp b/ace/Service_Types.cpp
index 5c2c2fae3b7..16417e50755 100644
--- a/ace/Service_Types.cpp
+++ b/ace/Service_Types.cpp
@@ -185,6 +185,15 @@ ACE_Module_Type::init (int argc, ACE_TCHAR *argv[]) const
ACE_TRACE ("ACE_Module_Type::init");
void *obj = this->object ();
MT_Module *mod = (MT_Module *) obj;
+ //
+ // Change the Module's name to what's in the svc.conf file.
+ // We must do this so the names match up so everything shuts
+ // down properly during the call to ACE_Stream_Type::fini
+ // which calls MT_Stream::remove([name]) for all the modules.
+ // If the calls to remove fail, we end up with a double delete
+ // during shutdown. Bugzilla #3847
+ //
+ mod->name (this->name_);
MT_Task *reader = mod->reader ();
MT_Task *writer = mod->writer ();