Subversion Repositories HelenOS

Rev

Rev 2836 | Rev 2839 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2836 Rev 2837
Line 612... Line 612...
612
 
612
 
613
static void kbox_thread_proc(void *arg)
613
static void kbox_thread_proc(void *arg)
614
{
614
{
615
    call_t *call;
615
    call_t *call;
616
    int method;
616
    int method;
-
 
617
    bool done;
-
 
618
    ipl_t ipl;
617
 
619
 
618
    (void)arg;
620
    (void)arg;
619
    klog_printf("kbox_thread_proc()");
621
    klog_printf("kbox_thread_proc()");
-
 
622
    done = false;
-
 
623
 
620
    while (1) {
624
    while (!done) {
621
        klog_printf("kbox: wait for call");
625
        klog_printf("kbox: wait for call");
622
        call = ipc_wait_for_call(&TASK->kernel_box, SYNCH_NO_TIMEOUT,
626
        call = ipc_wait_for_call(&TASK->kernel_box, SYNCH_NO_TIMEOUT,
623
            SYNCH_FLAGS_NONE);
627
            SYNCH_FLAGS_NONE);
-
 
628
 
624
        if (call != NULL) {
629
        if (call != NULL) {
625
            method = IPC_GET_METHOD(call->data);
630
            method = IPC_GET_METHOD(call->data);
626
 
631
 
627
            if (method == IPC_M_DEBUG_ALL) {
632
            if (method == IPC_M_DEBUG_ALL) {
628
                udebug_call_receive(call);
633
                udebug_call_receive(call);
629
            }
634
            }
-
 
635
 
-
 
636
            if (method == IPC_M_PHONE_HUNGUP) {
-
 
637
                klog_printf("kbox: handle hangup message\n");
-
 
638
                IPC_SET_RETVAL(call->data, 0);
-
 
639
                ipc_answer(&TASK->kernel_box, call);
-
 
640
 
-
 
641
                ipl = interrupts_disable();
-
 
642
                spinlock_lock(&TASK->lock);
-
 
643
                spinlock_lock(&TASK->answerbox.lock);
-
 
644
                if (list_empty(&TASK->answerbox.connected_phones)) {
-
 
645
                    /* Last phone has been disconnected */
-
 
646
                    TASK->kb_thread = NULL;
-
 
647
                    done = true;
-
 
648
                    printf("phone list is empty\n");
-
 
649
                }
-
 
650
                spinlock_unlock(&TASK->answerbox.lock);
-
 
651
                spinlock_unlock(&TASK->lock);
-
 
652
                interrupts_restore(ipl);
-
 
653
            }
630
        }
654
        }
631
    }
655
    }
-
 
656
 
-
 
657
    klog_printf("kbox: finished");
632
}
658
}
633
 
659
 
634
/**
660
/**
635
 * Connect phone to a task kernel-box specified by id.
661
 * Connect phone to a task kernel-box specified by id.
636
 *
662
 *
Line 663... Line 689...
663
        ta->kb_thread = thread_create(kbox_thread_proc,
689
        ta->kb_thread = thread_create(kbox_thread_proc,
664
            NULL, ta, 0, "kbox", false);
690
            NULL, ta, 0, "kbox", false);
665
        if (!ta->kb_thread)
691
        if (!ta->kb_thread)
666
            return ENOMEM;
692
            return ENOMEM;
667
 
693
 
-
 
694
        thread_detach(ta->kb_thread);
668
        thread_ready(ta->kb_thread);
695
        thread_ready(ta->kb_thread);
669
    }
696
    }
670
 
697
 
671
    return newphid;
698
    return newphid;
672
}
699
}