132 lines
2.6 KiB
C
132 lines
2.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1995 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
|
||
|
Abstract:
|
||
|
File contains the following functions
|
||
|
ActionCache
|
||
|
CacheToA
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
Amritansh Raghav 6/8/95 Created
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
//
|
||
|
// Include files
|
||
|
//
|
||
|
|
||
|
#include "allinc.h"
|
||
|
|
||
|
DWORD
|
||
|
UpdateCache(
|
||
|
DWORD dwCache,
|
||
|
BOOL *fUpdate
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description
|
||
|
|
||
|
Function used to update a cache. It checks to see if the last time
|
||
|
the cache was updated is greater than the time out (A value of 0
|
||
|
for the last time of update means the cache is invalid), calls the
|
||
|
function that loads the cache and then sets the last update time
|
||
|
|
||
|
Locks
|
||
|
|
||
|
|
||
|
|
||
|
Arguments
|
||
|
|
||
|
dwCache This is one of the Cache Ids defined in rtrmgr/defs.h. It
|
||
|
is used to index into the table of locks protecting the caches,
|
||
|
the table of function pointers that holds a pointer to a
|
||
|
function that loads the cache andthe table of last update times
|
||
|
|
||
|
fUpdate Is Set to true if the cache is updated
|
||
|
|
||
|
Return Value
|
||
|
|
||
|
None
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
DWORD dwResult = NO_ERROR;
|
||
|
LONG dwNeed;
|
||
|
LONG dwSpace;
|
||
|
|
||
|
|
||
|
//
|
||
|
// BUG put in a bounds check here otherwise effects can be disastrous
|
||
|
//
|
||
|
|
||
|
// Trace1(MIB,"Trying to update %s cache", CacheToA(dwCache));
|
||
|
|
||
|
__try
|
||
|
{
|
||
|
ENTER_READER(dwCache);
|
||
|
|
||
|
if((g_LastUpdateTable[dwCache] isnot 0) and
|
||
|
((GetCurrentTime() - g_LastUpdateTable[dwCache]) < g_TimeoutTable[dwCache]))
|
||
|
{
|
||
|
*fUpdate = FALSE;
|
||
|
dwResult = NO_ERROR;
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
READER_TO_WRITER(dwCache);
|
||
|
|
||
|
// Trace0(MIB,"Cache out of date");
|
||
|
|
||
|
dwResult = (*g_LoadFunctionTable[dwCache])();
|
||
|
|
||
|
if(dwResult isnot NO_ERROR)
|
||
|
{
|
||
|
Trace2(ERR,"Error %d loading %s cache",
|
||
|
dwResult,
|
||
|
CacheToA(dwCache));
|
||
|
|
||
|
g_LastUpdateTable[dwCache] = 0;
|
||
|
|
||
|
__leave;
|
||
|
}
|
||
|
|
||
|
g_LastUpdateTable[dwCache] = GetCurrentTime();
|
||
|
|
||
|
dwResult = NO_ERROR;
|
||
|
}
|
||
|
__finally
|
||
|
{
|
||
|
EXIT_LOCK(dwCache);
|
||
|
}
|
||
|
|
||
|
return dwResult; //to keep compiler happy
|
||
|
}
|
||
|
|
||
|
|
||
|
PSZ
|
||
|
CacheToA(
|
||
|
DWORD dwCache
|
||
|
)
|
||
|
{
|
||
|
static PSZ cacheName[] = {"Ip Address Table",
|
||
|
"Ip Forward Table",
|
||
|
"Ip Net To Media table",
|
||
|
"Tcp Table",
|
||
|
"Udp Table",
|
||
|
"Arp Entity Table",
|
||
|
"Illegal Cache Number - ABORT!!!!"};
|
||
|
|
||
|
return( (dwCache >= NUM_CACHE - 1)?
|
||
|
cacheName[NUM_CACHE-1] : cacheName[dwCache]);
|
||
|
}
|
||
|
|
||
|
|