]> pd.if.org Git - pdclib.old/blobdiff - includes/threads.h
* Change the style of inclusion of the internal/ headers. Modern preprocessors
[pdclib.old] / includes / threads.h
diff --git a/includes/threads.h b/includes/threads.h
new file mode 100644 (file)
index 0000000..5de3d38
--- /dev/null
@@ -0,0 +1,98 @@
+#ifndef _PDCLIB_THREADS_H\r
+#define _PDCLIB_THREADS_H\r
+#include <_PDCLIB_threadconfig.h>\r
+#include <time.h>\r
+_PDCLIB_BEGIN_EXTERN_C\r
+\r
+#define thread_local _Thread_local\r
+\r
+typedef _PDCLIB_once_flag once_flag;\r
+\r
+enum {\r
+       mtx_plain               = 0,\r
+       mtx_recursive   = (1 << 0),\r
+       mtx_timed               = (1 << 1),\r
+\r
+       _PDCLIB_mtx_valid_mask = mtx_recursive | mtx_timed\r
+};\r
+\r
+enum {\r
+       thrd_success    = 0,\r
+       thrd_timeout    = 1,\r
+       thrd_busy               = 2,\r
+       thrd_error              = 3,\r
+       thrd_nomem              = 4,\r
+};\r
+\r
+#define ONCE_FLAG_INIT _PDCLIB_ONCE_FLAG_INIT\r
+#if defined(_PDCLIB_ONCE_FLAG_DONE)\r
+static inline void call_once(once_flag *flag, void (*func)(void))\r
+{\r
+       if(*flag != _PDCLIB_ONCE_FLAG_DONE) {\r
+               _PDCLIB_call_once(flag, func);\r
+       }\r
+}\r
+#else\r
+void call_once(once_flag *flag, void (*func)(void))\r
+#endif\r
+\r
+#if defined(_PDCLIB_MTX_T)\r
+typedef _PDCLIB_MTX_T          mtx_t;\r
+void mtx_destroy(mtx_t *mtx);\r
+int mtx_init(mtx_t *mtx, int type);\r
+int mtx_lock(mtx_t *mtx);\r
+int mtx_timedlock(mtx_t *_PDCLIB_restrict mtx, const struct timespec *_PDCLIB_restrict ts);\r
+int mtx_trylock(mtx_t *mtx);\r
+int mtx_unlock(mtx_t *mtx);\r
+#endif\r
+\r
+#if defined(_PDCLIB_CND_T)\r
+typedef _PDCLIB_CND_T          cnd_t;\r
+int cnd_broadcast(cnd_t *cond);\r
+void cnd_destroy(cnd_t *cond);\r
+int cnd_init(cnd_t *cond);\r
+int cnd_signal(cnd_t *cond);\r
+int cnd_timedwait(cnd_t *_PDCLIB_restrict cond,\r
+       mtx_t *_PDCLIB_restrict mtx,\r
+       const struct timespec *_PDCLIB_restrict ts);\r
+int cnd_wait(cnd_t *cond, mtx_t *mtx);\r
+#endif\r
+\r
+#if defined(_PDCLIB_THRD_T)\r
+#define _PDCLIB_THRD_HAVE_MISC\r
+typedef _PDCLIB_THRD_T         thrd_t;\r
+typedef int (*)(void*)  thrd_start_t;\r
+\r
+int thrd_create(thrd_t *thr, thrd_start_t func, void *arg);\r
+thrd_t thrd_current(void);\r
+int thrd_detach(thrd_t thr);\r
+int thrd_equal(thrd_t thr0, thrd_t thr1);\r
+_PDCLIB_noreturn void thrd_exit(int res);\r
+int thrd_join(thrd_t thr, int *res);\r
+#endif\r
+\r
+#if defined(_PDCLIB_THRD_HAVE_MISC)\r
+int thrd_sleep(const struct timespec *duration, struct timespec *remaining);\r
+void thrd_yield(void);\r
+#endif\r
+\r
+/* The behaviour of tss_t is woefully underspecified in the C11 standard. In \r
+ * particular, it never specifies where/when/<b>if</b> destructors are called.\r
+ *\r
+ * In lieu of any clarification, we assume the behaviour of POSIX pthread_key_t\r
+ */\r
+\r
+#if defined(_PDCLIB_TSS_T)\r
+#define TSS_DTOR_ITERATIONS _PDCLIB_TSS_DTOR_ITERATIONS\r
+\r
+typedef _PDCLIB_TSS_T          tss_t;\r
+typedef void (*tss_dtor_t)(void*);\r
+\r
+int tss_create(tss_t *key, tss_dtor_t dtor);\r
+void tss_delete(tss_t key);\r
+void *tss_get(tss_t key);\r
+int tss_set(tss_t key, void *val);\r
+#endif\r
+\r
+_PDCLIB_END_EXTERN_C\r
+#endif\r