lwp_futex_table.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-11-01 Shell Init ver.
  9. */
  10. #include "lwp_futex_internal.h"
  11. static struct shared_futex_entry *_futex_hash_head;
  12. rt_err_t futex_global_table_add(struct shared_futex_key *key, rt_futex_t futex)
  13. {
  14. rt_err_t rc = 0;
  15. struct shared_futex_entry *entry = &futex->entry;
  16. futex->entry.key.mobj = key->mobj;
  17. futex->entry.key.offset = key->offset;
  18. RT_UTHASH_ADD(_futex_hash_head, key, sizeof(struct shared_futex_key), entry);
  19. return rc;
  20. }
  21. rt_err_t futex_global_table_find(struct shared_futex_key *key, rt_futex_t *futex)
  22. {
  23. rt_err_t rc;
  24. rt_futex_t found_futex;
  25. struct shared_futex_entry *entry;
  26. RT_UTHASH_FIND(_futex_hash_head, key, sizeof(struct shared_futex_key), entry);
  27. if (entry)
  28. {
  29. rc = RT_EOK;
  30. found_futex = rt_container_of(entry, struct rt_futex, entry);
  31. }
  32. else
  33. {
  34. rc = -RT_ENOENT;
  35. found_futex = RT_NULL;
  36. }
  37. *futex = found_futex;
  38. return rc;
  39. }
  40. rt_err_t futex_global_table_delete(struct shared_futex_key *key)
  41. {
  42. rt_err_t rc;
  43. struct shared_futex_entry *entry;
  44. RT_UTHASH_FIND(_futex_hash_head, key, sizeof(struct shared_futex_key), entry);
  45. if (entry)
  46. {
  47. RT_UTHASH_DELETE(_futex_hash_head, entry);
  48. rc = RT_EOK;
  49. }
  50. else
  51. {
  52. rc = -RT_ENOENT;
  53. }
  54. return rc;
  55. }