Revision 712ae480 cpus.c
b/cpus.c | ||
---|---|---|
346 | 346 |
} |
347 | 347 |
} |
348 | 348 |
|
349 |
static int qemu_signalfd_init(sigset_t mask)
|
|
349 |
static int qemu_signal_init(void)
|
|
350 | 350 |
{ |
351 | 351 |
int sigfd; |
352 |
sigset_t set; |
|
352 | 353 |
|
353 |
sigfd = qemu_signalfd(&mask); |
|
354 |
#ifdef CONFIG_IOTHREAD |
|
355 |
/* SIGUSR2 used by posix-aio-compat.c */ |
|
356 |
sigemptyset(&set); |
|
357 |
sigaddset(&set, SIGUSR2); |
|
358 |
pthread_sigmask(SIG_UNBLOCK, &set, NULL); |
|
359 |
|
|
360 |
sigemptyset(&set); |
|
361 |
sigaddset(&set, SIGIO); |
|
362 |
sigaddset(&set, SIGALRM); |
|
363 |
sigaddset(&set, SIG_IPI); |
|
364 |
sigaddset(&set, SIGBUS); |
|
365 |
pthread_sigmask(SIG_BLOCK, &set, NULL); |
|
366 |
#else |
|
367 |
sigemptyset(&set); |
|
368 |
sigaddset(&set, SIGBUS); |
|
369 |
if (kvm_enabled()) { |
|
370 |
/* |
|
371 |
* We need to process timer signals synchronously to avoid a race |
|
372 |
* between exit_request check and KVM vcpu entry. |
|
373 |
*/ |
|
374 |
sigaddset(&set, SIGIO); |
|
375 |
sigaddset(&set, SIGALRM); |
|
376 |
} |
|
377 |
#endif |
|
378 |
|
|
379 |
sigfd = qemu_signalfd(&set); |
|
354 | 380 |
if (sigfd == -1) { |
355 | 381 |
fprintf(stderr, "failed to create signalfd\n"); |
356 | 382 |
return -errno; |
... | ... | |
438 | 464 |
static void qemu_kvm_eat_signals(CPUState *env) |
439 | 465 |
{ |
440 | 466 |
} |
467 |
|
|
468 |
static int qemu_signal_init(void) |
|
469 |
{ |
|
470 |
return 0; |
|
471 |
} |
|
472 |
|
|
441 | 473 |
#endif /* _WIN32 */ |
442 | 474 |
|
443 | 475 |
#ifndef CONFIG_IOTHREAD |
... | ... | |
471 | 503 |
#endif |
472 | 504 |
} |
473 | 505 |
|
474 |
#ifndef _WIN32 |
|
475 |
static sigset_t block_synchronous_signals(void) |
|
476 |
{ |
|
477 |
sigset_t set; |
|
478 |
|
|
479 |
sigemptyset(&set); |
|
480 |
sigaddset(&set, SIGBUS); |
|
481 |
if (kvm_enabled()) { |
|
482 |
/* |
|
483 |
* We need to process timer signals synchronously to avoid a race |
|
484 |
* between exit_request check and KVM vcpu entry. |
|
485 |
*/ |
|
486 |
sigaddset(&set, SIGIO); |
|
487 |
sigaddset(&set, SIGALRM); |
|
488 |
} |
|
489 |
|
|
490 |
return set; |
|
491 |
} |
|
492 |
#endif |
|
493 |
|
|
494 | 506 |
int qemu_init_main_loop(void) |
495 | 507 |
{ |
496 |
#ifndef _WIN32 |
|
497 |
sigset_t blocked_signals; |
|
498 | 508 |
int ret; |
499 | 509 |
|
500 |
blocked_signals = block_synchronous_signals(); |
|
501 |
|
|
502 |
ret = qemu_signalfd_init(blocked_signals); |
|
510 |
ret = qemu_signal_init(); |
|
503 | 511 |
if (ret) { |
504 | 512 |
return ret; |
505 | 513 |
} |
506 |
#endif |
|
507 | 514 |
|
508 | 515 |
qemu_init_sigbus(); |
509 | 516 |
|
... | ... | |
651 | 658 |
pthread_sigmask(SIG_UNBLOCK, &set, NULL); |
652 | 659 |
} |
653 | 660 |
|
654 |
static sigset_t block_io_signals(void) |
|
655 |
{ |
|
656 |
sigset_t set; |
|
657 |
|
|
658 |
/* SIGUSR2 used by posix-aio-compat.c */ |
|
659 |
sigemptyset(&set); |
|
660 |
sigaddset(&set, SIGUSR2); |
|
661 |
pthread_sigmask(SIG_UNBLOCK, &set, NULL); |
|
662 |
|
|
663 |
sigemptyset(&set); |
|
664 |
sigaddset(&set, SIGIO); |
|
665 |
sigaddset(&set, SIGALRM); |
|
666 |
sigaddset(&set, SIG_IPI); |
|
667 |
sigaddset(&set, SIGBUS); |
|
668 |
pthread_sigmask(SIG_BLOCK, &set, NULL); |
|
669 |
|
|
670 |
return set; |
|
671 |
} |
|
672 |
|
|
673 | 661 |
int qemu_init_main_loop(void) |
674 | 662 |
{ |
675 | 663 |
int ret; |
676 |
sigset_t blocked_signals; |
|
677 | 664 |
|
678 | 665 |
qemu_init_sigbus(); |
679 | 666 |
|
680 |
blocked_signals = block_io_signals(); |
|
681 |
|
|
682 |
ret = qemu_signalfd_init(blocked_signals); |
|
667 |
ret = qemu_signal_init(); |
|
683 | 668 |
if (ret) { |
684 | 669 |
return ret; |
685 | 670 |
} |
Also available in: Unified diff