Ignore:
Timestamp:
Feb 4, 2003, 12:29:03 PM (23 years ago)
Author:
sandervl
Message:

Support DuplicateHandle for threads; cleaned up semaphore code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/hmthread.cpp

    r9667 r9748  
    1 /* $Id: hmthread.cpp,v 1.17 2003-01-13 16:51:39 sandervl Exp $ */
     1/* $Id: hmthread.cpp,v 1.18 2003-02-04 11:29:00 sandervl Exp $ */
    22
    33/*
     
    4040#include "dbglocal.h"
    4141
     42
     43typedef 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
    4249
    4350//******************************************************************************
     
    6067    }
    6168    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;
    6378
    6479    //SvL: This doesn't really create a thread, but only sets up the
    6580    //     handle of thread 0
    6681    if(fFirstThread) {
    67             pHMHandleData->hHMHandle = O32_GetCurrentThread(); //return Open32 handle of thread
    68             return pHMHandleData->hHMHandle;
     82        pHMHandleData->hHMHandle = O32_GetCurrentThread(); //return Open32 handle of thread
     83        return pHMHandleData->hHMHandle;
    6984    }
    7085    winthread = new Win32Thread(lpStartAddr, lpvThreadParm, fdwCreate, hThread);
     
    112127    return pHMHandleData->hHMHandle;
    113128}
     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 *****************************************************************************/
     142BOOL 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}
    114187//******************************************************************************
    115188//******************************************************************************
     
    117190{
    118191    DWORD dwSuspend;
    119 
    120     TEB *teb = GetTEBFromThreadHandle(hThread);
     192    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     193
     194    TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread));
    121195    if(teb) {
    122196        teb->o.odin.dwSuspend++;
     
    135209{
    136210    DWORD dwSuspend;
    137     TEB *teb = GetTEBFromThreadHandle(hThread);
     211    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     212
     213    TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread));
    138214    if(teb) {
    139215        teb->o.odin.dwSuspend--;
     
    151227INT HMDeviceThreadClass::GetThreadPriority(HANDLE hThread, PHMHANDLEDATA pHMHandleData)
    152228{
    153     TEB *teb;
     229    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
    154230
    155231    dprintf(("GetThreadPriority(%08xh)\n", pHMHandleData->hHMHandle));
    156232
    157     teb = GetTEBFromThreadHandle(hThread);
     233    TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread));
    158234    if(teb == NULL) {
    159235        dprintf(("!WARNING!: TEB not found!!"));
     
    167243BOOL HMDeviceThreadClass::SetThreadPriority(HANDLE hThread, PHMHANDLEDATA pHMHandleData, int priority)
    168244{
    169     TEB  *teb;
     245    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
    170246
    171247    dprintf(("SetThreadPriority (%08xh,%08xh)", pHMHandleData->hHMHandle, priority));
    172248
    173     teb = GetTEBFromThreadHandle(hThread);
     249    TEB *teb = GetTEBFromThreadHandle(GET_THREADHANDLE(hThread));
    174250    if(teb == NULL) {
    175251        dprintf(("!WARNING!: TEB not found!!"));
     
    214290  return FALSE;
    215291}
     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
     308BOOL 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}
    216324//******************************************************************************
    217325//******************************************************************************
    218326BOOL HMDeviceThreadClass::TerminateThread(HANDLE hThread, PHMHANDLEDATA pHMHandleData, DWORD exitcode)
    219327{
     328    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     329
    220330    dprintf(("TerminateThread (%08xh,%08xh)\n",
    221331             pHMHandleData->hHMHandle,
    222332             exitcode));
    223333
    224     pHMHandleData->dwUserData = THREAD_TERMINATED;
     334    if(threadobj) {
     335        threadobj->dwState = THREAD_TERMINATED;
     336    }
     337    else DebugInt3();
    225338    return O32_TerminateThread(pHMHandleData->hHMHandle, exitcode);
    226339}
     
    229342BOOL HMDeviceThreadClass::SetThreadTerminated(HANDLE hThread, PHMHANDLEDATA pHMHandleData)
    230343{
    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
    232351    return TRUE;
    233352}
     
    241360
    242361#if 0
    243     if(pHMHandleData->dwUserData == THREAD_ALIVE) {
     362    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     363
     364    if(threadobj && threadobj->dwState == THREAD_ALIVE) {
    244365        lpExitCode == STILL_ALIVE;
    245366        return TRUE;
    246367    }
     368    else DebugInt3();
    247369#endif
    248370    return O32_GetExitCodeThread(pHMHandleData->hHMHandle, lpExitCode);
     
    252374BOOL HMDeviceThreadClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
    253375{
     376    OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     377
    254378    dprintf(("HMThread::CloseHandle %08x", pHMHandleData->hHMHandle));
     379
     380    if(threadobj) {
     381        pHMHandleData->dwUserData = 0;
     382        free(threadobj);
     383    }
    255384    return O32_CloseHandle(pHMHandleData->hHMHandle);
    256385}
     
    260389                                               DWORD  dwTimeout)
    261390{
     391  OBJ_THREAD *threadobj = (OBJ_THREAD *)pHMHandleData->dwUserData;
     392
    262393  dprintf(("HMThread::WaitForSingleObject (%08xh,%08xh)\n",
    263394           pHMHandleData->hHMHandle,
     
    265396 
    266397  //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) {
    268399        return WAIT_OBJECT_0;
    269400  }
     
    276407                                                 BOOL   fAlertable)
    277408{
    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) {
    279413        return WAIT_OBJECT_0;
    280414  }
Note: See TracChangeset for help on using the changeset viewer.