summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authortron <tron@openttd.org>2005-08-05 09:15:41 +0000
committertron <tron@openttd.org>2005-08-05 09:15:41 +0000
commit4696ef802a1c3b037a07a841945d73b52720a163 (patch)
tree4db884818a15ec2dc30fe1f1e660bded27872dae /thread.c
parent4f9b0d5f294a86cc3f041b3acaf1b1623afb277e (diff)
downloadopenttd-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.c112
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