Subversion Repositories HelenOS

Rev

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

Rev 2071 Rev 2183
Line 372... Line 372...
372
void ipc_cleanup(void)
372
void ipc_cleanup(void)
373
{
373
{
374
    int i;
374
    int i;
375
    call_t *call;
375
    call_t *call;
376
    phone_t *phone;
376
    phone_t *phone;
-
 
377
    DEADLOCK_PROBE_INIT(p_phonelck);
377
 
378
 
378
    /* Disconnect all our phones ('ipc_phone_hangup') */
379
    /* Disconnect all our phones ('ipc_phone_hangup') */
379
    for (i=0;i < IPC_MAX_PHONES; i++)
380
    for (i=0;i < IPC_MAX_PHONES; i++)
380
        ipc_phone_hangup(&TASK->phones[i]);
381
        ipc_phone_hangup(&TASK->phones[i]);
381
 
382
 
Line 385... Line 386...
385
    /* Disconnect all phones connected to our answerbox */
386
    /* Disconnect all phones connected to our answerbox */
386
restart_phones:
387
restart_phones:
387
    spinlock_lock(&TASK->answerbox.lock);
388
    spinlock_lock(&TASK->answerbox.lock);
388
    while (!list_empty(&TASK->answerbox.connected_phones)) {
389
    while (!list_empty(&TASK->answerbox.connected_phones)) {
389
        phone = list_get_instance(TASK->answerbox.connected_phones.next,
390
        phone = list_get_instance(TASK->answerbox.connected_phones.next,
390
                      phone_t, link);
391
            phone_t, link);
391
        if (! spinlock_trylock(&phone->lock)) {
392
        if (! spinlock_trylock(&phone->lock)) {
392
            spinlock_unlock(&TASK->answerbox.lock);
393
            spinlock_unlock(&TASK->answerbox.lock);
-
 
394
            DEADLOCK_PROBE(p_phonelck, DEADLOCK_THRESHOLD);
393
            goto restart_phones;
395
            goto restart_phones;
394
        }
396
        }
395
       
397
       
396
        /* Disconnect phone */
398
        /* Disconnect phone */
397
        ASSERT(phone->state == IPC_PHONE_CONNECTED);
399
        ASSERT(phone->state == IPC_PHONE_CONNECTED);