src/thread.cpp
author convert-repo
Mon, 07 Apr 2008 16:21:55 +0000
changeset 10076 dfd70e42c4ae
parent 8626 440dfcd14c4a
permissions -rw-r--r--
update tags
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
     1
/* $Id$ */
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
     2
6918
5589c415e28f (svn r9558) -Documentation: doxygen and comment changes: 'T' now. Almost done
belugas
parents: 6573
diff changeset
     3
/** @file thread.cpp */
5589c415e28f (svn r9558) -Documentation: doxygen and comment changes: 'T' now. Almost done
belugas
parents: 6573
diff changeset
     4
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
     5
#include "stdafx.h"
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
     6
#include "thread.h"
8626
440dfcd14c4a (svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents: 7053
diff changeset
     7
#include "core/alloc_func.hpp"
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
     8
#include <stdlib.h>
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
     9
7053
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
    10
#if defined(__AMIGA__) || defined(PSP) || defined(NO_THREADS)
4324
9c999cc382fa (svn r5978) -Add: allow a switch in Makefile.config to disable threads in OpenTTD (no matter what system you are on). Only useful for testing.
truelight
parents: 4300
diff changeset
    11
OTTDThread *OTTDCreateThread(OTTDThreadFunc function, void *arg) { return NULL; }
9c999cc382fa (svn r5978) -Add: allow a switch in Makefile.config to disable threads in OpenTTD (no matter what system you are on). Only useful for testing.
truelight
parents: 4300
diff changeset
    12
void *OTTDJoinThread(OTTDThread *t) { return NULL; }
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6230
diff changeset
    13
void OTTDExitThread() { NOT_REACHED(); };
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    14
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    15
#elif defined(__OS2__)
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    16
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    17
#define INCL_DOS
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    18
#include <os2.h>
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    19
#include <process.h>
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    20
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
    21
struct OTTDThread {
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    22
	TID thread;
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
    23
	OTTDThreadFunc func;
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    24
	void* arg;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    25
	void* ret;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    26
};
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    27
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    28
static void Proxy(void* arg)
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    29
{
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    30
	OTTDThread* t = (OTTDThread*)arg;
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    31
	t->ret = t->func(t->arg);
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    32
}
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    33
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
    34
OTTDThread* OTTDCreateThread(OTTDThreadFunc function, void* arg)
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    35
{
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
    36
	OTTDThread* t = MallocT<OTTDThread>(1);
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    37
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    38
	if (t == NULL) return NULL;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    39
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    40
	t->func = function;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    41
	t->arg  = arg;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    42
	t->thread = _beginthread(Proxy, NULL, 32768, t);
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    43
	if (t->thread != (TID)-1) {
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    44
		return t;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    45
	} else {
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    46
		free(t);
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    47
		return NULL;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    48
	}
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    49
}
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    50
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
    51
void* OTTDJoinThread(OTTDThread* t)
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    52
{
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    53
	void* ret;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    54
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    55
	if (t == NULL) return NULL;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    56
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    57
	DosWaitThread(&t->thread, DCWW_WAIT);
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    58
	ret = t->ret;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    59
	free(t);
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    60
	return ret;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    61
}
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    62
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6230
diff changeset
    63
void OTTDExitThread()
4300
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
    64
{
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
    65
	_endthread();
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
    66
}
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    67
7053
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
    68
#elif defined(UNIX) && !defined(MORPHOS)
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    69
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    70
#include <pthread.h>
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    71
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
    72
struct OTTDThread {
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    73
	pthread_t thread;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    74
};
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    75
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
    76
OTTDThread* OTTDCreateThread(OTTDThreadFunc function, void* arg)
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    77
{
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
    78
	OTTDThread* t = MallocT<OTTDThread>(1);
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    79
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    80
	if (t == NULL) return NULL;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    81
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    82
	if (pthread_create(&t->thread, NULL, function, arg) == 0) {
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    83
		return t;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    84
	} else {
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    85
		free(t);
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    86
		return NULL;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    87
	}
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    88
}
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    89
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
    90
void* OTTDJoinThread(OTTDThread* t)
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    91
{
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    92
	void* ret;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    93
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    94
	if (t == NULL) return NULL;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    95
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    96
	pthread_join(t->thread, &ret);
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    97
	free(t);
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
    98
	return ret;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
    99
}
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   100
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6230
diff changeset
   101
void OTTDExitThread()
4300
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
   102
{
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
   103
	pthread_exit(NULL);
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
   104
}
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   105
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   106
#elif defined(WIN32)
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   107
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   108
#include <windows.h>
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   109
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
   110
struct OTTDThread {
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   111
	HANDLE thread;
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
   112
	OTTDThreadFunc func;
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   113
	void* arg;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   114
	void* ret;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   115
};
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   116
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   117
static DWORD WINAPI Proxy(LPVOID arg)
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   118
{
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   119
	OTTDThread* t = (OTTDThread*)arg;
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   120
	t->ret = t->func(t->arg);
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   121
	return 0;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   122
}
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   123
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
   124
OTTDThread* OTTDCreateThread(OTTDThreadFunc function, void* arg)
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   125
{
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
   126
	OTTDThread* t = MallocT<OTTDThread>(1);
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   127
	DWORD dwThreadId;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   128
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   129
	if (t == NULL) return NULL;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   130
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   131
	t->func = function;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   132
	t->arg  = arg;
2287
2e556bae5fbb (svn r2811) Fix typos in r2810
tron
parents: 2286
diff changeset
   133
	t->thread = CreateThread(NULL, 0, Proxy, t, 0, &dwThreadId);
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   134
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   135
	if (t->thread != NULL) {
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   136
		return t;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   137
	} else {
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   138
		free(t);
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   139
		return NULL;
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   140
	}
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   141
}
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   142
4298
3417f80deca1 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 2290
diff changeset
   143
void* OTTDJoinThread(OTTDThread* t)
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   144
{
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   145
	void* ret;
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   146
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   147
	if (t == NULL) return NULL;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   148
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   149
	WaitForSingleObject(t->thread, INFINITE);
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   150
	CloseHandle(t->thread);
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   151
	ret = t->ret;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   152
	free(t);
2286
acb76b379e72 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
   153
	return ret;
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   154
}
4300
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
   155
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6230
diff changeset
   156
void OTTDExitThread()
4300
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
   157
{
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
   158
	ExitThread(0);
687a17c9c557 (svn r5946) -Add: merged the TGP branch to mainline. TGP adds:
truelight
parents: 4298
diff changeset
   159
}
7053
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   160
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   161
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   162
#elif defined(MORPHOS)
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   163
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   164
#include <exec/types.h>
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   165
#include <exec/rawfmt.h>
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   166
#include <dos/dostags.h>
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   167
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   168
#include <proto/dos.h>
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   169
#include <proto/exec.h>
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   170
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   171
#include <setjmp.h>
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   172
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   173
/* NOTE: this code heavily depends on latest libnix updates. So make
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   174
 *        sure you link with new stuff which supports semaphore locking of
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   175
 *        the IO resources, else it will just go foobar. */
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   176
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   177
struct OTTDThreadStartupMessage {
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   178
	struct Message msg;  ///< standard exec.library message (MUST be the first thing in the message struct!)
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   179
	OTTDThreadFunc func; ///< function the thread will execute
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   180
	void *arg;           ///< functions arguments for the thread function
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   181
	void *ret;           ///< return value of the thread function
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   182
	jmp_buf jumpstore;   ///< storage for the setjump state
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   183
};
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   184
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   185
struct OTTDThread {
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   186
	struct MsgPort *replyport;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   187
	struct OTTDThreadStartupMessage msg;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   188
};
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   189
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   190
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   191
/**
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   192
 *  Default OpenTTD STDIO/ERR debug output is not very useful for this, so we
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   193
 *  utilize serial/ramdebug instead.
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   194
 */
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   195
#ifndef NO_DEBUG_MESSAGES
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   196
void KPutStr(CONST_STRPTR format)
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   197
{
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   198
	RawDoFmt(format, NULL, (void (*)())RAWFMTFUNC_SERIAL, NULL);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   199
}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   200
#else
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   201
#define KPutStr(x)
2285
3193cbd1ba88 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
diff changeset
   202
#endif
7053
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   203
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   204
static void Proxy(void)
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   205
{
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   206
	struct Task *child = FindTask(NULL);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   207
	struct OTTDThreadStartupMessage *msg;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   208
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   209
	/* Make sure, we don't block the parent. */
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   210
	SetTaskPri(child, -5);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   211
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   212
	KPutStr("[Child] Progressing...\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   213
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   214
	if (NewGetTaskAttrs(NULL, &msg, sizeof(struct OTTDThreadStartupMessage *), TASKINFOTYPE_STARTUPMSG, TAG_DONE) && msg != NULL) {
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   215
		/* Make use of setjmp() here, so this point can be reached again from inside
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   216
		 *  OTTDExitThread() which can be called from anythere inside msg->func.
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   217
		 *  It's a bit ugly and in worst case it leaks some memory. */
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   218
		if (setjmp(msg->jumpstore) == 0) {
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   219
			msg->ret = msg->func(msg->arg);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   220
		} else {
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   221
			KPutStr("[Child] Returned to main()\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   222
		}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   223
	}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   224
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   225
	/*  Quit the child, exec.library will reply the startup msg internally. */
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   226
	KPutStr("[Child] Done.\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   227
}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   228
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   229
OTTDThread* OTTDCreateThread(OTTDThreadFunc function, void *arg)
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   230
{
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   231
	OTTDThread *t;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   232
	struct Task *parent;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   233
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   234
	KPutStr("[OpenTTD] Create thread...\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   235
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   236
	t = (struct OTTDThread *)AllocVecTaskPooled(sizeof(struct OTTDThread));
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   237
	if (t == NULL) return NULL;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   238
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   239
	parent = FindTask(NULL);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   240
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   241
	/* Make sure main thread runs with sane priority */
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   242
	SetTaskPri(parent, 0);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   243
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   244
	/* Things we'll pass down to the child by utilizing NP_StartupMsg */
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   245
	t->msg.func = function;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   246
	t->msg.arg  = arg;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   247
	t->msg.ret  = NULL;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   248
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   249
	t->replyport = CreateMsgPort();
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   250
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   251
	if (t->replyport != NULL) {
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   252
		struct Process *child;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   253
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   254
		t->msg.msg.mn_Node.ln_Type = NT_MESSAGE;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   255
		t->msg.msg.mn_ReplyPort    = t->replyport;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   256
		t->msg.msg.mn_Length       = sizeof(struct OTTDThreadStartupMessage);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   257
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   258
		child = CreateNewProcTags(
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   259
			NP_CodeType,     CODETYPE_PPC,
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   260
			NP_Entry,        Proxy,
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   261
			NP_StartupMsg,   (ULONG)&t->msg,
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   262
			NP_Priority,     5UL,
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   263
			NP_Name,         (ULONG)"OpenTTD Thread",
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   264
			NP_PPCStackSize, 131072UL,
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   265
			TAG_DONE);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   266
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   267
		if (child != NULL) {
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   268
			KPutStr("[OpenTTD] Child process launched.\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   269
			return t;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   270
		}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   271
		DeleteMsgPort(t->replyport);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   272
	}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   273
	FreeVecTaskPooled(t);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   274
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   275
	return NULL;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   276
}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   277
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   278
void* OTTDJoinThread(OTTDThread *t)
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   279
{
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   280
	struct OTTDThreadStartupMessage *reply;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   281
	void *ret;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   282
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   283
	KPutStr("[OpenTTD] Join threads...\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   284
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   285
	if (t == NULL) return NULL;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   286
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   287
	KPutStr("[OpenTTD] Wait for child to quit...\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   288
	WaitPort(t->replyport);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   289
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   290
	reply = (struct OTTDThreadStartupMessage *)GetMsg(t->replyport);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   291
	ret   = reply->ret;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   292
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   293
	DeleteMsgPort(t->replyport);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   294
	FreeVecTaskPooled(t);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   295
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   296
	return ret;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   297
}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   298
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   299
void OTTDExitThread()
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   300
{
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   301
	struct OTTDThreadStartupMessage *msg;
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   302
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   303
	KPutStr("[Child] Aborting...\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   304
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   305
	if (NewGetTaskAttrs(NULL, &msg, sizeof(struct OTTDThreadStartupMessage *), TASKINFOTYPE_STARTUPMSG, TAG_DONE) && msg != NULL) {
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   306
		KPutStr("[Child] Jumping back...\n");
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   307
		longjmp(msg->jumpstore, 0xBEAFCAFE);
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   308
	}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   309
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   310
	NOT_REACHED();
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   311
}
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   312
e14047c5a8d0 (svn r9759) -Add: added threading code for MorphOS (tokai)
truelight
parents: 6918
diff changeset
   313
#endif