diff options
author | tron <tron@openttd.org> | 2005-08-05 09:15:41 +0000 |
---|---|---|
committer | tron <tron@openttd.org> | 2005-08-05 09:15:41 +0000 |
commit | 4696ef802a1c3b037a07a841945d73b52720a163 (patch) | |
tree | 4db884818a15ec2dc30fe1f1e660bded27872dae /thread.c | |
parent | 4f9b0d5f294a86cc3f041b3acaf1b1623afb277e (diff) | |
download | openttd-4696ef802a1c3b037a07a841945d73b52720a163.tar.xz |
(svn r2809) Implement more generic threading functions, which allow more than one thread
Diffstat (limited to 'thread.c')
-rw-r--r-- | thread.c | 112 |
1 files changed, 112 insertions, 0 deletions
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 <stdlib.h> + +#if defined(__AMIGA__) || defined(__MORPHOS__) +Thread* OTTDCreateThread(ThreadFunc function, void* arg) { return NULL; } +void OTTDJoinThread(Thread*) {} + + +#elif defined(__OS2__) + +#define INCL_DOS +#include <os2.h> +#include <process.h> + +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 <pthread.h> + +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 <windows.h> + +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 |