source: trunk/src/kernel32/thread.cpp@ 126

Last change on this file since 126 was 126, checked in by sandervl, 26 years ago

* empty log message *

File size: 5.9 KB
Line 
1/* $Id: thread.cpp,v 1.6 1999-06-20 10:55:36 sandervl Exp $ */
2
3/*
4 * Win32 Thread API functions
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#include <os2win.h>
13#include <stdarg.h>
14#include "thread.h"
15#include "except.h"
16#include "misc.h"
17#include <wprocess.h>
18
19static DWORD OPEN32API Win32ThreadProc(LPVOID lpData);
20
21
22//******************************************************************************
23//******************************************************************************
24HANDLE WIN32API CreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD cbStack,
25 LPTHREAD_START_ROUTINE lpStartAddr,
26 LPVOID lpvThreadParm, DWORD fdwCreate,
27 LPDWORD lpIDThread)
28{
29 Win32Thread *winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate);
30
31 if(winthread == 0)
32 return(0);
33
34 dprintf(("CreateThread (%08xh,%08xh,%08xh,%08xh,%08xh,%08xh)\n",
35 lpsa,
36 cbStack,
37 lpStartAddr,
38 lpvThreadParm,
39 fdwCreate,
40 lpIDThread));
41
42 return(O32_CreateThread(lpsa, cbStack, winthread->GetOS2Callback(), (LPVOID)winthread, fdwCreate, lpIDThread));
43}
44//******************************************************************************
45//******************************************************************************
46DWORD WIN32API GetCurrentThreadId()
47{
48 dprintf(("GetCurrentThreadId\n"));
49
50 return(O32_GetCurrentThreadId());
51}
52//******************************************************************************
53//******************************************************************************
54HANDLE WIN32API GetCurrentThread()
55{
56//// dprintf(("GetCurrentThread\n"));
57 return(O32_GetCurrentThread());
58}
59//******************************************************************************
60//******************************************************************************
61BOOL WIN32API GetExitCodeThread(HANDLE hThread, LPDWORD arg2)
62{
63 dprintf(("GetExitCodeThread (%08xh,%08xh)\n",
64 hThread,
65 arg2));
66
67 return O32_GetExitCodeThread(hThread, arg2);
68}
69//******************************************************************************
70//******************************************************************************
71BOOL WIN32API TerminateThread(HANDLE hThread, DWORD arg2)
72{
73 dprintf(("TerminateThread (%08xh,%08xh)\n",
74 hThread,
75 arg2));
76
77 return O32_TerminateThread(hThread, arg2);
78}
79//******************************************************************************
80//******************************************************************************
81DWORD WIN32API ResumeThread(HANDLE hThread)
82{
83 dprintf(("ResumeThread (%08xh)\n",
84 hThread));
85
86 return O32_ResumeThread(hThread);
87}
88//******************************************************************************
89//******************************************************************************
90INT WIN32API GetThreadPriority(HANDLE hThread)
91{
92 dprintf(("OS2GetThreadPriority(%08xh)\n",
93 hThread));
94
95 return O32_GetThreadPriority(hThread);
96}
97//******************************************************************************
98//******************************************************************************
99DWORD WIN32API SuspendThread(HANDLE hThread)
100{
101 dprintf(("OS2SuspendThread %08xh)\n",
102 hThread));
103
104 return O32_SuspendThread(hThread);
105}
106//******************************************************************************
107//******************************************************************************
108BOOL WIN32API SetThreadPriority(HANDLE hThread, int priority)
109{
110 dprintf(("OS2SetThreadPriority (%08xh,%08xh)\n",
111 hThread,
112 priority));
113
114 return O32_SetThreadPriority(hThread, priority);
115}
116//******************************************************************************
117//******************************************************************************
118VOID WIN32API ExitThread(DWORD exitcode)
119{
120 dprintf(("ExitThread (%08xu)\n",
121 exitcode));
122
123#ifdef WIN32_TIBSEL
124 DestroyTIB();
125#endif
126 O32_ExitThread(exitcode);
127}
128//******************************************************************************
129//******************************************************************************
130Win32Thread::Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags)
131{
132 lpUserData = lpData;
133 pCallback = pUserCallback;
134 this->dwFlags = dwFlags;
135}
136//******************************************************************************
137//******************************************************************************
138Win32Thread::~Win32Thread()
139{
140
141}
142//******************************************************************************
143//******************************************************************************
144PTHREAD_START_ROUTINE_O32 Win32Thread::GetOS2Callback()
145{
146 return Win32ThreadProc;
147}
148//******************************************************************************
149//******************************************************************************
150static DWORD OPEN32API Win32ThreadProc(LPVOID lpData)
151{
152 Win32Thread *me = (Win32Thread *)lpData;
153 WIN32THREADPROC winthread = me->pCallback;
154 LPVOID userdata = me->lpUserData;
155
156 delete me; //only called once
157
158 dprintf(("Win32ThreadProc %d\n", GetCurrentThreadId()));
159
160#ifdef WIN32_TIBSEL
161 TEB *winteb = (TEB *)InitializeTIB();
162 if(winteb == NULL) {
163 dprintf(("Win32ThreadProc: InitializeTIB failed!!"));
164 DebugInt3();
165 return 0;
166 }
167 winteb->flags = me->dwFlags;
168
169 THDB *thdb = (THDB *)(winteb+1);
170 thdb->entry_point = (void *)winthread;
171 thdb->entry_arg = (void *)userdata;
172 SetWin32TIB();
173#else
174 ReplaceExceptionHandler();
175#endif
176 return(winthread(userdata));
177}
178//******************************************************************************
179//******************************************************************************
Note: See TracBrowser for help on using the repository browser.