Newer
Older
libkc / modules / include / kc_lock_guard.h
Nomura Kei on 29 May 1 KB update
/**
 * @file   kc_lock_guard.h
 * @brief  KC ロックガードモジュール
 * @copyright  2003 - 2023  Nomura Kei
 */
#ifndef KC_LOCK_GUARD_H
#define KC_LOCK_GUARD_H

#include <kc.h>
#include <kc_threads.h>

/**
 * LockGuard 管理構造体
 */
typedef struct
{
	mtx_t *mutex;
} KcLockGuard;

/**
 * 指定された lock (mtx_t のポインタ)を用い、指定された区間ロックします。
 * 使用例)
 *
 * mtx_t mutex;
 * mtx_init(&mutex, mtx_plain | mtx_recursive);
 *
 *
 * kc_lock_guard(&mutex) {
 *   // この区間ロックが取得されている状態
 *   // ブロックを抜けるとロックが自動解除される。
 *   // [注意] 本ブロック内では、break, return, goto 等を利用しないでください。
 * }
 */
#define kc_lock_guard(lock) \
	for (KcLockGuard _guard = kc_lock_guard_init(lock, __FILE__, __func__, __LINE__); _guard.mutex != NULL; kc_lock_guard_release(&_guard), _guard.mutex = NULL)

/**
 * 指定された mutex がロックされるまで現在のスレッドをロックします。
 * ロックに成功するとロック管理用のオブジェクトを返します。
 *
 * @param mutex mutex
 * @return ロック管理用オブジェクト
 */
KcLockGuard kc_lock_guard_init(mtx_t *mutex, const char *file, const char *func, int line);

/**
 * 指定されたロック管理用オブジェクトのロックを解除します。
 *
 * @param guard ロック管理用オブジェクト
 */
void kc_lock_guard_release(KcLockGuard *guard);

#endif // KC_LOCK_GUARD_H