src/thread_os2.cpp
author rubidium
Sun, 06 Apr 2008 12:26:40 +0000
branchnoai
changeset 9867 b7d9ffe24f81
parent 9857 7adb6a846add
child 10171 d4397d599d78
permissions -rw-r--r--
(svn r12589) [NoAI] -Add: GetLastError support for AIBridge.
9857
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     1
/* $Id$ */
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     2
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     3
/** @file thread_os2.cpp OS2 implementation of Threads. */
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     4
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     5
#include "stdafx.h"
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     6
#include "thread.h"
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     7
#include "debug.h"
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     8
#include "core/alloc_func.hpp"
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
     9
#include <stdlib.h>
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    10
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    11
#define INCL_DOS
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    12
#include <os2.h>
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    13
#include <process.h>
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    14
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    15
struct OTTDThread {
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    16
	TID thread;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    17
	OTTDThreadFunc func;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    18
	void *arg;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    19
	void *ret;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    20
};
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    21
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    22
static void Proxy(void *arg)
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    23
{
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    24
	OTTDThread *t = (OTTDThread *)arg;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    25
	t->ret = t->func(t->arg);
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    26
}
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    27
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    28
OTTDThread *OTTDCreateThread(OTTDThreadFunc function, void *arg)
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    29
{
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    30
	OTTDThread *t = MallocT<OTTDThread>(1);
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    31
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    32
	if (t == NULL) return NULL;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    33
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    34
	t->func = function;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    35
	t->arg  = arg;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    36
	t->thread = _beginthread(Proxy, NULL, 32768, t);
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    37
	if (t->thread != (TID)-1) {
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    38
		return t;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    39
	} else {
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    40
		free(t);
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    41
		return NULL;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    42
	}
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    43
}
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    44
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    45
void *OTTDJoinThread(OTTDThread *t)
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    46
{
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    47
	void *ret;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    48
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    49
	if (t == NULL) return NULL;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    50
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    51
	DosWaitThread(&t->thread, DCWW_WAIT);
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    52
	ret = t->ret;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    53
	free(t);
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    54
	return ret;
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    55
}
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    56
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    57
void OTTDExitThread()
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    58
{
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    59
	_endthread();
7adb6a846add (svn r12529) [NoAI] -Change: split thread.cpp into 4 files, one for each OS
truebrain
parents:
diff changeset
    60
}