Changeset 9748 for trunk/src/kernel32/hmthread.cpp
- Timestamp:
- Feb 4, 2003, 12:29:03 PM (23 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/hmthread.cpp
r9667 r9748 1 /* $Id: hmthread.cpp,v 1.1 7 2003-01-13 16:51:39sandervl Exp $ */1 /* $Id: hmthread.cpp,v 1.18 2003-02-04 11:29:00 sandervl Exp $ */ 2 2 3 3 /* … … 40 40 #include "dbglocal.h" 41 41 42 43 typedef struct { 44 HANDLE hDupThread; //original thread handle if duplicated 45 DWORD dwState; //THREAD_ALIVE, THREAD_TERMINATED 46 } OBJ_THREAD; 47 48 #define GET_THREADHANDLE(hThread) (threadobj && threadobj->hDupThread) ? threadobj->hDupThread : hThread 42 49 43 50 //****************************************************************************** … … 60 67 } 61 68 pHMHandleData->dwInternalType = HMTYPE_THREAD; 62 pHMHandleData->dwUserData = THREAD_ALIVE; 69 OBJ_THREAD *threadobj = (OBJ_THREAD *)malloc(sizeof(OBJ_THREAD)); 70 if(threadobj == 0) { 71 DebugInt3(); 72 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 73 return(0); 74 } 75 threadobj->hDupThread = 0; //not a duplicate 76 threadobj->dwState = THREAD_ALIVE; 77 pHMHandleData->dwUserData = (DWORD)threadobj; 63 78 64 79 //SvL: This doesn't really create a thread, but only sets up the 65 80 // handle of thread 0 66 81 if(fFirstThread) { 67 68 82 pHMHandleData->hHMHandle = O32_GetCurrentThread(); //return Open32 handle of thread 83 return pHMHandleData->hHMHandle; 69 84 } 70 85 winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate, hThread); … … 112 127 return pHMHandleData->hHMHandle; 113 128 } 129 /***************************************************************************** 130 * Name : HMDeviceFileClass::DuplicateHandle 131 * Purpose : 132 * Parameters: 133 * various parameters as required 134 * Variables : 135 * Result : 136 * Remark : DUPLICATE_CLOSE_SOURCE flag handled in HMDuplicateHandle 137 * 138 * Status : partially implemented 139 * 140 * Author : SvL 141 *****************************************************************************/ 142 BOOL HMDeviceThreadClass::DuplicateHandle(HANDLE srchandle, PHMHANDLEDATA pHMHandleData, 143 HANDLE srcprocess, 144 PHMHANDLEDATA pHMSrcHandle, 145 HANDLE destprocess, 146 PHANDLE desthandle, 147 DWORD fdwAccess, 148 BOOL fInherit, 149 DWORD fdwOptions, 150 DWORD fdwOdinOptions) 151 { 152 BOOL ret; 153 OBJ_THREAD *threadsrc = (OBJ_THREAD *)pHMSrcHandle->dwUserData; 154 155 dprintf(("KERNEL32:HMDeviceThreadClass::DuplicateHandle (%08x,%08x,%08x,%08x,%08x)", 156 pHMHandleData, srcprocess, pHMSrcHandle->hHMHandle, destprocess, desthandle)); 157 158 if(destprocess != srcprocess) 159 { 160 dprintf(("ERROR: DuplicateHandle; different processes not supported!!")); 161 SetLastError(ERROR_INVALID_HANDLE); //?? 162 return FALSE; 163 } 164 ret = O32_DuplicateHandle(srcprocess, pHMSrcHandle->hHMHandle, destprocess, desthandle, fdwAccess, fInherit, fdwOptions); 165 166 if(ret == TRUE) { 167 OBJ_THREAD *threaddest = (OBJ_THREAD *)malloc(sizeof(OBJ_THREAD)); 168 if(threaddest == NULL) { 169 O32_CloseHandle(*desthandle); 170 SetLastError(ERROR_NOT_ENOUGH_MEMORY); 171 return FALSE; 172 } 173 threaddest->hDupThread = 0; 174 threaddest->dwState = THREAD_ALIVE; 175 pHMHandleData->dwUserData = (DWORD)threaddest; 176 177 if(threadsrc) { 178 threaddest->hDupThread = (threadsrc->hDupThread) ? threadsrc->hDupThread : srchandle; 179 threaddest->dwState = threadsrc->dwState; 180 } 181 182 pHMHandleData->hHMHandle = *desthandle; 183 return TRUE; 184 } 185 else return FALSE; 186 } 114 187 //****************************************************************************** 115 188 //****************************************************************************** … … 117 190 { 118 191 DWORD dwSuspend; 119 120 TEB *teb = GetTEBFromThreadHandle(hThread); 192 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 193 194 TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread)); 121 195 if(teb) { 122 196 teb->o.odin.dwSuspend++; … … 135 209 { 136 210 DWORD dwSuspend; 137 TEB *teb = GetTEBFromThreadHandle(hThread); 211 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 212 213 TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread)); 138 214 if(teb) { 139 215 teb->o.odin.dwSuspend--; … … 151 227 INT HMDeviceThreadClass::GetThreadPriority(HANDLE hThread, PHMHANDLEDATA pHMHandleData) 152 228 { 153 TEB *teb;229 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 154 230 155 231 dprintf(("GetThreadPriority(%08xh)\n", pHMHandleData->hHMHandle)); 156 232 157 teb = GetTEBFromThreadHandle(hThread);233 TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread)); 158 234 if(teb == NULL) { 159 235 dprintf(("!WARNING!: TEB not found!!")); … … 167 243 BOOL HMDeviceThreadClass::SetThreadPriority(HANDLE hThread, PHMHANDLEDATA pHMHandleData, int priority) 168 244 { 169 TEB *teb;245 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 170 246 171 247 dprintf(("SetThreadPriority (%08xh,%08xh)", pHMHandleData->hHMHandle, priority)); 172 248 173 teb = GetTEBFromThreadHandle(hThread);249 TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread)); 174 250 if(teb == NULL) { 175 251 dprintf(("!WARNING!: TEB not found!!")); … … 214 290 return FALSE; 215 291 } 292 /***************************************************************************** 293 * Name : BOOL GetThreadTimes 294 * Purpose : The GetThreadTimes function obtains timing information about a specified thread. 295 * Parameters: HANDLE hThread specifies the thread of interest 296 * LPFILETIME lpCreationTime when the thread was created 297 * LPFILETIME lpExitTime when the thread exited 298 * LPFILETIME lpKernelTime time the thread has spent in kernel mode 299 * LPFILETIME lpUserTime time the thread has spent in user mode 300 * Variables : 301 * Result : TRUE / FALSE 302 * Remark : 303 * Status : UNTESTED STUB 304 * 305 * Author : Patrick Haller [Mon, 1998/06/15 08:00] 306 *****************************************************************************/ 307 308 BOOL HMDeviceThreadClass::GetThreadTimes(HANDLE hThread, 309 PHMHANDLEDATA pHMHandleData, 310 LPFILETIME lpCreationTime, 311 LPFILETIME lpExitTime, 312 LPFILETIME lpKernelTime, 313 LPFILETIME lpUserTime) 314 { 315 dprintf(("Kernel32: GetThreadTimes(%08xh,%08xh,%08xh,%08xh,%08xh) not implemented.\n", 316 hThread, 317 lpCreationTime, 318 lpExitTime, 319 lpKernelTime, 320 lpUserTime)); 321 322 return (FALSE); 323 } 216 324 //****************************************************************************** 217 325 //****************************************************************************** 218 326 BOOL HMDeviceThreadClass::TerminateThread(HANDLE hThread, PHMHANDLEDATA pHMHandleData, DWORD exitcode) 219 327 { 328 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 329 220 330 dprintf(("TerminateThread (%08xh,%08xh)\n", 221 331 pHMHandleData->hHMHandle, 222 332 exitcode)); 223 333 224 pHMHandleData->dwUserData = THREAD_TERMINATED; 334 if(threadobj) { 335 threadobj->dwState = THREAD_TERMINATED; 336 } 337 else DebugInt3(); 225 338 return O32_TerminateThread(pHMHandleData->hHMHandle, exitcode); 226 339 } … … 229 342 BOOL HMDeviceThreadClass::SetThreadTerminated(HANDLE hThread, PHMHANDLEDATA pHMHandleData) 230 343 { 231 pHMHandleData->dwUserData = THREAD_TERMINATED; 344 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 345 346 if(threadobj) { 347 threadobj->dwState = THREAD_TERMINATED; 348 } 349 else DebugInt3(); 350 232 351 return TRUE; 233 352 } … … 241 360 242 361 #if 0 243 if(pHMHandleData->dwUserData == THREAD_ALIVE) { 362 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 363 364 if(threadobj && threadobj->dwState == THREAD_ALIVE) { 244 365 lpExitCode == STILL_ALIVE; 245 366 return TRUE; 246 367 } 368 else DebugInt3(); 247 369 #endif 248 370 return O32_GetExitCodeThread(pHMHandleData->hHMHandle, lpExitCode); … … 252 374 BOOL HMDeviceThreadClass::CloseHandle(PHMHANDLEDATA pHMHandleData) 253 375 { 376 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 377 254 378 dprintf(("HMThread::CloseHandle %08x", pHMHandleData->hHMHandle)); 379 380 if(threadobj) { 381 pHMHandleData->dwUserData = 0; 382 free(threadobj); 383 } 255 384 return O32_CloseHandle(pHMHandleData->hHMHandle); 256 385 } … … 260 389 DWORD dwTimeout) 261 390 { 391 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 392 262 393 dprintf(("HMThread::WaitForSingleObject (%08xh,%08xh)\n", 263 394 pHMHandleData->hHMHandle, … … 265 396 266 397 //This doesn't work very well in Open32 (object's state never signaled) 267 if( pHMHandleData->dwUserData== THREAD_TERMINATED) {398 if(threadobj && threadobj->dwState == THREAD_TERMINATED) { 268 399 return WAIT_OBJECT_0; 269 400 } … … 276 407 BOOL fAlertable) 277 408 { 278 if(pHMHandleData->dwUserData == THREAD_TERMINATED) { 409 OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData; 410 411 //This doesn't work very well in Open32 (object's state never signaled) 412 if(threadobj && threadobj->dwState == THREAD_TERMINATED) { 279 413 return WAIT_OBJECT_0; 280 414 }
Note:
See TracChangeset
for help on using the changeset viewer.