diff options
author | rubidium <rubidium@openttd.org> | 2007-01-02 19:19:48 +0000 |
---|---|---|
committer | rubidium <rubidium@openttd.org> | 2007-01-02 19:19:48 +0000 |
commit | 66bbf336c6af7353ef0aeed58002c46543b30635 (patch) | |
tree | ad4a63860df2626b22f77e7dac712e958bea54cb /src/thread.c | |
parent | ccc0a3f4dbf58c005b22341ac8874252924690cd (diff) | |
download | openttd-66bbf336c6af7353ef0aeed58002c46543b30635.tar.xz |
(svn r7759) -Merge: makefile rewrite. This merge features:
- A proper ./configure, so everything needs to be configured only once, not for every make.
- Usage of makedepend when available. This greatly reduces the time needed for generating the dependencies.
- A generator for all project files. There is a single file with sources, which is used to generate Makefiles and the project files for MSVC.
- Proper support for OSX universal binaries.
- Object files for non-MSVC compiles are also placed in separate directories, making is faster to switch between debug and release compiles and it does not touch the directory with the source files.
- Functionality to make a bundle of all needed files for for example a nightly or distribution of a binary with all needed GRFs and language files.
Note: as this merge moves almost all files, it is recommended to make a backup of your working copy before updating your working copy.
Diffstat (limited to 'src/thread.c')
-rw-r--r-- | src/thread.c | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/thread.c b/src/thread.c new file mode 100644 index 000000000..ab2cfd21d --- /dev/null +++ b/src/thread.c @@ -0,0 +1,157 @@ +/* $Id$ */ + +#include "stdafx.h" +#include "thread.h" +#include <stdlib.h> + +#if defined(__AMIGA__) || defined(__MORPHOS__) || defined(NO_THREADS) +OTTDThread *OTTDCreateThread(OTTDThreadFunc function, void *arg) { return NULL; } +void *OTTDJoinThread(OTTDThread *t) { return NULL; } +void OTTDExitThread(void) { NOT_REACHED(); }; + +#elif defined(__OS2__) + +#define INCL_DOS +#include <os2.h> +#include <process.h> + +struct OTTDThread { + TID thread; + OTTDThreadFunc func; + void* arg; + void* ret; +}; + +static void Proxy(void* arg) +{ + OTTDThread* t = arg; + t->ret = t->func(t->arg); +} + +OTTDThread* OTTDCreateThread(OTTDThreadFunc function, void* arg) +{ + OTTDThread* t = malloc(sizeof(*t)); + + if (t == NULL) return NULL; + + t->func = function; + t->arg = arg; + t->thread = _beginthread(Proxy, NULL, 32768, t); + if (t->thread != -1) { + return t; + } else { + free(t); + return NULL; + } +} + +void* OTTDJoinThread(OTTDThread* t) +{ + void* ret; + + if (t == NULL) return NULL; + + DosWaitThread(&t->thread, DCWW_WAIT); + ret = t->ret; + free(t); + return ret; +} + +void OTTDExitThread(void) +{ + _endthread(); +} + +#elif defined(UNIX) + +#include <pthread.h> + +struct OTTDThread { + pthread_t thread; +}; + +OTTDThread* OTTDCreateThread(OTTDThreadFunc function, void* arg) +{ + OTTDThread* t = malloc(sizeof(*t)); + + if (t == NULL) return NULL; + + if (pthread_create(&t->thread, NULL, function, arg) == 0) { + return t; + } else { + free(t); + return NULL; + } +} + +void* OTTDJoinThread(OTTDThread* t) +{ + void* ret; + + if (t == NULL) return NULL; + + pthread_join(t->thread, &ret); + free(t); + return ret; +} + +void OTTDExitThread(void) +{ + pthread_exit(NULL); +} + +#elif defined(WIN32) + +#include <windows.h> + +struct OTTDThread { + HANDLE thread; + OTTDThreadFunc func; + void* arg; + void* ret; +}; + +static DWORD WINAPI Proxy(LPVOID arg) +{ + OTTDThread* t = arg; + t->ret = t->func(t->arg); + return 0; +} + +OTTDThread* OTTDCreateThread(OTTDThreadFunc function, void* arg) +{ + OTTDThread* t = malloc(sizeof(*t)); + DWORD dwThreadId; + + if (t == NULL) return NULL; + + t->func = function; + t->arg = arg; + t->thread = CreateThread(NULL, 0, Proxy, t, 0, &dwThreadId); + + if (t->thread != NULL) { + return t; + } else { + free(t); + return NULL; + } +} + +void* OTTDJoinThread(OTTDThread* t) +{ + void* ret; + + if (t == NULL) return NULL; + + WaitForSingleObject(t->thread, INFINITE); + CloseHandle(t->thread); + ret = t->ret; + free(t); + return ret; +} + +void OTTDExitThread(void) +{ + ExitThread(0); +} +#endif |