delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2004/08/30/06:43:33

Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com
Date: Mon, 30 Aug 2004 13:43:50 +0300
To: cygwin AT cygwin DOT com
Subject: Re: signal delivery problem (with pthreads)
Message-ID: <20040830104350.GA461@tonfa>
References: <20040827181156 DOT GB2008 AT tonfa> <20040828001709 DOT GA3261 AT coe DOT casa DOT cgf DOT cx>
Mime-Version: 1.0
In-Reply-To: <20040828001709.GA3261@coe.casa.cgf.cx>
User-Agent: Mutt/1.3.28i
Organization: Ulysses
From: "Valery A. Frolov" <vaf AT ulysses DOT kiev DOT ua>
X-IsSubscribed: yes

--FkmkrVfFsRoUs1wW
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hello,

On Fri, 27 Aug 2004 20:17:09 -0400, Christopher Faylor wrote:
> Sorry, but if this is really a problem, you're going to have to provide a
> simple test case which reproduces it.  Providing a description of the
> symptoms is not going to do it and neither is unsolicited strace output.

Sorry. My fault.

After this my shame I started exploring the cygwin mail list archive.

At first I found out this:
http://sources.redhat.com/ml/cygwin/2004-04/msg00393.html

And after while I've got (IMHO) a little test source (attached) to
reproduce the problem.

$ gcc-2 -Wall -O2 -W -g -o sig_bug.exe sig_bug.c -lpthread
$ gdb sig_bug.exe
(gdb) r
Starting program: /home/Valery/tmp/sig_bug.exe
new thread start
got signal 30
OK, press any key to exit...    <-- there was NO hitting the key
got signal 30
got signal 30                   <-- twice!
select was interrupted 1 times
                                <-- NO "new thread exit" message

Program received signal SIGSEGV, Segmentation fault.
[Switching to thread 58.0x75]
0x00000001 in ?? ()
(gdb) bt
#0  0x00000001 in ?? ()
#1  0x00401080 in sig_hnd ()
#2  0x00401169 in _blah (arg=0x0) at sig_bug.c:45
#3  0x61084329 in cygwin1!__getreent () from /usr/bin/cygwin1.dll
#4  0x610035c4 in getprogname () from /usr/bin/cygwin1.dll
#5  0x6100357a in getprogname () from /usr/bin/cygwin1.dll


As noted in my previous message, 1.5.10-3 and 20040821 are both affected.
1.5.9-1 is not tested. 1.5.7-1 is not affected.

I'll send an additional data only on request (to not be annoying).

And three more things.

First. On strace from 1.5.10-3 (25 May 2004) the sig_bug.exe is crashed
without any of "got signal 30" messages in the program output to stdio.
On strace from 1.5.7-1 (30 Jan 2004) all OK. (just FYI)

Second. I tested various versions of cygwin1.dll by placing it and
sig_bug.exe in one empty directory and just ran sig_bug.exe. There were
no additional processes in the memory that used the cygwin1.dll.
Cygserver.exe was not placed in that directory. The CYGWIN environment
variable was not set.

Third. On 1.5.7-1 the count of "interrupted select" was around 15-30
_thousands_. Is it normal? On 1.5.10-3 and 20040821 always only 1
interruption was shown.

WBR,
 Valery

--FkmkrVfFsRoUs1wW
Content-Type: text/x-csrc; charset=us-ascii
Content-Disposition: attachment; filename="sig_bug.c"

// sig_bug.c - test signal delivery bug with pthreads in cygwin.
//             Affected: 1.5.10-3, snapshot 20040821, 1.5.9-1
//             Not affected: 1.5.7-1

#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <pthread.h>

#define SIGNAL   SIGUSR1

#define STR(s)   #s
#define XSTR(s)  STR(s)

const char msg[] = "got signal " XSTR(SIGNAL) "\r\n";

static void sig_hnd(int sig)
{
   write(1, msg, sizeof(msg) - 1);
}

static void my_sleep(int sec)
{
   struct timeval tv;
   time_t         curtime, endtime;
   int            cnt = 0;

   endtime = time(NULL) + sec;
   while ((curtime = time(NULL)) < endtime) {
      tv.tv_sec = endtime - curtime;
      tv.tv_usec = 0;
      if (select(0, NULL, NULL, NULL, &tv) == 0 || errno != EINTR)
          break;
      cnt++;
   }
   if (cnt)
      printf("select was interrupted %d times\n", cnt);
}

static void *_blah(void *arg)
{
   printf("new thread start\n");
   my_sleep(3);
   printf("new thread exit\n");
   return NULL;
}

int main()
{
   pthread_t blah;
   signal(SIGNAL, sig_hnd);
   if (pthread_create(&blah, NULL, _blah, NULL)!=0)
      return perror("CREATE"), 1;
   sleep(1);
   if (pthread_kill(blah, SIGNAL) != 0)
      return perror("KILL"), 1;
   sleep(1);
   if (pthread_kill(blah, SIGNAL) != 0)
      return perror("KILL"), 1;
   printf("OK, press any key to exit...\n");
   getchar();
   return 0;
}


--FkmkrVfFsRoUs1wW
Content-Type: text/plain; charset=us-ascii

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/
--FkmkrVfFsRoUs1wW--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019