242 lines
6.6 KiB
C
242 lines
6.6 KiB
C
|
/*
|
|||
|
- 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 */
|
|||
|
|