Newer
Older
libkc / modules / src / kc_lock_guard.c
Nomura Kei on 29 May 1 KB update
/**
 * @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;
	}
}