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

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

EB's GetThreadContext update

File size: 8.5 KB
Line 
1/* $Id: thread.cpp,v 1.20 1999-12-19 17:49:38 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
13/*****************************************************************************
14 * Includes *
15 *****************************************************************************/
16
17#include <odin.h>
18#include <odinwrap.h>
19#include <os2sel.h>
20
21#include <os2win.h>
22#include <stdarg.h>
23#include <string.h>
24#include "thread.h"
25#include "exceptutil.h"
26#include <misc.h>
27#include <wprocess.h>
28#include <windllbase.h>
29#include <winexebase.h>
30#include "exceptutil.h"
31
32ODINDEBUGCHANNEL(KERNEL32-THREAD)
33
34
35static DWORD OPEN32API Win32ThreadProc(LPVOID lpData);
36
37
38//******************************************************************************
39//******************************************************************************
40ODINFUNCTION6(HANDLE,CreateThread,LPSECURITY_ATTRIBUTES, lpsa,
41 DWORD, cbStack,
42 LPTHREAD_START_ROUTINE, lpStartAddr,
43 LPVOID, lpvThreadParm,
44 DWORD, fdwCreate,
45 LPDWORD, lpIDThread)
46{
47 Win32Thread *winthread;
48
49 winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate);
50
51 if(winthread == 0)
52 return(0);
53
54#ifdef DEBUG
55 // @@@PH Note: with debug code enabled, ODIN might request more stack space!
56 if (cbStack > 0)
57 cbStack <<= 1; // double stack
58 else
59 cbStack = 1048576; // per default 1MB stack per thread
60#endif
61
62 return(O32_CreateThread(lpsa,
63 cbStack,
64 winthread->GetOS2Callback(),
65 (LPVOID)winthread,
66 fdwCreate,
67 lpIDThread));
68}
69//******************************************************************************
70//******************************************************************************
71DWORD WIN32API GetCurrentThreadId()
72{
73//// dprintf(("GetCurrentThreadId\n"));
74 return(O32_GetCurrentThreadId());
75}
76//******************************************************************************
77//******************************************************************************
78HANDLE WIN32API GetCurrentThread()
79{
80//// dprintf(("GetCurrentThread\n"));
81 return(O32_GetCurrentThread());
82}
83//******************************************************************************
84//******************************************************************************
85BOOL WIN32API GetExitCodeThread(HANDLE hThread, LPDWORD arg2)
86{
87 dprintf(("GetExitCodeThread (%08xh,%08xh)\n",
88 hThread,
89 arg2));
90
91 return O32_GetExitCodeThread(hThread, arg2);
92}
93//******************************************************************************
94//******************************************************************************
95BOOL WIN32API TerminateThread(HANDLE hThread, DWORD arg2)
96{
97 dprintf(("TerminateThread (%08xh,%08xh)\n",
98 hThread,
99 arg2));
100
101 return O32_TerminateThread(hThread, arg2);
102}
103//******************************************************************************
104//******************************************************************************
105DWORD WIN32API ResumeThread(HANDLE hThread)
106{
107 dprintf(("ResumeThread (%08xh)\n",
108 hThread));
109
110 return O32_ResumeThread(hThread);
111}
112//******************************************************************************
113//******************************************************************************
114INT WIN32API GetThreadPriority(HANDLE hThread)
115{
116 dprintf(("OS2GetThreadPriority(%08xh)\n",
117 hThread));
118
119 return O32_GetThreadPriority(hThread);
120}
121//******************************************************************************
122//******************************************************************************
123DWORD WIN32API SuspendThread(HANDLE hThread)
124{
125 dprintf(("OS2SuspendThread %08xh)\n",
126 hThread));
127
128 return O32_SuspendThread(hThread);
129}
130//******************************************************************************
131//******************************************************************************
132BOOL WIN32API SetThreadPriority(HANDLE hThread, int priority)
133{
134 dprintf(("OS2SetThreadPriority (%08xh,%08xh)\n",
135 hThread,
136 priority));
137
138 return O32_SetThreadPriority(hThread, priority);
139}
140//******************************************************************************
141//TODO: Implement this??
142//******************************************************************************
143BOOL WIN32API GetThreadContext(HANDLE hThread, PCONTEXT lpContext)
144{
145 dprintf(("GetThreadContext NOT IMPLEMENTED!! (TRUE)\n"));
146 memset(lpContext, 0, sizeof(CONTEXT));
147
148 /* make up some plausible values for segment registers */
149 lpContext->SegCs = getCS();
150 lpContext->SegDs = getDS();
151 lpContext->SegSs = getSS();
152 lpContext->SegEs = getES();
153 lpContext->SegGs = getGS();
154 lpContext->SegFs = GetFS();
155
156 return TRUE;
157}
158//******************************************************************************
159//TODO: Implement this??
160//******************************************************************************
161BOOL WIN32API SetThreadContext(HANDLE hThread, const CONTEXT *lpContext)
162{
163 dprintf(("SetThreadContext NOT IMPLEMENTED!!\n"));
164
165 return FALSE;
166}
167//******************************************************************************
168//******************************************************************************
169VOID WIN32API ExitThread(DWORD exitcode)
170{
171 dprintf(("ExitThread (%08xu)\n",
172 exitcode));
173
174 Win32DllBase::detachThreadFromAllDlls(); //send DLL_THREAD_DETACH message to all dlls
175 Win32DllBase::tlsDetachThreadFromAllDlls(); //destroy TLS structures of all dlls
176 WinExe->tlsDetachThread(); //destroy TLS structure of main exe
177 DestroyTIB();
178 O32_ExitThread(exitcode);
179}
180//******************************************************************************
181//******************************************************************************
182Win32Thread::Win32Thread(LPTHREAD_START_ROUTINE pUserCallback, LPVOID lpData, DWORD dwFlags)
183{
184 lpUserData = lpData;
185 pCallback = pUserCallback;
186 this->dwFlags = dwFlags;
187}
188//******************************************************************************
189//******************************************************************************
190Win32Thread::~Win32Thread()
191{
192
193}
194//******************************************************************************
195//******************************************************************************
196PTHREAD_START_ROUTINE_O32 Win32Thread::GetOS2Callback()
197{
198 return Win32ThreadProc;
199}
200//******************************************************************************
201//******************************************************************************
202static DWORD OPEN32API Win32ThreadProc(LPVOID lpData)
203{
204 EXCEPTION_FRAME exceptFrame;
205 Win32Thread *me = (Win32Thread *)lpData;
206 WIN32THREADPROC winthread = me->pCallback;
207 LPVOID userdata = me->lpUserData;
208 DWORD rc;
209
210 delete(me); //only called once
211 dprintf(("Win32ThreadProc %d\n", GetCurrentThreadId()));
212
213 TEB *winteb = (TEB *)InitializeTIB();
214 if(winteb == NULL) {
215 dprintf(("Win32ThreadProc: InitializeTIB failed!!"));
216 DebugInt3();
217 return 0;
218 }
219 winteb->flags = me->dwFlags;
220
221 THDB *thdb = (THDB *)(winteb+1);
222 thdb->entry_point = (void *)winthread;
223 thdb->entry_arg = (void *)userdata;
224
225 //Note: The Win32 exception structure referenced by FS:[0] is the same
226 // in OS/2
227 OS2SetExceptionHandler((void *)&exceptFrame);
228
229 SetWin32TIB();
230 WinExe->tlsAttachThread(); //setup TLS structure of main exe
231 Win32DllBase::tlsAttachThreadToAllDlls(); //setup TLS structures of all dlls
232 Win32DllBase::attachThreadToAllDlls(); //send DLL_THREAD_ATTACH message to all dlls
233
234 rc = winthread(userdata);
235
236 Win32DllBase::detachThreadFromAllDlls(); //send DLL_THREAD_DETACH message to all dlls
237 Win32DllBase::tlsDetachThreadFromAllDlls(); //destroy TLS structures of all dlls
238 WinExe->tlsDetachThread(); //destroy TLS structure of main exe
239 DestroyTIB();
240 OS2UnsetExceptionHandler((void *)&exceptFrame);
241
242 return rc;
243}
244//******************************************************************************
245//******************************************************************************
Note: See TracBrowser for help on using the repository browser.