/** * @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