This is the mail archive of the cygwin 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: 64 bit Cywgin 2.5.2 on Wine: python fails with sem_init: Invalid argument


Hi Qian,

On Jul  4 10:45, Qian Hong wrote:
> Hi folks,
> 
> When compiling 64 bit Cygwin on Wine, I found a python{2,3} failure
> when building documentation [1]:
> 
> xmlto --skip-validation --with-dblatex pdf -o cygwin-ug-net/ -m
> /drone/src/github.com/cygwin/cygwin/winsup/doc/fo.xsl
> /drone/src/github.com/cygwin/cygwin/winsup/doc/cygwin-ug-net.xml
> sem_init: Invalid argument

What is python calling sem_init for here?!?  That means you need to
start cygserver just to build the Cygwin docs natively.  Oh well.

> [...]
> According to my previous experience this happens with previous version
> of Cygwin 64 bit on Wine, but works fine on Windows, and works fine on
> 32 bit Cygwin on Wine. I can't test latest git HEAD Cygwin version due
> to another known failure.

Yeah, Vista++ compatiblity...

> I tried to track down the problem, and I found during the call of
> sem_init(sem, pshared=0, value=1), in some case pshared and value were
> unexpectedly changed to large integers after
> verifyable_object_isvalid().
> 
> I tried to reproduce with a simplified test case, and got the below
> code which behaviors wrong but not exactly in the same way:
> 
> #include <unistd.h>
> #include <stdlib.h>
> #include <string.h>
> #include <semaphore.h>
> #include <pthread.h>
> 
> 
> int
> main(int argc, char *argv[])
> {
>     sem_t *p_sem = malloc(sizeof(sem_t));
> 
>     memset(p_sem, 0xcc, sizeof(sem_t)); /* trigger exception handling
> code in Cygwin sem_init()-->verifyable_object_isvalid() */

This is perfectly valid.  The verifyable_object_isvalid code performs
an access check which results in an exception for invalid objects,
but which is catched by the surrounding __try/__except code.

>     sem_init(p_sem, 0, 1);
> 
>     return 0;
> }
> 
> Compiled using Cygwin gcc -pthread, The above code works fine on
> Cygwin on Windows and 32 bit Cygwin on Wine, but causes a stack
> overflow on 64 bit Cygwin on Wine. Unfortunately it does not fail
> exatly in the same way to Cygiwn python, but at least it brings some
> interesting question.

Stack overflow sounds weird.  The execption handling in Cygwin isn't
perfect, but an exception in verifyable_object_isvalid should not screw
up the stack.

> I think it is a Wine bug which does not handle exception correctly,
> and I'm trying to track down deeper. At the time could anyone provide
> some hint which piece of Cygwin code could I learn to write a pure
> Win32 test case emulating the above example?

Have a look at verifyable_object_isvalid in general, plus how the
exception handling in Cygwin on 64 bit works.  I'd suggest to take
a look into the implementation of the __try/__except macros in cygtls.h
and the exception::myfault handler in exceptions.cc.

> I also attached +seh log comparing 64 bit Cygwin and 32 bit Cygwin on
> Wine, which show the stackoverflow on 64 bit but handles fine on 32
> bit, hopefully that helps. I created a Wine bug on [2].

Puh, I admit that it doesn't help me much.  As a rough guess I'd say
that the unwinder failed to unwind correctly for some reason, but I also
freely admit that my knowledge on 64 bit unwinding is not exactly
complete.  I wouldn't exclude the possibility of a bug in Cygwin here.

May I point out http://www.nynaeve.net/?p=113, which is the last part
of a series on 64 bit exception handling and which has pointers to all
previous parts of the series.  It helped me much to get 64bit exception
handling in Cygwin going.


HTH,
Corinna

-- 
Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Maintainer                 cygwin AT cygwin DOT com
Red Hat

Attachment: signature.asc
Description: PGP signature


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