Revision 55541c8a cpus.c

b/cpus.c
318 318
static QemuCond qemu_pause_cond;
319 319
static QemuCond qemu_work_cond;
320 320

  
321
static void tcg_block_io_signals(void);
322
static void kvm_block_io_signals(CPUState *env);
321
static void tcg_init_ipi(void);
322
static void kvm_init_ipi(CPUState *env);
323 323
static void unblock_io_signals(void);
324 324

  
325 325
int qemu_init_main_loop(void)
......
464 464
    if (kvm_enabled())
465 465
        kvm_init_vcpu(env);
466 466

  
467
    kvm_block_io_signals(env);
467
    kvm_init_ipi(env);
468 468

  
469 469
    /* signal CPU creation */
470 470
    env->created = 1;
......
487 487
{
488 488
    CPUState *env = arg;
489 489

  
490
    tcg_block_io_signals();
490
    tcg_init_ipi();
491 491
    qemu_thread_self(env->thread);
492 492

  
493 493
    /* signal CPU creation */
......
532 532
    exit_request = 1;
533 533
}
534 534

  
535
static void tcg_block_io_signals(void)
535
static void tcg_init_ipi(void)
536 536
{
537 537
    sigset_t set;
538 538
    struct sigaction sigact;
539 539

  
540
    sigemptyset(&set);
541
    sigaddset(&set, SIGUSR2);
542
    sigaddset(&set, SIGIO);
543
    sigaddset(&set, SIGALRM);
544
    sigaddset(&set, SIGCHLD);
545
    pthread_sigmask(SIG_BLOCK, &set, NULL);
540
    memset(&sigact, 0, sizeof(sigact));
541
    sigact.sa_handler = cpu_signal;
542
    sigaction(SIG_IPI, &sigact, NULL);
546 543

  
547 544
    sigemptyset(&set);
548 545
    sigaddset(&set, SIG_IPI);
549 546
    pthread_sigmask(SIG_UNBLOCK, &set, NULL);
550

  
551
    memset(&sigact, 0, sizeof(sigact));
552
    sigact.sa_handler = cpu_signal;
553
    sigaction(SIG_IPI, &sigact, NULL);
554 547
}
555 548

  
556 549
static void dummy_signal(int sig)
557 550
{
558 551
}
559 552

  
560
static void kvm_block_io_signals(CPUState *env)
553
static void kvm_init_ipi(CPUState *env)
561 554
{
562 555
    int r;
563 556
    sigset_t set;
564 557
    struct sigaction sigact;
565 558

  
566
    sigemptyset(&set);
567
    sigaddset(&set, SIGUSR2);
568
    sigaddset(&set, SIGIO);
569
    sigaddset(&set, SIGALRM);
570
    sigaddset(&set, SIGCHLD);
571
    sigaddset(&set, SIG_IPI);
572
    pthread_sigmask(SIG_BLOCK, &set, NULL);
573

  
574
    pthread_sigmask(SIG_BLOCK, NULL, &set);
575
    sigdelset(&set, SIG_IPI);
576

  
577 559
    memset(&sigact, 0, sizeof(sigact));
578 560
    sigact.sa_handler = dummy_signal;
579 561
    sigaction(SIG_IPI, &sigact, NULL);
580 562

  
563
    pthread_sigmask(SIG_BLOCK, NULL, &set);
564
    sigdelset(&set, SIG_IPI);
581 565
    r = kvm_set_signal_mask(env, &set);
582 566
    if (r) {
583 567
        fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(r));

Also available in: Unified diff