Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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");
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}