Signal occasionally causes thread inside win32 api to be suspended?
Jon TURNEY
jon.turney@dronecode.org.uk
Sun Dec 8 17:36:00 GMT 2013
I don't really understand the intricacies of cygwin signal delivery, but I see
that it can suspend the target thread to determine if it's in a safe place to
deliver the signal (outside a win32 API call). I think that sometimes the
thread is not correctly resumed.
This appears to be the cause of been a long-standing problem with the X.org X
server on cygwin, which we work around by disabling smart-scheduling (no great
loss), but I've only just recently understood enough about the problem to
produce a STC.
If you run the attached for a while, it stops. According to Process Hacker,
the main thread is in the suspended state, inside ntdll.dll. e.g.:
$ uname -a
CYGWIN_NT-5.1 byron 1.7.26(0.271/5/3) 2013-11-29 11:25 i686 Cygwin
$ ./signal-in-kernel32
hMod is 0x7c800000
iteration 1
[...]
iteration 139325
# stops!
-------------- next part --------------
#include <assert.h>
#include <sys/time.h>
#include <signal.h>
#include <stdio.h>
#include <windows.h>
long SmartScheduleInterval = 20; /* ms */
long SmartScheduleTime = 0;
static void
SmartScheduleTimer(int sig)
{
SmartScheduleTime += SmartScheduleInterval;
}
void
SmartScheduleStartTimer(void)
{
struct itimerval timer;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = SmartScheduleInterval * 1000;
timer.it_value.tv_sec = 0;
timer.it_value.tv_usec = SmartScheduleInterval * 1000;
setitimer(ITIMER_REAL, &timer, 0);
}
int main()
{
/* Set up the timer signal function */
struct sigaction act;
act.sa_handler = SmartScheduleTimer;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGALRM);
if (sigaction(SIGALRM, &act, 0) < 0) {
perror("sigaction failed");
return -1;
}
HMODULE hMod = LoadLibraryEx("kernel32.dll", NULL, 0);
assert(hMod);
printf("hMod is %p\n", hMod);
/* start timer */
SmartScheduleStartTimer();
/* Loop forever, spending most of our time inside ntdll */
int i = 0;
while (1) {
void *gpa = GetProcAddress(hMod, "GetProcAddress");
assert(gpa);
i++;
printf("iteration %d\n", i);
}
}
-------------- next part --------------
--
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
More information about the Cygwin
mailing list