This is the mail archive of the cygwin-developers mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [1.7.0-60] crash on exit on c++ program (octave)


Dave Korn wrote:
> Marco Atzeri wrote:
>> Hi,
>> I was building the latest octave-3.2.2 on cygwin-1.7.0-60
>> and I found that the program crash on exit.
>> A single command "exit" is enough to core dump the program; for the rest it is working as expected and pass all the build test.
>>
>> Also the previous octave-3.2.0 that I build/released 
>> on 29th June (probably 1.7.0-50 time) is crashing with 
>> cygwin 1.7.0-60. 
>> Testing previous cygwin versions I found that octave-3.2.0
>> works fine with 1.7.0-52 and crashes with 1.7.0-56. 
>>
>> Could Dave's change mentioned here
>> http://cygwin.com/snapshots/winsup-changelog-20090724-20090801
>> be the cause ?
> 
>   The problem is related to termination sequence.  octave calls dlclose() for
> all the modules it loads, from octave_dld_function::~octave_dld_function() at
> shutdown time.  The modules in question have already had their dtors run, and
> dlclose() causes them to be run a second time.
> 
>   We should probably make running the dtors idempotent, or unlink each dll
> from the dll_list as we go.  I need to think about this for a little while,
> more later.

  The solution could be as simple as this.  Just don't call dtors for dlopen'd
DLLs when we run the global dll dtors.  If the application dlcloses them,
their dtors get run then.  If it doesn't, they'll be run much later when the
dlopen'd module receives DLL_PROCESS_DETACH as everything is being closed.
Only thing I'm wondering about is if we shouldn't forcibly dlclose any
left-over modules as part of the dtors sequence so that they run before the
newlib i/o shutdown.  Anyone got an opinion?

    cheers,
      DaveK
Index: winsup/cygwin/dll_init.cc
===================================================================
RCS file: /cvs/src/src/winsup/cygwin/dll_init.cc,v
retrieving revision 1.65
diff -p -u -r1.65 dll_init.cc
--- winsup/cygwin/dll_init.cc	13 Aug 2009 07:35:49 -0000	1.65
+++ winsup/cygwin/dll_init.cc	20 Aug 2009 19:28:11 -0000
@@ -35,7 +35,8 @@ dll_global_dtors ()
   dll_global_dtors_recorded = false;
   if (recorded && dlls.start.next)
     for (dll *d = dlls.end; d != &dlls.start; d = d->prev)
-      d->p.run_dtors ();
+      if (d->type != DLL_LOAD)
+	d->p.run_dtors ();
 }
 
 /* Run all constructors associated with a dll */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]