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.
 
 
 
 
 
 

201 lines
4.3 KiB

#include "precomp.h"
#include "fsdiag.h"
DEBUG_FILEZONE(ZONE_T120_MSMCSTCP);
#include <initguid.h>
#include <datguids.h>
#include <nmqos.h>
#include <t120qos.h>
/* T120qos.cpp
*
* Copyright (c) 1997 by Microsoft Corporation
*
* Abstract:
*
* Global Variables:
*
* g_pIQoS - Global interface pointer to QoS interface
* g_dwLastQoSCB - timestamp of last QoS notification obtained via GetTickCount
* g_dwSentSinceLastQoS - bytes sent since last QoS notification (or epoch)
*
*/
// IQOS interface pointer and resources request
LPIQOS g_pIQoS = NULL;
T120RRQ g_aRRq;
// Global last QoS notification time stamp
DWORD g_dwLastQoSCB = 0;
DWORD g_dwSentSinceLastQoS = 0;
BOOL g_fResourcesRequested = FALSE;
// NOTE: Since connections through this transport typically
// consist of a single socket connection, followed by
// disconnection, followed by multiple connections, the
// following heuristic count is used to prevent on-off-on
// initialization of QoS at the time the first call is started.
// It represents the minimum number of socket connections that
// must be initiated (without an intervening disconnect of all
// connected sockets) before QoS initialization takes place.
#define MIN_CONNECTION_COUNT (DEFAULT_NUMBER_OF_PRIORITIES - 1)
WORD g_wConnectionCount = 0;
// extern from transprt.cpp to detect no connections
///// QOS related stuff ///////////////////////////////////
HRESULT CALLBACK QosNotifyDataCB (
LPRESOURCEREQUESTLIST lpResourceRequestList,
DWORD_PTR dwThis)
{
HRESULT hr=NOERROR;
LPRESOURCEREQUESTLIST prrl=lpResourceRequestList;
int i;
int iBWUsageId;
for (i=0, iBWUsageId = -1L; i<(int)lpResourceRequestList->cRequests; i++) {
if (lpResourceRequestList->aRequests[i].resourceID ==
RESOURCE_OUTGOING_BANDWIDTH)
iBWUsageId = i;
}
if (iBWUsageId != -1L) {
QoSLock();
// Calculate effective bits-per second rate:
//
// 1000 milliseconds per second
// 8 bits per byte
//
int nEffRate = MulDiv ( g_dwSentSinceLastQoS, 1000 * 8,
GetTickCount() - g_dwLastQoSCB );
// Report bandwidth usage to QoS:
//
// Are we using less than the available bandwidth?
if ( ( nEffRate ) <
lpResourceRequestList->aRequests[iBWUsageId].nUnitsMin )
{
// Request our effective usage
lpResourceRequestList->aRequests[iBWUsageId].nUnitsMin = nEffRate;
}
else
{
// Request everything by not modifying nUnitsMin
;
}
g_dwLastQoSCB = GetTickCount();
g_dwSentSinceLastQoS = 0;
QoSUnlock();
}
return hr;
}
VOID InitializeQoS( VOID )
{
DWORD dwRes;
HRESULT hRet;
// Already initialized?
if ( g_fResourcesRequested )
return;
// If the number of connections has not reached the
// trigger count, defer QoS initialization (see MIN_CONNECTION_COUNT
// comment above)
if ( g_wConnectionCount < MIN_CONNECTION_COUNT )
{
g_wConnectionCount++;
return;
}
// Initialize QoS. If it fails, that's Ok, we'll do without it.
// No need to set the resource ourselves, this now done by the UI
if (NULL == g_pIQoS)
{
if (0 != (hRet = CoCreateInstance( CLSID_QoS,NULL,
CLSCTX_INPROC_SERVER,
IID_IQoS,
(void **) &g_pIQoS)))
{
WARNING_OUT (("Unable to initalize QoS: %x", hRet));
g_pIQoS = (LPIQOS)NULL;
// Tolerate failure, operate w/o QoS
return;
}
}
// Initialize our request for bandwidth usage.
g_aRRq.cResourceRequests = 1;
g_aRRq.aResourceRequest[0].resourceID = RESOURCE_OUTGOING_BANDWIDTH;
g_aRRq.aResourceRequest[0].nUnitsMin = 0;
// Register with the QoS module. Even if this call fails,
// that's Ok, we'll do without the QoS support
dwRes = (HRESULT)g_pIQoS->RequestResources((GUID *)&MEDIA_TYPE_T120DATA,
(LPRESOURCEREQUESTLIST)&g_aRRq, QosNotifyDataCB, NULL );
if ( 0 == dwRes )
{
g_fResourcesRequested = TRUE;
}
}
VOID DeInitializeQoS( VOID )
{
if (NULL != g_pIQoS)
{
if ( g_fResourcesRequested )
{
g_pIQoS->ReleaseResources((GUID *)&MEDIA_TYPE_T120DATA,
(LPRESOURCEREQUESTLIST)&g_aRRq);
g_fResourcesRequested = FALSE;
}
g_wConnectionCount = 0;
g_pIQoS->Release();
g_pIQoS = NULL;
}
}
VOID MaybeReleaseQoSResources( VOID )
{
if (g_pSocketList->IsEmpty())
{
if (NULL != g_pIQoS)
{
if ( g_fResourcesRequested )
{
g_pIQoS->ReleaseResources((GUID *)&MEDIA_TYPE_T120DATA,
(LPRESOURCEREQUESTLIST)&g_aRRq);
g_fResourcesRequested = FALSE;
}
}
g_wConnectionCount = 0;
}
}