Revision de758970 cpus.c
b/cpus.c | ||
---|---|---|
319 | 319 |
exit(1); |
320 | 320 |
} |
321 | 321 |
} while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS)); |
322 |
|
|
323 |
#ifndef CONFIG_IOTHREAD |
|
324 |
if (sigismember(&chkset, SIGIO) || sigismember(&chkset, SIGALRM)) { |
|
325 |
qemu_notify_event(); |
|
326 |
} |
|
327 |
#endif |
|
322 | 328 |
} |
323 | 329 |
|
324 | 330 |
#else /* _WIN32 */ |
... | ... | |
368 | 374 |
|
369 | 375 |
sigemptyset(&set); |
370 | 376 |
sigaddset(&set, SIG_IPI); |
377 |
sigaddset(&set, SIGIO); |
|
378 |
sigaddset(&set, SIGALRM); |
|
371 | 379 |
pthread_sigmask(SIG_BLOCK, &set, NULL); |
372 | 380 |
|
373 | 381 |
pthread_sigmask(SIG_BLOCK, NULL, &set); |
374 | 382 |
sigdelset(&set, SIG_IPI); |
375 | 383 |
sigdelset(&set, SIGBUS); |
384 |
sigdelset(&set, SIGIO); |
|
385 |
sigdelset(&set, SIGALRM); |
|
376 | 386 |
r = kvm_set_signal_mask(env, &set); |
377 | 387 |
if (r) { |
378 | 388 |
fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(-r)); |
... | ... | |
381 | 391 |
#endif |
382 | 392 |
} |
383 | 393 |
|
394 |
#ifndef _WIN32 |
|
395 |
static sigset_t block_synchronous_signals(void) |
|
396 |
{ |
|
397 |
sigset_t set; |
|
398 |
|
|
399 |
sigemptyset(&set); |
|
400 |
if (kvm_enabled()) { |
|
401 |
/* |
|
402 |
* We need to process timer signals synchronously to avoid a race |
|
403 |
* between exit_request check and KVM vcpu entry. |
|
404 |
*/ |
|
405 |
sigaddset(&set, SIGIO); |
|
406 |
sigaddset(&set, SIGALRM); |
|
407 |
} |
|
408 |
|
|
409 |
return set; |
|
410 |
} |
|
411 |
#endif |
|
412 |
|
|
384 | 413 |
int qemu_init_main_loop(void) |
385 | 414 |
{ |
386 | 415 |
#ifndef _WIN32 |
387 | 416 |
sigset_t blocked_signals; |
388 | 417 |
int ret; |
389 | 418 |
|
390 |
sigemptyset(&blocked_signals);
|
|
419 |
blocked_signals = block_synchronous_signals();
|
|
391 | 420 |
|
392 | 421 |
ret = qemu_signalfd_init(blocked_signals); |
393 | 422 |
if (ret) { |
Also available in: Unified diff