Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

293 lines
3.9 KiB

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
INFSCAN
worker.cpp
Abstract:
WorkerThread and JobItem implementations
Classes to simplify working with threads
History:
Created July 2001 - JamieHun
--*/
#include "precomp.h"
#pragma hdrstop
//
// Worker thread basics
//
WorkerThread::WorkerThread()
/*++
Routine Description:
Initialize WorkerThread
--*/
{
ThreadHandle = NULL;
ThreadId = 0;
}
WorkerThread::~WorkerThread()
/*++
Routine Description:
Cleanup WorkerThread
release allocated resources
--*/
{
if(ThreadHandle) {
Wait();
}
}
bool WorkerThread::Begin()
/*++
Routine Description:
Kick off thread
Arguments:
NONE
Return Value:
true if successful
--*/
{
if(ThreadHandle) {
return false;
}
ThreadHandle = reinterpret_cast<HANDLE>(_beginthreadex(NULL,0,WrapWorker,this,CREATE_SUSPENDED,&ThreadId));
if(!ThreadHandle) {
return false;
}
//
// this side of the thread object done, child can continue
//
ResumeThread(ThreadHandle);
return true;
}
unsigned WorkerThread::Wait()
/*++
Routine Description:
Wait until thread terminates
Arguments:
NONE
Return Value:
exit code
--*/
{
if(!ThreadHandle) {
return (unsigned)(-1);
}
WaitForSingleObject(ThreadHandle,INFINITE);
DWORD ExitCode;
if(!GetExitCodeThread(ThreadHandle,&ExitCode)) {
CloseHandle(ThreadHandle);
return (unsigned)(-1);
}
CloseHandle(ThreadHandle);
ThreadHandle = NULL;
return static_cast<unsigned>(ExitCode);
}
unsigned WorkerThread::Worker()
/*++
Routine Description:
overridable thread operation
Arguments:
NONE
Return Value:
exit code
--*/
{
return 0;
}
unsigned WorkerThread::WrapWorker(void * This)
/*++
Routine Description:
_beginthreadex expects static function, invoke real worker
Arguments:
pointer to class instance
Return Value:
exit code
--*/
{
//
// static function, invoke protected member function
//
WorkerThread * TypedThis = reinterpret_cast<WorkerThread*>(This);
if(TypedThis == NULL) {
return 0;
}
return TypedThis->Worker();
}
JobItem::~JobItem()
/*++
Routine Description:
Job variation cleanup
--*/
{
//
// nothing
//
}
int JobItem::Run()
/*++
Routine Description:
Job item dummy Run
Arguments:
NONE
Return Value:
0 on success
--*/
{
//
// nothing
//
return 0;
}
int JobItem::PartialCleanup()
/*++
Routine Description:
Job item dummy PartialCleanup
Arguments:
NONE
Return Value:
0 on success
--*/
{
//
// nothing
//
return 0;
}
int JobItem::Results()
/*++
Routine Description:
Job item dummy Results
Arguments:
NONE
Return Value:
0 on success
--*/
{
//
// nothing
//
return 0;
}
int JobItem::PreResults()
/*++
Routine Description:
Job item dummy PreResults
Arguments:
NONE
Return Value:
0 on success
--*/
{
//
// nothing
//
return 0;
}
unsigned JobThread::Worker()
/*++
Routine Description:
Job thread. Pull job from GlobalScan::GetNextJob
execute it
do partial cleanup
rinse repeat
Arguments:
NONE
Return Value:
0 on success
--*/
{
//
// simple task
//
JobEntry * pJob;
if(!pGlobalScan) {
return 0;
}
for(;;) {
pJob = pGlobalScan->GetNextJob();
if(!pJob) {
return 0;
}
int res = pJob->Run();
pJob->PartialCleanup();
if(res != 0) {
return res;
}
}
return 0;
}