Allocate new capability * * @param task Task for which to allocate the new capability. * * @param[out] handle New capability handle on success. * * @return An error code in case of error. */
| 263 | * @return An error code in case of error. |
| 264 | */ |
| 265 | errno_t cap_alloc(task_t *task, cap_handle_t *handle) |
| 266 | { |
| 267 | mutex_lock(&task->cap_info->lock); |
| 268 | cap_t *cap = slab_alloc(cap_cache, FRAME_ATOMIC); |
| 269 | if (!cap) { |
| 270 | mutex_unlock(&task->cap_info->lock); |
| 271 | return ENOMEM; |
| 272 | } |
| 273 | uintptr_t hbase; |
| 274 | if (!ra_alloc(task->cap_info->handles, 1, 1, &hbase)) { |
| 275 | slab_free(cap_cache, cap); |
| 276 | mutex_unlock(&task->cap_info->lock); |
| 277 | return ENOMEM; |
| 278 | } |
| 279 | cap_initialize(cap, task, (cap_handle_t) hbase); |
| 280 | hash_table_insert(&task->cap_info->caps, &cap->caps_link); |
| 281 | |
| 282 | cap->state = CAP_STATE_ALLOCATED; |
| 283 | *handle = cap->handle; |
| 284 | mutex_unlock(&task->cap_info->lock); |
| 285 | |
| 286 | return EOK; |
| 287 | } |
| 288 | |
| 289 | /** Publish allocated capability |
| 290 | * |
no test coverage detected