Changeset 436a0a5 in mainline for kernel/generic/src/ipc
- Timestamp:
- 2018-11-09T22:04:01Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 95d45482
- Parents:
- 88e43bc (diff), abf6c01 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- kernel/generic/src/ipc
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/ipc/event.c
r88e43bc r436a0a5 147 147 if (event->answerbox != NULL) { 148 148 if (!event->masked) { 149 call_t *call = ipc_call_alloc( FRAME_ATOMIC);149 call_t *call = ipc_call_alloc(); 150 150 151 151 if (call) { -
kernel/generic/src/ipc/ipc.c
r88e43bc r436a0a5 108 108 * TASK->answerbox. 109 109 * 110 * @param flags Parameters for slab_alloc (e.g FRAME_ATOMIC). 111 * 112 * @return If flags permit it, return NULL, or initialized kernel 113 * call structure with one reference. 114 * 115 */ 116 call_t *ipc_call_alloc(unsigned int flags) 117 { 118 call_t *call = slab_alloc(call_cache, flags); 110 * @return Initialized kernel call structure with one reference, or NULL. 111 * 112 */ 113 call_t *ipc_call_alloc(void) 114 { 115 // TODO: Allocate call and kobject in single allocation 116 117 call_t *call = slab_alloc(call_cache, FRAME_ATOMIC); 119 118 if (!call) 120 119 return NULL; 121 120 122 kobject_t *kobj; 123 if (flags & FRAME_ATOMIC) 124 kobj = (kobject_t *) malloc(sizeof(kobject_t)); 125 else 126 kobj = (kobject_t *) nfmalloc(sizeof(kobject_t)); 127 121 kobject_t *kobj = (kobject_t *) malloc(sizeof(kobject_t)); 128 122 if (!kobj) { 129 123 slab_free(call_cache, call); … … 219 213 errno_t ipc_call_sync(phone_t *phone, call_t *request) 220 214 { 221 answerbox_t *mybox = slab_alloc(answerbox_cache, 0); 215 answerbox_t *mybox = slab_alloc(answerbox_cache, FRAME_ATOMIC); 216 if (!mybox) 217 return ENOMEM; 218 222 219 ipc_answerbox_init(mybox, TASK); 223 220 … … 483 480 kobject_put(phone->kobject); 484 481 485 call_t *call = ipc_call_alloc(0); 482 call_t *call = phone->hangup_call; 483 phone->hangup_call = NULL; 484 assert(call); 485 486 486 IPC_SET_IMETHOD(call->data, IPC_M_PHONE_HUNGUP); 487 487 call->request_method = IPC_M_PHONE_HUNGUP; … … 685 685 * to exist as soon as we release it. 686 686 */ 687 call_t *call = ipc_call_alloc(0); 687 call_t *call = phone->hangup_call; 688 phone->hangup_call = NULL; 689 assert(call); 690 688 691 IPC_SET_IMETHOD(call->data, IPC_M_PHONE_HUNGUP); 689 692 call->request_method = IPC_M_PHONE_HUNGUP; -
kernel/generic/src/ipc/ipcrsc.c
r88e43bc r436a0a5 46 46 { 47 47 phone_t *phone = (phone_t *) arg; 48 if (phone->hangup_call) 49 kobject_put(phone->hangup_call->kobject); 48 50 slab_free(phone_cache, phone); 49 51 } … … 79 81 return ENOMEM; 80 82 } 83 call_t *hcall = ipc_call_alloc(); 84 if (!hcall) { 85 cap_free(TASK, handle); 86 slab_free(phone_cache, phone); 87 free(kobj); 88 return ENOMEM; 89 } 81 90 82 91 ipc_phone_init(phone, task); 83 92 phone->state = IPC_PHONE_CONNECTING; 93 phone->hangup_call = hcall; 84 94 85 95 kobject_initialize(kobj, KOBJECT_TYPE_PHONE, phone, -
kernel/generic/src/ipc/irq.c
r88e43bc r436a0a5 529 529 530 530 if (irq->notif_cfg.answerbox) { 531 call_t *call = ipc_call_alloc( FRAME_ATOMIC);531 call_t *call = ipc_call_alloc(); 532 532 if (!call) 533 533 return; … … 565 565 566 566 if (irq->notif_cfg.answerbox) { 567 call_t *call = ipc_call_alloc( FRAME_ATOMIC);567 call_t *call = ipc_call_alloc(); 568 568 if (!call) { 569 569 irq_spinlock_unlock(&irq->lock, true); -
kernel/generic/src/ipc/sysipc.c
r88e43bc r436a0a5 267 267 * @return EOK on success. 268 268 * @return ENOENT if there is no such phone handle. 269 * @return ENOMEM if not enough memory to make the call 269 270 * 270 271 */ … … 276 277 return ENOENT; 277 278 278 call_t *call = ipc_call_alloc(0); 279 call_t *call = ipc_call_alloc(); 280 if (!call) { 281 kobject_put(kobj); 282 return ENOMEM; 283 } 284 279 285 call->priv = priv; 280 286 memcpy(call->data.args, data->args, sizeof(data->args)); … … 373 379 } 374 380 375 call_t *call = ipc_call_alloc(0); 381 call_t *call = ipc_call_alloc(); 382 if (!call) { 383 kobject_put(kobj); 384 return ENOMEM; 385 } 386 376 387 IPC_SET_IMETHOD(call->data, imethod); 377 388 IPC_SET_ARG1(call->data, arg1); … … 420 431 } 421 432 422 call_t *call = ipc_call_alloc(0); 433 call_t *call = ipc_call_alloc(); 434 if (!call) { 435 kobject_put(kobj); 436 return ENOMEM; 437 } 438 423 439 errno_t rc = copy_from_uspace(&call->data.args, &data->args, 424 440 sizeof(call->data.args));
Note:
See TracChangeset
for help on using the changeset viewer.