diff --git a/engine/include/nb_thread.h b/engine/include/nb_thread.h index 47a0c95..b69b462 100644 --- a/engine/include/nb_thread.h +++ b/engine/include/nb_thread.h @@ -11,4 +11,6 @@ /* Standard */ +nb_thread_t* nb_create_thread(void (*func)(void*), void* userdata); + #endif diff --git a/engine/include/nb_type/thread.h b/engine/include/nb_type/thread.h index 37e90fe..87a1305 100644 --- a/engine/include/nb_type/thread.h +++ b/engine/include/nb_type/thread.h @@ -6,15 +6,35 @@ #ifdef NB_EXPOSE_THREAD /* External library */ +#if defined(THREAD_POSIX) +#include +#elif defined(THREAD_WIN32) +#include +#endif /* NishBox */ /* Standard */ -NB_DECLARE_TYPE(thread, { +NB_DECLARE_TYPE(thread_context, { + void (*func)(void*); + void* data; }); + +#if defined(THREAD_POSIX) +NB_DECLARE_TYPE(thread, { + nb_thread_context_t context; + pthread_t thread; +}); +#elif defined(THREAD_WIN32) +NB_DECLARE_TYPE(thread, { + nb_thread_context_t context; + HANDLE thread; +}); +#endif #else typedef void nb_thread_t; +typedef void nb_thread_context_t; #endif #endif diff --git a/engine/thread/POSIX/nb_thread.c b/engine/thread/POSIX/nb_thread.c index 17e5dfb..62d27ce 100644 --- a/engine/thread/POSIX/nb_thread.c +++ b/engine/thread/POSIX/nb_thread.c @@ -3,6 +3,7 @@ #include /* External library */ +#include /* Interface */ #include @@ -10,3 +11,19 @@ /* NishBox */ /* Standard */ +#include + +void* nb_wrap_thread(void* arg) { + nb_thread_context_t* ctx = (nb_thread_context_t*)arg; + ctx->func(ctx->data); + return NULL; +} + +nb_thread_t* nb_create_thread(void (*func)(void*), void* userdata) { + nb_thread_t* thread = malloc(sizeof(*thread)); + thread->context.func = func; + thread->context.data = userdata; + if(pthread_create(&thread->thread, NULL, nb_wrap_thread, &thread->context) == 0) return thread; + free(thread); + return NULL; +} diff --git a/engine/thread/WIN32/nb_thread.c b/engine/thread/WIN32/nb_thread.c index 17e5dfb..754471c 100644 --- a/engine/thread/WIN32/nb_thread.c +++ b/engine/thread/WIN32/nb_thread.c @@ -3,6 +3,7 @@ #include /* External library */ +#include /* Interface */ #include @@ -10,3 +11,21 @@ /* NishBox */ /* Standard */ +#include + +DWORD WINAPI nb_wrap_thread(void* arg) { + nb_thread_context_t* ctx = (nb_thread_context_t*)arg; + ctx->func(ctx->data); + return 0; +} + +nb_thread_t* nb_create_thread(void (*func)(void*), void* userdata) { + nb_thread_t* thread = malloc(sizeof(*thread)); + thread->context.func = func; + thread->context.data = userdata; + if((thread->thread = CreateThread(NULL, 0, nb_wrap_thread, &thread->context, 0, NULL)) != NULL) return thread; + /* XXX: Is this needed? */ + ResumeThread(thread->thread); + free(thread); + return NULL; +} diff --git a/tool/format.sh b/tool/format.sh new file mode 100755 index 0000000..7334c65 --- /dev/null +++ b/tool/format.sh @@ -0,0 +1,2 @@ +#!/bin/sh +exec clang-format --verbose -i `find engine src -name "*.c" -or -name "*.h"`