windows-nt/Source/XPSP1/NT/net/ias/services/thrdpool/dispatcher.h
2020-09-26 16:20:57 +08:00

76 lines
2.2 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1997, Microsoft Corp. All rights reserved.
//
// FILE
//
// Dispatcher.h
//
// SYNOPSIS
//
// This file describes the class Dispatcher.
//
// MODIFICATION HISTORY
//
// 7/31/1997 Original version.
// 4/16/1998 Added 'empty' event.
// 8/07/1998 Added 'last out' thread handle.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _DISPATCHER_H_
#define _DISPATCHER_H_
#include <guard.h>
#include <nocopy.h>
//////////
// Default number of milliseconds that a thread will wait for work.
//////////
const DWORD DEFAULT_MAX_IDLE = 5 * 60 * 1000;
///////////////////////////////////////////////////////////////////////////////
//
// CLASS
//
// Dispatcher
//
// DESCRIPTION
//
// This class maintains an upper-bounded recycle bin of threads. Instead
// of calling the Win32 CreateThread() function, clients instead call
// RequestThread(). If a thread is available it will be dispatched
// immediately, otherwise the request is placed in a FIFO queue until a
// thread becomes available.
//
///////////////////////////////////////////////////////////////////////////////
class Dispatcher
: Guardable, NonCopyable
{
public:
BOOL initialize(DWORD dwMaxThreads = 0,
DWORD dwMaxIdle = DEFAULT_MAX_IDLE) throw ();
void finalize() throw ();
BOOL requestThread(PIAS_CALLBACK OnStart) throw ();
DWORD setMaxNumberOfThreads(DWORD dwMaxThreads) throw ();
DWORD setMaxThreadIdle(DWORD dwMilliseconds) throw ();
protected:
// Main loop to dispatch thread requests.
void fillRequests() throw ();
DWORD numThreads; // Current number of threads.
DWORD maxThreads; // Maximum size of the thread pool.
LONG available; // Number of threads available for work (may be < 0).
DWORD maxIdle; // Max. time (in msec) that a thread will idle.
HANDLE hPort; // I/O Completion Port used as the queue.
HANDLE hEmpty; // Event indicating that the pool is empty.
HANDLE hLastOut; // The last thread to exit from the pool.
// Start routine for all threads.
static unsigned __stdcall startRoutine(void* pArg) throw ();
};
#endif _DISPATCHER_H_