This is the mail archive of the cygwin-developers@sourceware.cygnus.com 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]

longjmp problem


Hello,

There is a problem with setjmp/longjmp/signals/exceptions that can be
demonstrated by the following code:

static jmp_buf	env;
static sigset_t set = {0};

static void sig_handler(int sig)
{
    sigprocmask(SIG_UNBLOCK, &set, 0);
    longjmp(env, sig);
}

int main(int argc, char * * argv)
{
    sigaddset(&set, SIGSEGV);

    for ( int i = 0 ; i < 2; i++)
    {
        if ( setjmp(env) == 0 ) 
        {
            signal(SIGSEGV, ssig_handler);
            printf("exception ...");
            *(int*)0 = 1;
        }
        else
        {
            printf("trapped\n");
        }
    }
    return 0;

}

It traps exception only once and than hangs. The problem seems to be in
longjmp code. 
If I load CRTDLL.DLL dynamically and use setjmp/longjmp from 
there all works. I traced MS longjmp and noticed that it calls RtlUnwind 
which seems do the trick.
In addition this code works on Linux without signal unblocking - it is
necessary only if SIGSEGV is signaled by raise.

Does anyone have any opinion about this matter?

Regards
Vadim

-- 
*********************************************
Vadim Egorov, 1C      *       Вадим Егоров,1C
egorovv@1c.ru         *         egorovv@1c.ru
*********************************************


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