123 lines
2.6 KiB
C++
123 lines
2.6 KiB
C++
// Copyright (C) 1996-1997 Microsoft Corporation. All rights reserved.
|
|
|
|
#include "header.h"
|
|
|
|
static DWORD thrdID;
|
|
static HANDLE hThrd;
|
|
static HANDLE hsemThread;
|
|
static int ThreadPriority;
|
|
static THRD_COMMAND ThreadCommand;
|
|
static void* pThreadParam;
|
|
|
|
static DWORD WINAPI WorkerThread(LPVOID pParam);
|
|
|
|
BOOL ActivateThread(THRD_COMMAND cmd, void* pParam, int priority)
|
|
{
|
|
if (!hThrd) {
|
|
if (cmd == THRD_TERMINATE) // don't start the thread just to kill it
|
|
return FALSE;
|
|
|
|
if (!hsemThread)
|
|
hsemThread = CreateSemaphore(NULL, 0, 1, NULL);
|
|
hThrd = CreateThread(NULL, 0, &WorkerThread, NULL,
|
|
0, &thrdID);
|
|
if (!hThrd) {
|
|
OOM();
|
|
return FALSE;
|
|
}
|
|
SetThreadPriority(hThrd, ThreadPriority = priority);
|
|
}
|
|
|
|
if (g_fThreadRunning)
|
|
return FALSE;
|
|
|
|
if (g_fDualCPU == -1) { // haven't initialized it yet
|
|
HKEY hkey;
|
|
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
|
|
"HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\1", 0,
|
|
KEY_READ, &hkey) == ERROR_SUCCESS) {
|
|
g_fDualCPU = TRUE;
|
|
RegCloseKey(hkey);
|
|
}
|
|
else
|
|
g_fDualCPU = FALSE;
|
|
}
|
|
|
|
// For multiple CPU's, we can use a normal priority for threads
|
|
|
|
if (g_fDualCPU && (priority == THREAD_PRIORITY_IDLE ||
|
|
priority == THREAD_PRIORITY_LOWEST ||
|
|
priority == THREAD_PRIORITY_BELOW_NORMAL))
|
|
priority = THREAD_PRIORITY_NORMAL;
|
|
|
|
if (ThreadPriority != priority)
|
|
SetThreadPriority(hThrd, ThreadPriority = priority);
|
|
|
|
ThreadCommand = cmd;
|
|
pThreadParam = pParam;
|
|
|
|
g_fThreadRunning = TRUE;
|
|
ReleaseSemaphore(hsemThread, 1, NULL);
|
|
return TRUE;
|
|
}
|
|
|
|
/***************************************************************************
|
|
|
|
FUNCTION: WaitForThread
|
|
|
|
PURPOSE: Find out if the worker thread is running. If it is, and
|
|
the command is anything other then THRD_ANY, then kick
|
|
up the thread priority and wait for it to finish.
|
|
|
|
PARAMETERS:
|
|
cmd
|
|
|
|
RETURNS:
|
|
|
|
COMMENTS:
|
|
|
|
MODIFICATION DATES:
|
|
04-Jun-1997 [ralphw]
|
|
|
|
***************************************************************************/
|
|
|
|
BOOL WaitForThread(THRD_COMMAND cmd)
|
|
{
|
|
if (!g_fThreadRunning)
|
|
return TRUE;
|
|
else if (cmd != THRD_ANY && cmd != ThreadCommand)
|
|
return FALSE;
|
|
|
|
// Kick the thread to a high priority, and wait for it to complete
|
|
|
|
SetThreadPriority(hThrd, THREAD_PRIORITY_HIGHEST);
|
|
|
|
{
|
|
CHourGlass waitcur;
|
|
while (g_fThreadRunning)
|
|
Sleep(200);
|
|
}
|
|
|
|
SetThreadPriority(hThrd, ThreadPriority);
|
|
return TRUE;
|
|
}
|
|
|
|
static DWORD WINAPI WorkerThread(LPVOID pParam)
|
|
{
|
|
for (;;) {
|
|
if (WaitForSingleObject(hsemThread, INFINITE) != WAIT_OBJECT_0)
|
|
return (UINT) -1;
|
|
|
|
switch (ThreadCommand) {
|
|
case THRD_TERMINATE:
|
|
g_fThreadRunning = FALSE;
|
|
thrdID = 0;
|
|
hThrd = NULL;
|
|
ExitThread(0);
|
|
break;
|
|
}
|
|
|
|
g_fThreadRunning = FALSE;
|
|
}
|
|
}
|