Newer
Older
libkc / modules / src / kc_lock_guard.c
Nomura Kei on 29 May 2024 1 KB update
  1. /**
  2. * @file kc_lock_guard.c
  3. * @brief ロックガードモジュール
  4. */
  5. #include <stdio.h>
  6. #include <errno.h>
  7.  
  8. #include <kc_lock_guard.h>
  9.  
  10. /**
  11. * 指定された mutex がロックされるまで現在のスレッドをロックします。
  12. * ロックに成功するとロック管理用のオブジェクトを返します。
  13. *
  14. * @param mutex mutex
  15. * @return ロック管理用オブジェクト
  16. */
  17. KcLockGuard kc_lock_guard_init(mtx_t *mutex, const char *file, const char *func, int line)
  18. {
  19. KcLockGuard guard = {.mutex = mutex};
  20. if (mutex == NULL)
  21. {
  22. errno = EINVAL;
  23. perror("kc_lock_guard_init: (mutex = NULL)");
  24. fprintf(stderr, "%s:%s:%d kc_lock_guard_init : mutex = NULL\n", file, func, line);
  25. return guard;
  26. }
  27.  
  28. errno = 0;
  29. int ret = mtx_lock(mutex);
  30. if (ret != thrd_success)
  31. {
  32. fprintf(stderr, "%s:%s:%d kc_lock_guard : mtx_lock error\n", file, func, line);
  33. guard.mutex = NULL;
  34. }
  35. return guard;
  36. }
  37.  
  38. /**
  39. * 指定されたロック管理用オブジェクトのロックを解除します。
  40. *
  41. * @param guard ロック管理用オブジェクト
  42. */
  43. void kc_lock_guard_release(KcLockGuard *guard)
  44. {
  45. if (guard->mutex != NULL)
  46. {
  47. mtx_unlock(guard->mutex);
  48. guard->mutex = NULL;
  49. }
  50. }