/* - QOSINT.H - * Microsoft NetMeeting * Quality of Service DLL * Internal QoS header file * * Revision History: * * When Who What * -------- ------------------ --------------------------------------- * 10.24.96 Yoram Yaacovi Created * */ #include /* 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 /* End byte packing */