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