Mail Archives: cygwin/2010/04/28/00:26:15
X-Recipient: | archive-cygwin AT delorie DOT com
|
X-SWARE-Spam-Status: | No, hits=-0.9 required=5.0 tests=BAYES_00,DKIM_ADSP_CUSTOM_MED,FREEMAIL_FROM,NML_ADSP_CUSTOM_MED,SPF_HELO_PASS,TW_BD,T_RP_MATCHES_RCVD,T_TO_NO_BRKTS_FREEMAIL
|
X-Spam-Check-By: | sourceware.org
|
To: | cygwin AT cygwin DOT com
|
connect(): | No such file or directory
|
From: | Nicholas Sherlock <n DOT sherlock AT gmail DOT com>
|
Subject: | Signal support under Cygwin
|
Date: | Wed, 28 Apr 2010 04:25:27 +0000 (UTC)
|
Lines: | 192
|
Message-ID: | <loom.20100428T060408-563@post.gmane.org>
|
Mime-Version: | 1.0
|
User-Agent: | Loom/3.14 (http://gmane.org/)
|
X-IsSubscribed: | yes
|
Mailing-List: | contact cygwin-help AT cygwin DOT com; run by ezmlm
|
List-Id: | <cygwin.cygwin.com>
|
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
|
Hi everybody,
I've got some code on Linux which attempts to take periodic samples of my multi-
threaded program to find out what task each thread is working on. For this I am
installing a signal handler for each thread, and periodically sending SIGUSR1 to
each thread I want to check with pthread_kill. This works flawlessly on Linux,
but crashes after a short interval on Cygwin on Windows 7 64-bit. My code is:
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <signal.h>
#include <unistd.h>
#include <pthread.h>
volatile sig_atomic_t pauses = 0;
static void profiling_sample(int signum) {
(void) signum;
sig_atomic_t old_value = pauses;
++old_value;
/* Might lose concurrent updates to 'pauses' here. Not a big deal. */
pauses = old_value;
}
static void * childthread(void * arg) {
(void) arg;
for (;;) {
sleep(1000);
}
}
#define NUM_THREADS 8
int main(void) {
int i;
pthread_t handles[NUM_THREADS];
struct sigaction action;
action.sa_handler = profiling_sample;
action.sa_flags = 0;
sigemptyset(&action.sa_mask);
assert(sigaction(SIGUSR1, &action, NULL) == 0);
for (i = 0; i < NUM_THREADS; i++) {
assert(pthread_create(&handles[i], NULL, childthread, NULL) ==
0);
}
printf("Delivered signals is at least:\n");
for (;;) {
for (i = 0; i < NUM_THREADS; i++) {
int err = pthread_kill(handles[i], SIGUSR1);
if (err) {
fprintf(stderr, "Error from pthread_kill
(%d)\n", err);
exit(-1);
}
}
printf("%d\n", pauses);
}
return EXIT_SUCCESS;
}
My Cygwin is:
$ uname -a
CYGWIN_NT-6.1-WOW64 NickLaptop 1.7.5(0.225/5/3) 2010-04-12 19:07 i686 Cygwin
I am building with:
gcc -std=gnu99 -g3 -W -Wall -o sigtest.exe sigtest.c -lpthread
A typical run on Cygwin shows the "pauses" value counting upwards to about 4000
before the program either hangs without printing anything or causes a segfault
(without a useful looking stacktrace):
(gdb) thread apply all where
Thread 10 (thread 4444.0x179c):
#0 0x1b4bdb2c in ?? ()
#1 0x000003e8 in ?? ()
#2 0x1b4bce64 in ?? ()
#3 0x1b4bcd98 in ?? ()
#4 0x610df995 in pthread::thread_init_wrapper () from /usr/bin/cygwin1.dll
Backtrace stopped: frame did not save the PC
Thread 9 (thread 4444.0x14fc):
#0 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x77490816 in WaitForSingleObjectEx ()
from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x000001e4 in ?? ()
#4 0x00000000 in ?? ()
Thread 8 (thread 4444.0x15a4):
#0 0x77bef8dd in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef8dd in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x7748d232 in WriteFile ()
from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x00000124 in ?? ()
#4 0x00000000 in ?? ()
Thread 7 (thread 4444.0x1610):
#0 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x77490816 in WaitForSingleObjectEx ()
from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x000000f0 in ?? ()
#4 0x00000000 in ?? ()
Thread 6 (thread 4444.0x144c):
#0 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x77490816 in WaitForSingleObjectEx ()
from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x000000f0 in ?? ()
#4 0x00000000 in ?? ()
Thread 5 (thread 4444.0x125c):
#0 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x77490816 in WaitForSingleObjectEx ()
from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x000000f0 in ?? ()
#4 0x00000000 in ?? ()
Thread 4 (thread 4444.0x414):
#0 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x77490816 in WaitForSingleObjectEx ()
from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x000000f0 in ?? ()
#4 0x00000000 in ?? ()
Thread 3 (thread 4444.0x804):
#0 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x77490816 in WaitForSingleObjectEx ()
from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x000001dc in ?? ()
#4 0x00000000 in ?? ()
Thread 2 (thread 4444.0x150c):
#0 0x77bef8a5 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef8a5 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x7748d0c5 in ReadFile () from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x00000120 in ?? ()
#4 0x00000000 in ?? ()
Thread 1 (thread 4444.0xa8):
#0 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#1 0x77bef871 in ntdll!RtlUpdateClonedSRWLock ()
from /cygdrive/c/Windows/system32/ntdll.dll
#2 0x77490816 in WaitForSingleObjectEx ()
from /cygdrive/c/Windows/syswow64/KernelBase.dll
#3 0x000001cc in ?? ()
#4 0x00000000 in ?? ()
#0 0x1b4bdb2c in ?? ()
Is this supposed to work?
Cheers,
Nicholas Sherlock
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
- Raw text -