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: Statically initialising pthread attributes in dynamic dlls.

On Mon, Feb 22, 2010 at 01:01:38PM +0100, Corinna Vinschen wrote:
>On Feb 22 12:34, Corinna Vinschen wrote:
>> On Feb 22 10:33, Andrew West wrote:
>> > Trying to initialise a pthread attribute in a static variable seems
>> > to cause a segfault. I've attach a simple test case compiled using;
>> > 
>> > g++ -g mutex.cpp -o mutex.dll -lpthread
>> > g++ -g test.cpp -o test.exe -ldl
>> > 
>> > I've cropped the code down to the essential bits, so no error
>> > reporting if it can't find the dll, etc.
>> > 
>> > The only other bits of information I can give which might or might
>> > not be helpful are;
>> > 
>> > 1) Calling pthread_mutexattr_init in a static variable in the
>> > executable works.
>> > 2) If I remove the pthread_mutexattr_init/pthread_mutexattr_destroy
>> > calls it works.
>> > 3) Delaying the pthread_mutexattr_init call until the first time the
>> > Mutex class is used works BUT then the
>> > segfault happens when dlclose is called.
>> > 
>> > I haven't managed to track down the cause of the segfault yet, I'm
>> > getting a bit lost in the debugger :/
>> I did.
>> It's the verifyable_object_isvalid() function in  The
>> statement
>>   if ((*object)->magic != magic)
>> results in a SEGV since *object is NULL.  That should not be a problem,
>> in theory, since that's what the efault handler should be good for.
>> But for some reason, after this SEGV occured, nothing happens, it just
>> crashes.
>> Are the constructors called before the exception handling has been
>> set up?  The _cytgtls::handle_exception methid is never called.
>Beep!  Wrong answer.  Actually the exception handler is called and
>me.return_from_fault() is called as well.  But for some reason, which
>is beyond me, it doesn't return from return_from_fault().  Instead,
>it steps into the OS and gets terminated.  So there *is* something
>not quite ok with the fault handling in this case.
>Btw., I can avoid all the weird effects by changing one single line:
>RCS file: /cvs/src/src/winsup/cygwin/,v
>retrieving revision 1.220
>diff -u -p -r1.220
>---	12 Feb 2010 20:07:13 -0000	1.220
>+++	22 Feb 2010 12:00:37 -0000
>@@ -110,7 +110,7 @@ verifyable_object_isvalid (void const *o
>       (static_ptr2 && *object == static_ptr2) ||
>       (static_ptr3 && *object == static_ptr3))
>-  if ((*object)->magic != magic)
>+  if (!*object || (*object)->magic != magic)
>     return INVALID_OBJECT;
>   return VALID_OBJECT;
> }
>Unfortunately it wouldn't help if the object is mallocated so that
>*object is some random value.

I'll look into it.  I have threads somewhat pulled apart at this point
(heh) so any changes you make will likely conflict with my sandbox.

It wouldn't be a terrible thing to check this for NULL early in the
function since it's a cheap test but we do have to figure out why the
efault handler isn't properly triggering since that would be

Have you tried regenerating tlsoffsets.h, just in case?


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