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.
184 lines
5.0 KiB
184 lines
5.0 KiB
|
|
// Copyright (c) 1996-1999 Microsoft Corporation
|
|
|
|
//+============================================================================
|
|
//
|
|
// volcache.cxx
|
|
//
|
|
// Implementation for CVolumeLocationCache. This class is used by trkwks
|
|
// to keep a cache of volid->mcid mappings.
|
|
//
|
|
//+============================================================================
|
|
|
|
#include "pch.cxx"
|
|
#pragma hdrstop
|
|
|
|
#include "trkwks.hxx"
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// CVolumeLocationCache::Initialize
|
|
//
|
|
// Init the critsec and set the lifetime value.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
void
|
|
CVolumeLocationCache::Initialize( DWORD dwEntryLifetimeSeconds )
|
|
{
|
|
_cs.Initialize();
|
|
_fInitialized = TRUE;
|
|
_cVols = 0;
|
|
|
|
_cftEntryLifetime = 0;
|
|
_cftEntryLifetime.IncrementSeconds( dwEntryLifetimeSeconds );
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// CVolumeLocationCache::UnInitialize
|
|
//
|
|
// Free the critsec.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
void
|
|
CVolumeLocationCache::UnInitialize()
|
|
{
|
|
if (_fInitialized)
|
|
{
|
|
_fInitialized = FALSE;
|
|
_cs.UnInitialize();
|
|
}
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// CVolumeLocationCache::_FindVolume
|
|
//
|
|
// Search the cache for a volid. If it's found, return it's index in the
|
|
// cache array.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
int
|
|
CVolumeLocationCache::_FindVolume(const CVolumeId & volid)
|
|
{
|
|
for (int i=0; i<_cVols; i++)
|
|
{
|
|
if (_vl[i].volid == volid)
|
|
{
|
|
return(i);
|
|
}
|
|
}
|
|
|
|
return(-1);
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// CVolumeLocationCache::FindVolume
|
|
//
|
|
// search the cache for a volid. If found, return the machine ID it was
|
|
// last known to be on, and a bool indicating if this entry in the cache
|
|
// is old or new. If it's old and doesn't work, the caller shouldn't
|
|
// trust the cache. If it's new and doesn't work, the caller shouldn't
|
|
// bother the DC trying to find it.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
BOOL
|
|
CVolumeLocationCache::FindVolume(const CVolumeId & volid, CMachineId * pmcid, BOOL *pfRecentEntry )
|
|
{
|
|
int i;
|
|
|
|
_cs.Enter();
|
|
|
|
i=_FindVolume(volid );
|
|
if (i != -1)
|
|
{
|
|
// We found the volume. Load the data.
|
|
|
|
CFILETIME cftNow;
|
|
*pmcid=_vl[i].mcid;
|
|
*pfRecentEntry = ( (cftNow - _vl[i].cft) <= _cftEntryLifetime );
|
|
}
|
|
|
|
_cs.Leave();
|
|
return(i != -1);
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// CVolumeLocationCache::AddVolume
|
|
//
|
|
// Add a volid->mcid mapping to the cache. The entry in the cache is
|
|
// timestamped so we know how trustworthy it is. If the entry is already
|
|
// in the cache, we just update the timestamp. In either case, this entry
|
|
// will be at the front of the array.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
void
|
|
CVolumeLocationCache::AddVolume(const CVolumeId & volid, const CMachineId & mcid)
|
|
{
|
|
int i;
|
|
|
|
if( CVolumeId() == volid )
|
|
return;
|
|
|
|
_cs.Enter();
|
|
|
|
i = _FindVolume(volid);
|
|
if (i == -1)
|
|
{
|
|
// This volid isn't already in the cache. Shift back the existing
|
|
// entries so that this entry can be in front.
|
|
|
|
BOOL fFull = _cVols >= MAX_CACHED_VOLUME_LOCATIONS;
|
|
memcpy(&_vl[1], &_vl[0], sizeof(VolumeLocation)*(fFull ? _cVols-1 : _cVols));
|
|
if (!fFull)
|
|
{
|
|
_cVols++;
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
// Move the prior part of the array back, overwriting
|
|
// the this entry. That way we can put this entry
|
|
// at the front.
|
|
|
|
memcpy(&_vl[1], &_vl[0], sizeof(VolumeLocation)*i);
|
|
}
|
|
|
|
// Put this entry at the front of the array.
|
|
|
|
_vl[0].volid = volid;
|
|
_vl[0].mcid = mcid;
|
|
_vl[0].cft = CFILETIME();
|
|
|
|
#if DBG
|
|
for (i=0; i<_cVols; i++)
|
|
{
|
|
TrkLog((TRKDBG_VOLCACHE,
|
|
TEXT("%02d: %s -> %s") MCID_BYTE_FORMAT_STRING,
|
|
i,
|
|
(const TCHAR*)CDebugString(_vl[i].volid),
|
|
(const TCHAR*)CDebugString(_vl[i].mcid),
|
|
((BYTE*)&(_vl[i].mcid))[0], ((BYTE*)&(_vl[i].mcid))[1], ((BYTE*)&(_vl[i].mcid))[2], ((BYTE*)&(_vl[i].mcid))[3],
|
|
((BYTE*)&(_vl[i].mcid))[4], ((BYTE*)&(_vl[i].mcid))[5], ((BYTE*)&(_vl[i].mcid))[6], ((BYTE*)&(_vl[i].mcid))[7],
|
|
((BYTE*)&(_vl[i].mcid))[8], ((BYTE*)&(_vl[i].mcid))[9], ((BYTE*)&(_vl[i].mcid))[10], ((BYTE*)&(_vl[i].mcid))[11],
|
|
((BYTE*)&(_vl[i].mcid))[12], ((BYTE*)&(_vl[i].mcid))[13], ((BYTE*)&(_vl[i].mcid))[14], ((BYTE*)&(_vl[i].mcid))[15] ));
|
|
|
|
}
|
|
#endif
|
|
|
|
_cs.Leave();
|
|
}
|
|
|