From 4696ef802a1c3b037a07a841945d73b52720a163 Mon Sep 17 00:00:00 2001 From: tron Date: Fri, 5 Aug 2005 09:15:41 +0000 Subject: (svn r2809) Implement more generic threading functions, which allow more than one thread --- thread.c | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 thread.c (limited to 'thread.c') diff --git a/thread.c b/thread.c new file mode 100644 index 000000000..6c70ebdb2 --- /dev/null +++ b/thread.c @@ -0,0 +1,112 @@ +/* $Id$ */ + +#include "stdafx.h" +#include "thread.h" +#include + +#if defined(__AMIGA__) || defined(__MORPHOS__) +Thread* OTTDCreateThread(ThreadFunc function, void* arg) { return NULL; } +void OTTDJoinThread(Thread*) {} + + +#elif defined(__OS2__) + +#define INCL_DOS +#include +#include + +struct Thread { + TID thread; +}; + +Thread* OTTDCreateThread(ThreadFunc function, void* arg) +{ + Thread* t = malloc(sizeof(*t)); + + if (t == NULL) return NULL; + + t->thread = _beginthread(function, NULL, 32768, arg); + if (t->thread != -1) { + return t; + } else { + free(t); + return NULL; + } +} + +void OTTDJoinThread(Thread* t) +{ + if (t == NULL) return; + + DosWaitThread(&t->thread, DCWW_WAIT); + free(t); +} + + +#elif defined(UNIX) + +#include + +struct Thread { + pthread_t thread; +}; + +Thread* OTTDCreateThread(ThreadFunc function, void* arg) +{ + Thread* t = malloc(sizeof(*t)); + + if (t == NULL) return NULL; + + if (pthread_create(&t->thread, NULL, (void* (*)(void*))function, arg) == 0) { + return t; + } else { + free(t); + return NULL; + } +} + +void OTTDJoinThread(Thread* t) +{ + if (t == NULL) return; + + pthread_join(t->thread, NULL); + free(t); +} + + +#elif defined(WIN32) + +#include + +struct Thread { + HANDLE thread; +}; + +Thread* OTTDCreateThread(ThreadFunc function, void* arg) +{ + Thread* t = malloc(sizeof(*t)); + DWORD dwThreadId; + + if (t == NULL) return NULL; + + t->thread = CreateThread( + NULL, 0, (LPTHREAD_START_ROUTINE)function, arg, 0, &dwThreadId + ); + + if (t->thread != NULL) { + return t; + } else { + free(t); + return NULL; + } +} + +void OTTDJoinThread(Thread* t) +{ + if (t == NULL) return; + + WaitForSingleObject(t->thread, INFINITE); + CloseHandle(t->thread); + free(t); +} +#endif -- cgit v1.2.3-54-g00ecf