VOID VMCASrvDirSyncShutdown( VOID ) { BOOLEAN bLocked = FALSE; PVMCA_THREAD pThread = NULL; VMCA_LOCK_MUTEX(bLocked, &gVMCAServerGlobals.mutex); if (gVMCAServerGlobals.pDirSyncThr) { pThread = gVMCAServerGlobals.pDirSyncThr; gVMCAServerGlobals.pDirSyncThr = NULL; } VMCA_UNLOCK_MUTEX(bLocked, &gVMCAServerGlobals.mutex); if (pThread) { VMCAReleaseThread(pThread); } VMCA_LOCK_MUTEX(bLocked, &gVMCAServerGlobals.mutex); if (gVMCAServerGlobals.pDirSyncParams) { VMCASrvReleaseDirSyncParams(gVMCAServerGlobals.pDirSyncParams); gVMCAServerGlobals.pDirSyncParams = NULL; } VMCA_UNLOCK_MUTEX(bLocked, &gVMCAServerGlobals.mutex); }
DWORD VMCASrvDirSyncInit( VOID ) { DWORD dwError = 0; PVMCA_THREAD pThread = NULL; BOOLEAN bLocked = FALSE; PVMCA_DIR_SYNC_PARAMS pDirSyncParams = NULL; DWORD dwSyncInterval = 5 * 60 * 60; // every 5 minutes dwError = VMCASrvCreateDirSyncParams(dwSyncInterval, &pDirSyncParams); BAIL_ON_VMCA_ERROR(dwError); VMCA_LOCK_MUTEX(bLocked, &gVMCAServerGlobals.mutex); gVMCAServerGlobals.pDirSyncParams = VMCASrvAcquireDirSyncParams( pDirSyncParams); VMCA_UNLOCK_MUTEX(bLocked, &gVMCAServerGlobals.mutex); dwError = VMCACreateThread( &VMCASrvDirSyncThrFunc, pDirSyncParams, &pThread); BAIL_ON_VMCA_ERROR(dwError); VMCA_LOCK_MUTEX(bLocked, &gVMCAServerGlobals.mutex); gVMCAServerGlobals.pDirSyncThr = VMCAAcquireThread(pThread); cleanup: VMCA_UNLOCK_MUTEX(bLocked, &gVMCAServerGlobals.mutex); if (pDirSyncParams) { VMCASrvReleaseDirSyncParams(pDirSyncParams); } if (pThread) { VMCAReleaseThread(pThread); } return dwError; error: goto cleanup; }
VOID VmcaDbReleaseContext( PVMCA_DB_CONTEXT pDbContext ) { BOOLEAN bInLock = FALSE; VMCA_LOG_(VMCA_LOG_LEVEL_DEBUG,"Releasing VMCA database context"); // Rollback outstanding explicit transaction if exists. VmcaDbCtxRollbackTransaction(pDbContext); VMCA_LOCK_MUTEX(bInLock, &gVmcaDbGlobals.mutex); if (gVmcaDbGlobals.dwNumCachedContexts < gVmcaDbGlobals.dwMaxNumCachedContexts) { pDbContext->pNext = gVmcaDbGlobals.pDbContextList; gVmcaDbGlobals.pDbContextList = pDbContext; gVmcaDbGlobals.dwNumCachedContexts++; } else { VMCA_LOG_(VMCA_LOG_LEVEL_DEBUG,"Freeing VMCA database context"); VmcaDbFreeContext(pDbContext); } VMCA_UNLOCK_MUTEX(bInLock, &gVmcaDbGlobals.mutex); VMCA_LOG_(VMCA_LOG_LEVEL_DEBUG,"VMCA database context released"); }
DWORD VMCASrvNotifyDirSync( VOID ) { DWORD dwError = 0; PVMCA_DIR_SYNC_PARAMS pDirSyncParams = NULL; PVMCA_THREAD pDirSyncThread = NULL; BOOLEAN bLocked = FALSE; pDirSyncThread = VMCASrvGetDirSvcThread(); if (pDirSyncThread) { pDirSyncParams = VMCASrvGetDirSyncParams(); VMCA_LOCK_MUTEX(bLocked, &pDirSyncParams->mutex); pDirSyncParams->bRefresh = TRUE; VMCA_UNLOCK_MUTEX(bLocked, &pDirSyncParams->mutex); dwError = VMCANotifyThread(pDirSyncThread); BAIL_ON_VMCA_ERROR(dwError); } cleanup: if (pDirSyncParams) { VMCA_UNLOCK_MUTEX(bLocked, &pDirSyncParams->mutex); VMCASrvReleaseDirSyncParams(pDirSyncParams); } if (pDirSyncThread) { VMCAReleaseThread(pDirSyncThread); } return dwError; error: goto cleanup; }
DWORD VmcaDbCreateContext( PVMCA_DB_CONTEXT* ppDbContext ) { DWORD dwError = 0; PVMCA_DB_CONTEXT pDbContext = NULL; BOOLEAN bInLock = FALSE; VMCA_LOG_(VMCA_LOG_LEVEL_DEBUG,"Creating VMCA database context"); VMCA_LOCK_MUTEX(bInLock, &gVmcaDbGlobals.mutex); if (gVmcaDbGlobals.pDbContextList) { pDbContext = gVmcaDbGlobals.pDbContextList; gVmcaDbGlobals.pDbContextList = gVmcaDbGlobals.pDbContextList->pNext; pDbContext->pNext = NULL; gVmcaDbGlobals.dwNumCachedContexts--; } else { VMCA_LOG_DEBUG("Allocating database context for %s", gVmcaDbGlobals.pszDbPath); dwError = VMCAAllocateMemory(sizeof(*pDbContext), (PVOID*)&pDbContext); BAIL_ON_VMCA_ERROR(dwError); dwError = sqlite3_open( gVmcaDbGlobals.pszDbPath, &pDbContext->pDb); BAIL_ON_VMCA_ERROR(dwError); dwError = sqlite3_busy_timeout( pDbContext->pDb, 5000); BAIL_ON_VMCA_ERROR(dwError); } *ppDbContext = pDbContext; cleanup: VMCA_UNLOCK_MUTEX(bInLock, &gVmcaDbGlobals.mutex); VMCA_LOG_DEBUG("VMCA database context created Error = %d", dwError); return dwError; error: *ppDbContext = NULL; if (pDbContext) { VmcaDbFreeContext(pDbContext); } goto cleanup; }
static DWORD VMCASrvGetDirSyncNotifyInterval( PVMCA_DIR_SYNC_PARAMS pSyncInfo, PDWORD pdwInterval ) { DWORD dwError = 0; BOOLEAN bLocked = FALSE; VMCA_LOCK_MUTEX(bLocked, pSyncInfo->pMutex); *pdwInterval = pSyncInfo->dwSyncIntervalSecs; VMCA_UNLOCK_MUTEX(bLocked, pSyncInfo->pMutex); return dwError; }