Bug #15798 ยป fix-pthread-timer.patch
| thread_pthread.c | ||
|---|---|---|
|
pthread_t main_thread_id = vm->main_thread->thread_id;
|
||
|
struct pollfd pfd;
|
||
|
int timeout = -1;
|
||
|
int ccp;
|
||
|
pfd.fd = timer_pthread.low[0];
|
||
|
pfd.events = POLLIN;
|
||
|
while (system_working > 0) {
|
||
|
(void)poll(&pfd, 1, timeout);
|
||
|
(void)consume_communication_pipe(pfd.fd);
|
||
|
ccp = consume_communication_pipe(pfd.fd);
|
||
|
if (system_working > 0 && ATOMIC_CAS(timer_pthread.armed, 1, 1)) {
|
||
|
pthread_kill(main_thread_id, SIGVTALRM);
|
||
|
if (rb_signal_buff_size() || !ubf_threads_empty()) {
|
||
|
timeout = TIME_QUANTUM_MSEC;
|
||
|
}
|
||
|
else {
|
||
|
ATOMIC_SET(timer_pthread.armed, 0);
|
||
|
timeout = -1;
|
||
|
}
|
||
|
}
|
||
|
if (system_working > 0) {
|
||
|
if (ATOMIC_CAS(timer_pthread.armed, 1, 1)) {
|
||
|
pthread_kill(main_thread_id, SIGVTALRM);
|
||
|
if (rb_signal_buff_size() || !ubf_threads_empty()) {
|
||
|
timeout = TIME_QUANTUM_MSEC;
|
||
|
}
|
||
|
else {
|
||
|
ATOMIC_SET(timer_pthread.armed, 0);
|
||
|
timeout = -1;
|
||
|
}
|
||
|
}
|
||
|
else if (ccp) {
|
||
|
pthread_kill(main_thread_id, SIGVTALRM);
|
||
|
ATOMIC_SET(timer_pthread.armed, 0);
|
||
|
timeout = -1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||