/**
* @file sc_thread.h
* @bried スレッド用ヘッダ
* @author Nomura Kei
* @copyright 2003 - 2022 Nomura Kei
*/
#ifndef SC_THREAD_H
#define SC_THREAD_H
#include <sc.h>
#ifdef __STDC_NO_THREADS__
// スレッドの完全サポートがない
////////////////////////////////////////////////////////////////////////////////
//
// スレッド
//
#define thread_local
#define _Thread_local
enum
{
thrd_success, //< 成功を示します。
thrd_nomem, //< メモリ不足で失敗したことを示します。
thrd_timedout, //< タイムアウト
thrd_busy, //< リソースがいい知事的に利用できない。
thrd_error //< エラー発生
};
typedef int thrd_t;
typedef int (*thrd_start_t)(void*);
int thrd_create(thrd_t* thr, thrd_start_t func, void* arg);
int thrd_equal(thrd_t lhs, thrd_t rhs);
thrd_t thrd_current(void);
int thrd_sleep(const struct timespec* duration, struct timespec* remaining);
////////////////////////////////////////////////////////////////////////////////
//
// ミューテックス
//
enum
{
mtx_plain, //< シンプルで非再帰的なミューテックスが作成されます。
mtx_recursive, //< 再帰的ミューテックスが作成されます。
mtx_timed //< タイムアウトをサポートする非再帰的ミューテックスが作成されます。
};
#define ONCE_FLAG_INIT (false)
typedef bool mtx_t;
#define call_once(flag, func) \
do { if (!*(flag)) { func(); *(flag) = true; } while (0)
int mtx_init(mtx_t* mutex, int type);
int mtx_lock(mtx_t* mutex);
int mtx_timedlock(mtx_t* restrict mutex, const struct timespec time_point);
int mtx_trylock(mtx_t* mutex);
int mtx_unlock(mtx_t* mutex);
void mtx_unlock(mtx_t* mutex);
#else
// スレッドを完全サポートしている
#include <threads.h>
#endif // __STDC_NO_THREADS___
#endif // SC_THREAD_H