Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/ipc/sysipc.c

    rb169619 r455241b  
    199199                        list_remove(&phone->link);
    200200                        /* Drop callee->connected_phones reference */
    201                         kobject_put(phone->kobject);
     201                        kobject_put(&phone->kobject);
    202202                        phone->state = IPC_PHONE_SLAMMED;
    203203                        phone->label = 0;
     
    273273ipc_req_internal(cap_phone_handle_t handle, ipc_data_t *data, sysarg_t priv)
    274274{
    275         kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE);
    276         if (!kobj->phone)
     275        phone_t *phone = phone_from_kobject(
     276            kobject_get(TASK, handle, KOBJECT_TYPE_PHONE));
     277        if (!phone)
    277278                return ENOENT;
    278279
    279280        call_t *call = ipc_call_alloc();
    280281        if (!call) {
    281                 kobject_put(kobj);
     282                kobject_put(&phone->kobject);
    282283                return ENOMEM;
    283284        }
     
    286287        memcpy(call->data.args, data->args, sizeof(data->args));
    287288
    288         errno_t rc = request_preprocess(call, kobj->phone);
     289        errno_t rc = request_preprocess(call, phone);
    289290        if (!rc) {
    290291#ifdef CONFIG_UDEBUG
     
    292293#endif
    293294
    294                 kobject_add_ref(call->kobject);
    295                 rc = ipc_call_sync(kobj->phone, call);
     295                kobject_add_ref(&call->kobject);
     296                rc = ipc_call_sync(phone, call);
    296297                spinlock_lock(&call->forget_lock);
    297298                bool forgotten = call->forget;
    298299                spinlock_unlock(&call->forget_lock);
    299                 kobject_put(call->kobject);
     300                kobject_put(&call->kobject);
    300301
    301302#ifdef CONFIG_UDEBUG
     
    312313                                 * deallocation.
    313314                                 */
    314                                 kobject_put(call->kobject);
     315                                kobject_put(&call->kobject);
    315316                        } else {
    316317                                /*
     
    320321                                assert(rc == EINTR);
    321322                        }
    322                         kobject_put(kobj);
     323                        kobject_put(&phone->kobject);
    323324                        return rc;
    324325                }
     
    329330
    330331        memcpy(data->args, call->data.args, sizeof(data->args));
    331         kobject_put(call->kobject);
    332         kobject_put(kobj);
     332        kobject_put(&call->kobject);
     333        kobject_put(&phone->kobject);
    333334
    334335        return EOK;
     
    370371    sysarg_t arg1, sysarg_t arg2, sysarg_t arg3, sysarg_t label)
    371372{
    372         kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE);
    373         if (!kobj)
     373        phone_t *phone = phone_from_kobject(
     374            kobject_get(TASK, handle, KOBJECT_TYPE_PHONE));
     375
     376        if (!phone)
    374377                return ENOENT;
    375378
    376         if (check_call_limit(kobj->phone)) {
    377                 kobject_put(kobj);
     379        if (check_call_limit(phone)) {
     380                kobject_put(&phone->kobject);
    378381                return ELIMIT;
    379382        }
     
    381384        call_t *call = ipc_call_alloc();
    382385        if (!call) {
    383                 kobject_put(kobj);
     386                kobject_put(&phone->kobject);
    384387                return ENOMEM;
    385388        }
     
    399402        call->data.answer_label = label;
    400403
    401         errno_t res = request_preprocess(call, kobj->phone);
     404        errno_t res = request_preprocess(call, phone);
    402405
    403406        if (!res)
    404                 ipc_call(kobj->phone, call);
     407                ipc_call(phone, call);
    405408        else
    406                 ipc_backsend_err(kobj->phone, call, res);
    407 
    408         kobject_put(kobj);
     409                ipc_backsend_err(phone, call, res);
     410
     411        kobject_put(&phone->kobject);
    409412        return EOK;
    410413}
     
    422425    sysarg_t label)
    423426{
    424         kobject_t *kobj = kobject_get(TASK, handle, KOBJECT_TYPE_PHONE);
    425         if (!kobj)
     427        phone_t *phone = phone_from_kobject(
     428            kobject_get(TASK, handle, KOBJECT_TYPE_PHONE));
     429        if (!phone)
    426430                return ENOENT;
    427431
    428         if (check_call_limit(kobj->phone)) {
    429                 kobject_put(kobj);
     432        if (check_call_limit(phone)) {
     433                kobject_put(&phone->kobject);
    430434                return ELIMIT;
    431435        }
     
    433437        call_t *call = ipc_call_alloc();
    434438        if (!call) {
    435                 kobject_put(kobj);
     439                kobject_put(&phone->kobject);
    436440                return ENOMEM;
    437441        }
     
    440444            sizeof(call->data.args));
    441445        if (rc != EOK) {
    442                 kobject_put(call->kobject);
    443                 kobject_put(kobj);
     446                kobject_put(&call->kobject);
     447                kobject_put(&phone->kobject);
    444448                return (sys_errno_t) rc;
    445449        }
     
    448452        call->data.answer_label = label;
    449453
    450         errno_t res = request_preprocess(call, kobj->phone);
     454        errno_t res = request_preprocess(call, phone);
    451455
    452456        if (!res)
    453                 ipc_call(kobj->phone, call);
     457                ipc_call(phone, call);
    454458        else
    455                 ipc_backsend_err(kobj->phone, call, res);
    456 
    457         kobject_put(kobj);
     459                ipc_backsend_err(phone, call, res);
     460
     461        kobject_put(&phone->kobject);
    458462        return EOK;
    459463}
     
    489493                return ENOENT;
    490494
    491         call_t *call = ckobj->call;
     495        call_t *call = call_from_kobject(ckobj);
    492496
    493497        ipc_data_t old;
     
    551555        }
    552556
    553         rc = ipc_forward(call, pkobj->phone, &TASK->answerbox, mode);
     557        rc = ipc_forward(call, phone_from_kobject(pkobj), &TASK->answerbox, mode);
    554558        if (rc != EOK) {
    555559                after_forward = true;
     
    659663                return ENOENT;
    660664
    661         call_t *call = kobj->call;
     665        call_t *call = call_from_kobject(kobj);
    662666        assert(!(call->flags & IPC_CALL_ANSWERED));
    663667
     
    706710                return ENOENT;
    707711
    708         call_t *call = kobj->call;
     712        call_t *call = call_from_kobject(kobj);
    709713        assert(!(call->flags & IPC_CALL_ANSWERED));
    710714
     
    751755                return ENOENT;
    752756
    753         errno_t rc = ipc_phone_hangup(kobj->phone);
     757        errno_t rc = ipc_phone_hangup(phone_from_kobject(kobj));
    754758        kobject_put(kobj);
    755759        cap_free(TASK, handle);
     
    797801
    798802                STRUCT_TO_USPACE(calldata, &call->data);
    799                 kobject_put(call->kobject);
     803                kobject_put(&call->kobject);
    800804
    801805                return EOK;
     
    806810
    807811                if (call->flags & IPC_CALL_DISCARD_ANSWER) {
    808                         kobject_put(call->kobject);
     812                        kobject_put(&call->kobject);
    809813                        goto restart;
    810814                }
     
    813817
    814818                STRUCT_TO_USPACE(calldata, &call->data);
    815                 kobject_put(call->kobject);
     819                kobject_put(&call->kobject);
    816820
    817821                return EOK;
     
    836840                goto error;
    837841
    838         kobject_add_ref(call->kobject);
    839         cap_publish(TASK, handle, call->kobject);
     842        kobject_add_ref(&call->kobject);
     843        cap_publish(TASK, handle, &call->kobject);
    840844        return EOK;
    841845
Note: See TracChangeset for help on using the changeset viewer.