Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

242 lines
6.6 KiB

/*
- QOSINT.H
-
* Microsoft NetMeeting
* Quality of Service DLL
* Internal QoS header file
*
* Revision History:
*
* When Who What
* -------- ------------------ ---------------------------------------
* 10.24.96 Yoram Yaacovi Created
*
*/
#include <pshpack8.h> /* Assume 8 byte packing throughout */
#ifdef DEBUG
/*
* Debug stuff
*/
extern HDBGZONE ghDbgZoneQoS;
#define ZONE_INIT (GETMASK(ghDbgZoneQoS) & 0x0001)
#define ZONE_IQOS (GETMASK(ghDbgZoneQoS) & 0x0002)
#define ZONE_THREAD (GETMASK(ghDbgZoneQoS) & 0x0004)
#define ZONE_STRUCTURES (GETMASK(ghDbgZoneQoS) & 0x0008)
#define ZONE_PARAMETERS (GETMASK(ghDbgZoneQoS) & 0x0010)
int QoSDbgPrintf(LPCSTR lpszFormat, ...);
// MACRO: DEBUGMSG(zone,message-to-print)
// PURPOSE: If the zone is enabled, prints a message to the debug output
// NOTE: in debug build - if the zone is turned on
#define DEBUGMSG(z,s) ( (z) ? (QoSDbgPrintf s) : 0)
// MACRO: DISPLAYQOSOBJECT()
// PURPOSE: Displays the internal structures of the QoS object
// NOTE: in debug build - if the zone is turned on
#define DISPLAYQOSOBJECT() DisplayQoSObject()
// MACRO: DISPLAYPARAMETERS(nFunctionID)
// PURPOSE: Displays the parameters of a given function
// NOTE: in debug build - if the zone is turned on
#define DISPLAYPARAMETERS(fid, p1, p2, p3, p4, p5) \
DisplayParameters(fid, (ULONG_PTR) p1, (ULONG_PTR) p2, (ULONG_PTR) p3, (ULONG_PTR) p4, (ULONG_PTR) p5)
// MACRO: QOSDEBUGINIT
// PURPOSE: Initializes the QoS debug zones, ONLY IF not initialized yet
// NOTE:
#define QOSDEBUGINIT() \
if (!ghDbgZoneQoS) \
DBGINIT(&ghDbgZoneQoS, _rgZonesQos);
#define WAIT_ON_MUTEX_MSEC 20000
#else // retail
#define DISPLAYQOSOBJECT()
#define DISPLAYPARAMETERS(fid, p1, p2, p3, p4, p5)
#define DEBUGMSG(z,s)
#define QOSDEBUGINIT()
#define WAIT_ON_MUTEX_MSEC 5000
#endif
/*
* Constants
*/
// IDs for parameters display (debug use only)
#define REQUEST_RESOURCES_ID 1
#define SET_RESOURCES_ID 2
#define RELEASE_RESOURCES_ID 3
#define SET_CLIENTS_ID 4
#define QOS_LOWEST_PRIORITY 10
/*
* Macros
*/
#define COMPARE_GUIDS(a,b) RtlEqualMemory((a), (b), sizeof(GUID))
#define ACQMUTEX(hMutex) \
while (WaitForSingleObject(hMutex, WAIT_ON_MUTEX_MSEC) == WAIT_TIMEOUT) \
{ \
ERRORMSG(("Thread 0x%x waits on mutex\n", GetCurrentThreadId())); \
} \
#define RELMUTEX(hMutex) ReleaseMutex(hMutex)
/*
* Data Structures
*/
// internal resource request structure
typedef struct _resourcerequestint
{
struct _resourcerequestint *fLink;
RESOURCEREQUEST sResourceRequest;
GUID guidClientGUID;
LPFNQOSNOTIFY pfnQoSNotify;
DWORD_PTR dwParam;
} RESOURCEREQUESTINT, *LPRESOURCEREQUESTINT;
// internal resource structure
typedef struct _resourceint
{
struct _resourceint *fLink;
RESOURCE resource;
int nNowAvailUnits;
RESOURCEREQUESTINT *pRequestList;
} RESOURCEINT, *LPRESOURCEINT;
// internal client structure
typedef struct _clientint
{
struct _clientint *fLink;
CLIENT client;
RESOURCEREQUESTINT *pRequestList;
} CLIENTINT, *LPCLIENTINT;
class CQoS : public IQoS
{
public:
// IUnknown methods
STDMETHODIMP QueryInterface (REFIID riid, void **ppv);
STDMETHODIMP_(ULONG) AddRef (void);
STDMETHODIMP_(ULONG) Release (void);
// IQoS methods
STDMETHODIMP RequestResources (LPGUID lpStreamGUID,
LPRESOURCEREQUESTLIST lpResourceRequestList,
LPFNQOSNOTIFY lpfnQoSNotify,
DWORD_PTR dwParam);
STDMETHODIMP ReleaseResources (LPGUID lpStreamGUID,
LPRESOURCEREQUESTLIST lpResourceRequestList);
STDMETHODIMP GetResources (LPRESOURCELIST *lppResourceList);
STDMETHODIMP SetResources (LPRESOURCELIST lpResourceList);
STDMETHODIMP SetClients(LPCLIENTLIST lpClientList);
STDMETHODIMP NotifyNow(void);
STDMETHODIMP FreeBuffer(LPVOID lpBuffer);
// IProps methods
STDMETHODIMP SetProps (ULONG cValues,
PPROPERTY pPropArray);
STDMETHODIMP GetProps (PPROPTAGARRAY pPropTagArray,
ULONG ulFlags,
ULONG FAR *pcValues,
PPROPERTY *ppPropArray);
CQoS (void);
~CQoS (void);
HRESULT Initialize(void);
private:
// Private functions
HRESULT QoSCleanup(void);
BOOL AnyRequests(void);
HRESULT FindClientsForResource( DWORD dwResourceID,
LPCLIENTINT pc,
ULONG *puSamePriClients,
ULONG *puLowerPriClients);
HRESULT FreeListOfRequests(LPRESOURCEREQUESTINT *lppList);
HRESULT StoreResourceRequest(LPGUID pClientGUID,
LPRESOURCEREQUEST pResourceRequest,
LPFNQOSNOTIFY pfnQoSNotify,
DWORD_PTR dwParam,
LPRESOURCEINT pResourceInt);
HRESULT FreeResourceRequest(LPGUID pClientGUID,
LPRESOURCEINT pResourceInt,
int *pnUnits);
HRESULT UpdateClientInfo ( LPGUID pClientGUID,
LPFNQOSNOTIFY pfnQoSNotify);
HRESULT UpdateRequestsForClient (LPGUID pClientGUID);
HRESULT FindClient(LPGUID pClientGUID, LPCLIENTINT *ppClient);
HRESULT StartQoSThread(void);
HRESULT StopQoSThread(void);
DWORD QoSThread(void);
HRESULT NotifyQoSClient(void);
// Debug display functions
void DisplayQoSObject(void);
void DisplayRequestListInt(LPRESOURCEREQUESTINT prr, BOOL fDisplay);
void DisplayRequestList(LPRESOURCEREQUESTLIST prrl);
void DisplayParameters(ULONG nFunctionID, ULONG_PTR P1, ULONG_PTR P2, ULONG_PTR P3, ULONG_PTR P4, ULONG_PTR P5);
void DisplayResourceList(LPRESOURCELIST prl);
void DisplayClientList(LPCLIENTLIST pcl);
friend DWORD QoSThreadWrapper(CQoS *pQoS);
// Variables
int m_cRef;
LPRESOURCEINT m_pResourceList;
ULONG m_cResources;
LPCLIENTINT m_pClientList;
HANDLE m_evThreadExitSignal;
HANDLE m_evImmediateNotify;
HANDLE m_hThread; // handle of the QoS notify thread
BOOL m_bQoSEnabled; // whether QoS is enabled or not
BOOL m_bInNotify;
ULONG m_nSkipHeartBeats; // how many heartbeats should the QoS notify thread skip
HWND m_hWnd;
ULONG m_nLeaveForNextPri; // percentage of the rsrc to leave for lower priority clients
BOOL bWin9x; //Windows 9x (TRUE) or NT (FALSE)
};
/*
* QoS Class factory
*/
typedef HRESULT (STDAPICALLTYPE *PFNCREATE)(IUnknown *, REFIID, void **);
class CClassFactory : public IClassFactory
{
public:
//IUnknown members
STDMETHODIMP QueryInterface(REFIID, void **);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//IClassFactory members
STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, void **);
STDMETHODIMP LockServer(BOOL);
CClassFactory(PFNCREATE);
~CClassFactory(void);
protected:
ULONG m_cRef;
PFNCREATE m_pfnCreate;
};
/*
* Globals
*/
EXTERN_C HANDLE g_hQoSMutex;
EXTERN_C class CQoS *g_pQoS;
/*
* Function prototypes
*/
#include <poppack.h> /* End byte packing */