Changeset f9841e69 in mainline
- Timestamp:
- 2012-09-02T21:52:11Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 9ef1b79b
- Parents:
- fcfa926b
- Location:
- kernel/generic
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/ipc/ipc.h
rfcfa926b rf9841e69 168 168 extern int ipc_forward(call_t *, phone_t *, answerbox_t *, unsigned int); 169 169 extern void ipc_answer(answerbox_t *, call_t *); 170 extern void _ipc_answer_free_call(call_t *, bool); 170 171 171 172 extern void ipc_phone_init(phone_t *); -
kernel/generic/src/ipc/ipc.c
rfcfa926b rf9841e69 171 171 * 172 172 */ 173 staticvoid _ipc_answer_free_call(call_t *call, bool selflocked)173 void _ipc_answer_free_call(call_t *call, bool selflocked) 174 174 { 175 175 /* Count sent answer */ … … 306 306 if (phone->state != IPC_PHONE_CONNECTED) { 307 307 mutex_unlock(&phone->lock); 308 if (call->flags & IPC_CALL_FORWARDED) { 309 IPC_SET_RETVAL(call->data, EFORWARD); 310 _ipc_answer_free_call(call, false); 311 } else { 308 if (!(call->flags & IPC_CALL_FORWARDED)) { 312 309 if (phone->state == IPC_PHONE_HUNGUP) 313 310 ipc_backsend_err(phone, call, EHANGUP); -
kernel/generic/src/ipc/sysipc.c
rfcfa926b rf9841e69 412 412 { 413 413 call_t *call = get_call(callid); 414 bool need_old; 414 phone_t *phone; 415 bool need_old = answer_need_old(call); 416 bool after_forward = false; 417 ipc_data_t old; 415 418 int rc; 416 419 417 420 if (!call) 418 421 return ENOENT; 419 420 phone_t *phone; 422 423 if (need_old) 424 old = call->data; 425 421 426 if (phone_get(phoneid, &phone) != EOK) { 422 427 rc = ENOENT; … … 465 470 } 466 471 467 return ipc_forward(call, phone, &TASK->answerbox, mode); 472 rc = ipc_forward(call, phone, &TASK->answerbox, mode); 473 if (rc != EOK) { 474 after_forward = true; 475 goto error; 476 } 477 478 return EOK; 468 479 469 480 error: 470 need_old = answer_need_old(call);471 ipc_data_t old;472 473 if (need_old)474 old = call->data;475 476 481 IPC_SET_RETVAL(call->data, EFORWARD); 477 482 answer_preprocess(call, need_old ? &old : NULL); 478 ipc_answer(&TASK->answerbox, call); 483 if (after_forward) 484 _ipc_answer_free_call(call, false); 485 else 486 ipc_answer(&TASK->answerbox, call); 487 479 488 return rc; 480 489 }
Note:
See TracChangeset
for help on using the changeset viewer.