Newer
Older
c-interpreter / modules / libkc / include / kc_lock_guard.h
Nomura Kei on 9 Aug 2023 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 <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); _guard.mutex != NULL; kc_lock_guard_release(&_guard), _guard.mutex = NULL)


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


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


#endif	// KC_LOCK_GUARD_H