/** * @file kc_lock_guard.c * @brief ロックガードモジュール */ #include <stdio.h> #include <errno.h> #include <kc_lock_guard.h> /** * 指定された mutex がロックされるまで現在のスレッドをロックします。 * ロックに成功するとロック管理用のオブジェクトを返します。 * * @param mutex mutex * @return ロック管理用オブジェクト */ KcLockGuard kc_lock_guard_init(mtx_t *mutex, const char *file, const char *func, int line) { KcLockGuard guard = {.mutex = mutex}; if (mutex == NULL) { errno = EINVAL; perror("kc_lock_guard_init: (mutex = NULL)"); fprintf(stderr, "%s:%s:%d kc_lock_guard_init : mutex = NULL\n", file, func, line); return guard; } errno = 0; int ret = mtx_lock(mutex); if (ret != thrd_success) { fprintf(stderr, "%s:%s:%d kc_lock_guard : mtx_lock error\n", file, func, line); guard.mutex = NULL; } return guard; } /** * 指定されたロック管理用オブジェクトのロックを解除します。 * * @param guard ロック管理用オブジェクト */ void kc_lock_guard_release(KcLockGuard *guard) { if (guard->mutex != NULL) { mtx_unlock(guard->mutex); guard->mutex = NULL; } }