Subversion Repositories HelenOS

Rev

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

Rev 4422 Rev 4430
Line 353... Line 353...
353
    switch (IPC_GET_METHOD(call->data)) {
353
    switch (IPC_GET_METHOD(call->data)) {
354
    case IPC_M_CONNECTION_CLONE: {
354
    case IPC_M_CONNECTION_CLONE: {
355
        phone_t *cloned_phone;
355
        phone_t *cloned_phone;
356
        GET_CHECK_PHONE(cloned_phone, IPC_GET_ARG1(call->data),
356
        GET_CHECK_PHONE(cloned_phone, IPC_GET_ARG1(call->data),
357
            return ENOENT);
357
            return ENOENT);
358
        if (phone  == cloned_phone)
-
 
359
            return EEXISTS;
-
 
360
        if (cloned_phone < phone) {
358
        if (cloned_phone < phone) {
361
            mutex_lock(&cloned_phone->lock);
359
            mutex_lock(&cloned_phone->lock);
362
            mutex_lock(&phone->lock);
360
            mutex_lock(&phone->lock);
363
        } else {
361
        } else if (cloned_phone > phone) {
364
            mutex_lock(&phone->lock);
362
            mutex_lock(&phone->lock);
365
            mutex_lock(&cloned_phone->lock);
363
            mutex_lock(&cloned_phone->lock);
-
 
364
        } else {
-
 
365
            mutex_lock(&phone->lock);
366
        }
366
        }
367
        if ((cloned_phone->state != IPC_PHONE_CONNECTED) ||
367
        if ((cloned_phone->state != IPC_PHONE_CONNECTED) ||
368
            phone->state != IPC_PHONE_CONNECTED) {
368
            phone->state != IPC_PHONE_CONNECTED) {
-
 
369
            if (cloned_phone != phone)
369
            mutex_unlock(&cloned_phone->lock);
370
                mutex_unlock(&cloned_phone->lock);
370
            mutex_unlock(&phone->lock);
371
            mutex_unlock(&phone->lock);
371
            return EINVAL;
372
            return EINVAL;
372
        }
373
        }
373
        /*
374
        /*
374
         * We can be pretty sure now that both tasks exist and we are
375
         * We can be pretty sure now that both tasks exist and we are
Line 376... Line 377...
376
         * we are effectively preventing them from finishing their
377
         * we are effectively preventing them from finishing their
377
         * potential cleanup.
378
         * potential cleanup.
378
         */
379
         */
379
        newphid = phone_alloc(phone->callee->task);
380
        newphid = phone_alloc(phone->callee->task);
380
        if (newphid < 0) {
381
        if (newphid < 0) {
-
 
382
            if (cloned_phone != phone)
381
            mutex_unlock(&cloned_phone->lock);
383
                mutex_unlock(&cloned_phone->lock);
382
            mutex_unlock(&phone->lock);
384
            mutex_unlock(&phone->lock);
383
            return ELIMIT;
385
            return ELIMIT;
384
        }
386
        }
385
        ipc_phone_connect(&phone->callee->task->phones[newphid],
387
        ipc_phone_connect(&phone->callee->task->phones[newphid],
386
            cloned_phone->callee);
388
            cloned_phone->callee);
-
 
389
        if (cloned_phone != phone)
387
        mutex_unlock(&cloned_phone->lock);
390
            mutex_unlock(&cloned_phone->lock);
388
        mutex_unlock(&phone->lock);
391
        mutex_unlock(&phone->lock);
389
        /* Set the new phone for the callee. */
392
        /* Set the new phone for the callee. */
390
        IPC_SET_ARG1(call->data, newphid);
393
        IPC_SET_ARG1(call->data, newphid);
391
        break;
394
        break;
392
    }
395
    }