MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / _sftx_get

Function _sftx_get

components/lwp/lwp_futex.c:355–393  ·  view source on GitHub ↗

* @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

Source from the content-addressed store, hash-verified

353 * - Returns futex pointer and sets result code
354 */
355static 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

Callers 1

_futex_getFunction · 0.85

Calls 5

rt_aspace_queryFunction · 0.85
_futex_lockFunction · 0.85
futex_global_table_findFunction · 0.85
_sftx_createFunction · 0.85
_futex_unlockFunction · 0.85

Tested by

no test coverage detected