* @brief Get or create a Shared FuTeX (sftx) for given user address * * @param[in] uaddr User-space address to lookup/create futex for * @param[in] lwp Pointer to lightweight process structure * @param[in] op Operation flags (e.g. FUTEX_PRIVATE) * @param[out] rc Pointer to store result code (0 on success, error code on failure) * * @return Pointer to existing/new futex on success, NULL on f
| 353 | * - Returns futex pointer and sets result code |
| 354 | */ |
| 355 | static rt_futex_t _sftx_get(void *uaddr, struct rt_lwp *lwp, int op, |
| 356 | rt_err_t *rc) |
| 357 | { |
| 358 | rt_futex_t futex = RT_NULL; |
| 359 | struct shared_futex_key key; |
| 360 | rt_varea_t varea; |
| 361 | rt_err_t error = -1; |
| 362 | |
| 363 | RD_LOCK(lwp->aspace); |
| 364 | varea = rt_aspace_query(lwp->aspace, uaddr); |
| 365 | if (varea) |
| 366 | { |
| 367 | key.mobj = varea->mem_obj; |
| 368 | key.offset = ((varea->offset) << MM_PAGE_SHIFT) | |
| 369 | ((long)uaddr & ((1 << MM_PAGE_SHIFT) - 1)); |
| 370 | RD_UNLOCK(lwp->aspace); |
| 371 | |
| 372 | /* query for the key */ |
| 373 | _futex_lock(lwp, op & ~FUTEX_PRIVATE); |
| 374 | error = futex_global_table_find(&key, &futex); |
| 375 | if (error != RT_EOK) |
| 376 | { |
| 377 | /* not found, do allocation */ |
| 378 | futex = _sftx_create(&key, lwp); |
| 379 | if (!futex) |
| 380 | error = -ENOMEM; |
| 381 | else |
| 382 | error = 0; |
| 383 | } |
| 384 | _futex_unlock(lwp, op & ~FUTEX_PRIVATE); |
| 385 | } |
| 386 | else |
| 387 | { |
| 388 | RD_UNLOCK(lwp->aspace); |
| 389 | } |
| 390 | |
| 391 | *rc = error; |
| 392 | return futex; |
| 393 | } |
| 394 | |
| 395 | /** |
| 396 | * @brief Get a futex (private or shared) for given user address |
no test coverage detected