//--------------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation 1993-1994 // // File: cvol.c // // This files contains code for the cached volume ID structs. // // History: // 09-02-93 ScottH Created // 01-31-94 ScottH Moved from cache.c // //--------------------------------------------------------------------------- ///////////////////////////////////////////////////// INCLUDES #include "brfprv.h" // common headers ///////////////////////////////////////////////////// TYPEDEFS ///////////////////////////////////////////////////// CONTROLLING DEFINES ///////////////////////////////////////////////////// DEFINES ///////////////////////////////////////////////////// MACROS ///////////////////////////////////////////////////// MODULE DATA CACHE g_cacheCVOL = {0, 0, 0}; // Volume ID cache ///////////////////////////////////////////////////// Generic Cache Routines #ifdef DEBUG void PRIVATE CVOL_DumpEntry( CVOL * pcvol) { ASSERT(pcvol); TRACE_MSG(TF_ALWAYS, TEXT("CVOL: Atom %d: %s"), pcvol->atomPath, Atom_GetName(pcvol->atomPath)); TRACE_MSG(TF_ALWAYS, TEXT(" Ref [%u] Hvid = %lx"), Cache_GetRefCount(&g_cacheCVOL, pcvol->atomPath), pcvol->hvid); } void PUBLIC CVOL_DumpAll() { CVOL * pcvol; int atom; BOOL bDump; ENTEREXCLUSIVE() { bDump = IsFlagSet(g_uDumpFlags, DF_CVOL); } LEAVEEXCLUSIVE() if (!bDump) return ; atom = Cache_FindFirstKey(&g_cacheCVOL); while (atom != ATOM_ERR) { pcvol = Cache_GetPtr(&g_cacheCVOL, atom); ASSERT(pcvol); if (pcvol) { CVOL_DumpEntry(pcvol); Cache_DeleteItem(&g_cacheCVOL, atom, FALSE); // Decrement count } atom = Cache_FindNextKey(&g_cacheCVOL, atom); } } #endif /*---------------------------------------------------------- Purpose: Release the volume ID handle Returns: -- Cond: -- */ void CALLBACK CVOL_Free( LPVOID lpv) { CVOL * pcvol = (CVOL *)lpv; DEBUG_CODE( TRACE_MSG(TF_CACHE, TEXT("CVOL Releasing volume ID %s"), Atom_GetName(pcvol->atomPath)); ) ASSERT(Sync_IsEngineLoaded()); Sync_ReleaseVolumeIDHandle(pcvol->hvid); SharedFree(&pcvol); } /*---------------------------------------------------------- Purpose: Add the atomPath to the cache. We add the volume ID. If atomPath is already in the cache, we replace it with a newly obtained volume ID. Returns: Pointer to CVOL NULL on OOM Cond: -- */ CVOL * PUBLIC CVOL_Replace( int atomPath) { CVOL * pcvol; BOOL bJustAllocd; pcvol = Cache_GetPtr(&g_cacheCVOL, atomPath); if (pcvol) bJustAllocd = FALSE; else { // Allocate using commctrl's Alloc, so the structure will be in // shared heap space across processes. pcvol = SharedAllocType(CVOL); bJustAllocd = TRUE; } if (pcvol) { HVOLUMEID hvid; LPCTSTR pszPath = Atom_GetName(atomPath); ASSERT(pszPath); DEBUG_CODE( TRACE_MSG(TF_CACHE, TEXT("CVOL Adding volume ID %s"), pszPath); ) if (Sync_GetVolumeIDHandle(pszPath, &hvid) != TR_SUCCESS) { if (bJustAllocd) SharedFree(&pcvol); else Cache_DeleteItem(&g_cacheCVOL, atomPath, FALSE); // Decrement count pcvol = NULL; // Fail } else { ENTEREXCLUSIVE() { pcvol->atomPath = atomPath; pcvol->hvid = hvid; } LEAVEEXCLUSIVE() if (bJustAllocd) { if (!Cache_AddItem(&g_cacheCVOL, atomPath, (LPVOID)pcvol)) { // Cache_AddItem failed here // Sync_ReleaseVolumeIDHandle(hvid); SharedFree(&pcvol); } } else Cache_DeleteItem(&g_cacheCVOL, atomPath, FALSE); // Decrement count } } return pcvol; } /*---------------------------------------------------------- Purpose: Search for the given volume ID in the cache. Return the atomKey if it exists, otherwise ATOM_ERR. Returns: atom ATOM_ERR if not found Cond: -- */ int PUBLIC CVOL_FindID( HVOLUMEID hvid) { int atom; CVOL * pcvol; atom = Cache_FindFirstKey(&g_cacheCVOL); while (atom != ATOM_ERR) { LPCTSTR pszPath = Atom_GetName(atom); ASSERT(pszPath); ENTEREXCLUSIVE() { pcvol = CVOL_Get(atom); ASSERT(pcvol); if (pcvol) { int nCmp; Sync_CompareVolumeIDs(pcvol->hvid, hvid, &nCmp); if (Sync_GetLastError() == TR_SUCCESS && nCmp == 0) { // We found it CVOL_Delete(atom); LEAVEEXCLUSIVE() return atom; } CVOL_Delete(atom); // decrement count } } LEAVEEXCLUSIVE() atom = Cache_FindNextKey(&g_cacheCVOL, atom); } return ATOM_ERR; }