Leaked source code of windows server 2003
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.
 
 
 
 
 
 

232 lines
3.8 KiB

/*++
Copyright (c) 1994-1999 Microsoft Corporation
Module Name :
scache.cpp
Abstract:
IIS Server cache
Author:
Ronald Meijer (ronaldm)
Project:
Internet Services Manager (cluster edition)
Revision History:
--*/
#include "stdafx.h"
#include "common.h"
#include "InetMgrApp.h"
#include "iisobj.h"
#include "scache.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#define new DEBUG_NEW
//
// CIISServerCache implementation
//
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
BOOL
CIISServerCache::Add(
IN CIISMachine * pMachine
)
/*++
Routine Description:
Add server to server cache.
Arguments:
CIISMachine * pMachine : Pointer to machine
Return Value:
TRUE if the machine was added.
FALSE if it was not (already existed)
Notes:
The CIISMachine pointer is not owned by the cache.
--*/
{
BOOL fTossed = FALSE;
int nSwitch;
CIISMachine * pCurrent;
POSITION pos = GetHeadPosition();
//
// Find proper insertion point. Fairly lame linear search,
// but cache is not expected to contain above a dozen items or so
// and routine is not called often.
//
while(pos)
{
pCurrent = (CIISMachine *)GetAt(pos);
nSwitch = pMachine->CompareScopeItem(pCurrent);
if (nSwitch < 0)
{
InsertBefore(pos, pMachine);
break;
}
if (nSwitch == 0)
{
++fTossed;
break;
}
CPtrList::GetNext(pos);
}
if (!pos)
{
AddTail(pMachine);
}
//
// Remember to save changes
//
if (!fTossed)
{
SetDirty();
}
#ifdef _DEBUG
//
// Do a quick sanity check of the cache
//
int cLocals = 0;
CIISMachine * pPrev = NULL;
pCurrent = GetFirst();
while(pCurrent)
{
if (pPrev)
{
//
// Make sure the list is sorted
//
ASSERT(pCurrent->CompareScopeItem(pPrev) > 0);
}
pPrev = pCurrent;
pCurrent = GetNext();
}
//
// Only one local computer
//
ASSERT(cLocals <= 1);
#endif // _DEBUG
return !fTossed;
}
BOOL
CIISServerCache::Remove(
IN CIISMachine * pMachine
)
/*++
Routine Description:
Remove server from the cache.
Arguments:
CIISMachine * pMachine : Server to be removed
Return Value:
TRUE for success, FALSE for failure
--*/
{
BOOL fRemoved = FALSE;
int nSwitch;
CIISMachine * pCurrent;
POSITION pos = GetHeadPosition();
//
// Look for machine object to be deleted
//
// ISSUE: We can currently rely on the actual CIISMachine ptr
// to be matched, though we don't take advantage of that
// with improved search.
//
while(pos)
{
pCurrent = (CIISMachine *)GetAt(pos);
nSwitch = pMachine->CompareScopeItem(pCurrent);
if (nSwitch < 0)
{
//
// Not in the list -- won't find it either
//
ASSERT_MSG("Attempting to remove non-existing machine");
break;
}
if (nSwitch == 0)
{
//
// Found it. If the ASSERT fires, check the "ISSUE" above
//
ASSERT(pCurrent == pMachine);
RemoveAt(pos);
++fRemoved;
break;
}
CPtrList::GetNext(pos);
}
//
// Remember to save changes
//
if (fRemoved)
{
SetDirty();
}
return fRemoved;
}