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