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 Subject: Signal support under Cygwin Date: Wed, 28 Apr 2010 04:25:27 +0000 (UTC) Lines: 192 Message-ID: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit 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: List-Subscribe: List-Archive: List-Post: List-Help: , 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 #include #include #include #include #include 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