ANSC_STATUS
BwrmPmoCancel
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus      = ANSC_STATUS_SUCCESS;
    PBWRM_PAGE_MANAGER_OBJECT       pMyObject         = (PBWRM_PAGE_MANAGER_OBJECT    )hThisObject;
    PBWRM_PAGE_MANAGER_PROPERTY     pProperty         = (PBWRM_PAGE_MANAGER_PROPERTY  )&pMyObject->Property;
    PANSC_TIMER_DESCRIPTOR_OBJECT   pCacheTimerObject = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hCacheTimerObject;

    if ( !pMyObject->bActive )
    {
        return  ANSC_STATUS_SUCCESS;
    }
    else
    {
        pMyObject->bActive = FALSE;
    }

    pCacheTimerObject->Stop((ANSC_HANDLE)pCacheTimerObject);

    pMyObject->DelAllPages((ANSC_HANDLE)pMyObject);

    return  ANSC_STATUS_SUCCESS;
}
Ejemplo n.º 2
0
ANSC_STATUS
BwrmEcoRamGetCookedPage
    (
        ANSC_HANDLE                 hThisObject,
        char*                       root_path,
        char*                       page_path,
        ANSC_HANDLE*                phCookedPage
    )
{
    ANSC_STATUS                     returnStatus     = ANSC_STATUS_SUCCESS;
    PBWRM_ENV_CONTROLLER_OBJECT     pMyObject        = (PBWRM_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBWRM_ENV_CONTROLLER_PROPERTY   pProperty        = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PBWRM_PAGE_MANAGER_OBJECT       pBwrmPageManager = (PBWRM_PAGE_MANAGER_OBJECT    )pMyObject->hBwrmPageManager;

    *phCookedPage =
        pBwrmPageManager->GetPage
            (
                (ANSC_HANDLE)pBwrmPageManager,
                root_path,
                page_path
            );

    if ( !*phCookedPage )
    {
        return  ANSC_STATUS_CANT_FIND;
    }

    return  ANSC_STATUS_SUCCESS;
}
Ejemplo n.º 3
0
ANSC_STATUS
BwrmEcoRamAddCookedPage
    (
        ANSC_HANDLE                 hThisObject,
        char*                       root_path,
        char*                       page_path,
        ANSC_HANDLE                 hCookedPage
    )
{
    ANSC_STATUS                     returnStatus     = ANSC_STATUS_SUCCESS;
    PBWRM_ENV_CONTROLLER_OBJECT     pMyObject        = (PBWRM_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBWRM_ENV_CONTROLLER_PROPERTY   pProperty        = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PBWRM_PAGE_MANAGER_OBJECT       pBwrmPageManager = (PBWRM_PAGE_MANAGER_OBJECT    )pMyObject->hBwrmPageManager;

    returnStatus =
        pBwrmPageManager->AddPage
            (
                (ANSC_HANDLE)pBwrmPageManager,
                root_path,
                page_path,
                hCookedPage
            );

    return  returnStatus;
}
Ejemplo n.º 4
0
ANSC_STATUS
BwrmPmoRemove
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus      = ANSC_STATUS_SUCCESS;
    PBWRM_PAGE_MANAGER_OBJECT       pMyObject         = (PBWRM_PAGE_MANAGER_OBJECT    )hThisObject;
    PANSC_TIMER_DESCRIPTOR_OBJECT   pCacheTimerObject = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hCacheTimerObject;
    PANSC_TDO_CLIENT_OBJECT         pCacheTimerClient = (PANSC_TDO_CLIENT_OBJECT      )pMyObject->hCacheTimerClient;

    pMyObject->Cancel((ANSC_HANDLE)pMyObject);
    pMyObject->Reset ((ANSC_HANDLE)pMyObject);

    if ( pCacheTimerObject )
    {
        pCacheTimerObject->Remove((ANSC_HANDLE)pCacheTimerObject);

        pMyObject->hCacheTimerObject = (ANSC_HANDLE)NULL;
    }

    if ( pCacheTimerClient )
    {
        AnscFreeMemory(pCacheTimerClient);

        pMyObject->hCacheTimerClient = (ANSC_HANDLE)NULL;
    }

    AnscFreeLock(&pMyObject->CpoTableLock);
    AnscCoRemove((ANSC_HANDLE)pMyObject  );

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
BwrmPmoAddPage
    (
        ANSC_HANDLE                 hThisObject,
        char*                       root_path,
        char*                       file_path,
        ANSC_HANDLE                 hCookedPage
    )
{
    ANSC_STATUS                     returnStatus      = ANSC_STATUS_SUCCESS;
    PBWRM_PAGE_MANAGER_OBJECT       pMyObject         = (PBWRM_PAGE_MANAGER_OBJECT    )hThisObject;
    PBWRM_PAGE_MANAGER_PROPERTY     pProperty         = (PBWRM_PAGE_MANAGER_PROPERTY  )&pMyObject->Property;
    PANSC_TIMER_DESCRIPTOR_OBJECT   pCacheTimerObject = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hCacheTimerObject;
    PBWRM_COOKED_PAGE_OBJECT        pCookedPage       = (PBWRM_COOKED_PAGE_OBJECT     )hCookedPage;
    ULONG                           ulHashIndex       = (ULONG                        )AnscHashString(file_path, AnscSizeOfString(file_path), BWRM_PMO_CPO_TABLE_SIZE);
    ULONG                           ulPageCount       = 0;
    ULONG                           ulCurTime         = AnscGetTickInSeconds();

    pMyObject->Timestamp = ulCurTime;

    pCookedPage->SetRootPath ((ANSC_HANDLE)pCookedPage, root_path);
    pCookedPage->SetPagePath ((ANSC_HANDLE)pCookedPage, file_path);
    pCookedPage->SetTimestamp((ANSC_HANDLE)pCookedPage, ulCurTime);
    pCookedPage->IncRefCount ((ANSC_HANDLE)pCookedPage           );

    AnscAcquireLock   (&pMyObject->CpoTableLock);
    AnscSListPushEntry(&pMyObject->CpoTable[ulHashIndex], &pCookedPage->Linkage);
    AnscReleaseLock   (&pMyObject->CpoTableLock);

    if ( TRUE )
    {
        ulPageCount = pMyObject->GetPageCount((ANSC_HANDLE)pMyObject);

        if ( ulPageCount == 1 )
        {
            pCacheTimerObject->Start((ANSC_HANDLE)pCacheTimerObject);
        }
        else if ( ulPageCount > pProperty->CacheEntryCount )
        {
            pCookedPage = (PBWRM_COOKED_PAGE_OBJECT)pMyObject->GetOldestPage((ANSC_HANDLE)pMyObject);

            if ( pCookedPage && 0 == pCookedPage->GetRefCount((ANSC_HANDLE)pCookedPage) )
            {
                returnStatus =
                    pMyObject->DelPage
                        (
                            (ANSC_HANDLE)pMyObject,
                            pCookedPage->GetRootPath((ANSC_HANDLE)pCookedPage),
                            pCookedPage->GetPagePath((ANSC_HANDLE)pCookedPage)
                        );
            }
        }
    }

    return  ANSC_STATUS_SUCCESS;
}
Ejemplo n.º 6
0
ULONG
BwrmEcoRamGetCacheTimeout
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus     = ANSC_STATUS_SUCCESS;
    PBWRM_ENV_CONTROLLER_OBJECT     pMyObject        = (PBWRM_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBWRM_ENV_CONTROLLER_PROPERTY   pProperty        = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PBWRM_PAGE_MANAGER_OBJECT       pBwrmPageManager = (PBWRM_PAGE_MANAGER_OBJECT    )pMyObject->hBwrmPageManager;

    return  pBwrmPageManager->GetCacheTimeout((ANSC_HANDLE)pBwrmPageManager);
}
Ejemplo n.º 7
0
ANSC_STATUS
BwrmEcoRamControlCache
    (
        ANSC_HANDLE                 hThisObject,
        ULONG                       ctrl_code
    )
{
    ANSC_STATUS                     returnStatus     = ANSC_STATUS_SUCCESS;
    PBWRM_ENV_CONTROLLER_OBJECT     pMyObject        = (PBWRM_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBWRM_ENV_CONTROLLER_PROPERTY   pProperty        = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PBWRM_PAGE_MANAGER_OBJECT       pBwrmPageManager = (PBWRM_PAGE_MANAGER_OBJECT    )pMyObject->hBwrmPageManager;

    switch ( ctrl_code )
    {
        case    BWRM_RAM_CTRL_CODE_enable :

                returnStatus =
                    pBwrmPageManager->SetCacheEnabled
                        (
                            (ANSC_HANDLE)pBwrmPageManager,
                            TRUE
                        );

                break;

        case    BWRM_RAM_CTRL_CODE_disable :

                returnStatus =
                    pBwrmPageManager->SetCacheEnabled
                        (
                            (ANSC_HANDLE)pBwrmPageManager,
                            FALSE
                        );

                break;

        case    BWRM_RAM_CTRL_CODE_reset :

                returnStatus = pBwrmPageManager->DelAllPages((ANSC_HANDLE)pBwrmPageManager);

                break;

        default :

                returnStatus = ANSC_STATUS_UNAPPLICABLE;

                break;
    }

    return  returnStatus;
}
ANSC_STATUS
BwrmPmoDelPage
    (
        ANSC_HANDLE                 hThisObject,
        char*                       root_path,
        char*                       file_path
    )
{
    ANSC_STATUS                     returnStatus      = ANSC_STATUS_SUCCESS;
    PBWRM_PAGE_MANAGER_OBJECT       pMyObject         = (PBWRM_PAGE_MANAGER_OBJECT    )hThisObject;
    PBWRM_PAGE_MANAGER_PROPERTY     pProperty         = (PBWRM_PAGE_MANAGER_PROPERTY  )&pMyObject->Property;
    PANSC_TIMER_DESCRIPTOR_OBJECT   pCacheTimerObject = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hCacheTimerObject;
    PBWRM_COOKED_PAGE_OBJECT        pCookedPage       = (PBWRM_COOKED_PAGE_OBJECT     )NULL;
    PSINGLE_LINK_ENTRY              pSLinkEntry       = (PSINGLE_LINK_ENTRY           )NULL;
    ULONG                           ulHashIndex       = (ULONG                        )AnscHashString(file_path, AnscSizeOfString(file_path), BWRM_PMO_CPO_TABLE_SIZE);

    AnscAcquireLock(&pMyObject->CpoTableLock);

    pSLinkEntry = AnscSListGetFirstEntry(&pMyObject->CpoTable[ulHashIndex]);

    while ( pSLinkEntry )
    {
        pCookedPage = ACCESS_BWRM_COOKED_PAGE_OBJECT(pSLinkEntry);
        pSLinkEntry = AnscSListGetNextEntry(pSLinkEntry);

        if ( pCookedPage->MatchPath
                (
                    (ANSC_HANDLE)pCookedPage,
                    root_path,
                    file_path
                ) )
        {
            AnscSListPopEntryByLink(&pMyObject->CpoTable[ulHashIndex], &pCookedPage->Linkage);

            pCookedPage->Remove((ANSC_HANDLE)pCookedPage);

            break;
        }
    }

    AnscReleaseLock(&pMyObject->CpoTableLock);

    if ( pMyObject->GetPageCount((ANSC_HANDLE)pMyObject) == 0 )
    {
        pCacheTimerObject->Stop((ANSC_HANDLE)pCacheTimerObject);
    }

    return  ANSC_STATUS_SUCCESS;
}
ANSC_STATUS
BwrmPmoCacheTimerInvoke
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus      = ANSC_STATUS_SUCCESS;
    PBWRM_PAGE_MANAGER_OBJECT       pMyObject         = (PBWRM_PAGE_MANAGER_OBJECT    )hThisObject;
    PBWRM_PAGE_MANAGER_PROPERTY     pProperty         = (PBWRM_PAGE_MANAGER_PROPERTY  )&pMyObject->Property;
    PANSC_TIMER_DESCRIPTOR_OBJECT   pCacheTimerObject = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hCacheTimerObject;
    ULONG                           ulCurTime         = AnscGetTickInSeconds();

    if ( (ulCurTime - pMyObject->Timestamp) > pProperty->CacheTimeout )
    {
        pMyObject->DelAllPages((ANSC_HANDLE)pMyObject);
    }

    return  ANSC_STATUS_SUCCESS;
}
Ejemplo n.º 10
0
ANSC_STATUS
BwrmEcoRamSetCacheSize
    (
        ANSC_HANDLE                 hThisObject,
        ULONG                       cache_size
    )
{
    ANSC_STATUS                     returnStatus     = ANSC_STATUS_SUCCESS;
    PBWRM_ENV_CONTROLLER_OBJECT     pMyObject        = (PBWRM_ENV_CONTROLLER_OBJECT  )hThisObject;
    PBWRM_ENV_CONTROLLER_PROPERTY   pProperty        = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property;
    PBWRM_PAGE_MANAGER_OBJECT       pBwrmPageManager = (PBWRM_PAGE_MANAGER_OBJECT    )pMyObject->hBwrmPageManager;

    returnStatus =
        pBwrmPageManager->SetCacheMemorySize
            (
                (ANSC_HANDLE)pBwrmPageManager,
                cache_size
            );

    return  returnStatus;
}
Ejemplo n.º 11
0
ANSC_STATUS
BwrmPmoInitialize
    (
        ANSC_HANDLE                 hThisObject
    )
{
    ANSC_STATUS                     returnStatus = ANSC_STATUS_SUCCESS;
    PBWRM_PAGE_MANAGER_OBJECT       pMyObject    = (PBWRM_PAGE_MANAGER_OBJECT)hThisObject;
    ULONG                           i            = 0;

    /*
     * Until you have to simulate C++ object-oriented programming style with standard C, you don't
     * appreciate all the nice little things come with C++ language and all the dirty works that
     * have been done by the C++ compilers. Member initialization is one of these things. While in
     * C++ you don't have to initialize all the member fields inherited from the base class since
     * the compiler will do it for you, such is not the case with C.
     */
    AnscCoInitialize((ANSC_HANDLE)pMyObject);

    /*
     * Although we have initialized some of the member fields in the "create" member function, we
     * repeat the work here for completeness. While this simulation approach is pretty stupid from
     * a C++/Java programmer perspective, it's the best we can get for universal embedded network
     * programming. Before we develop our own operating system (don't expect that to happen any
     * time soon), this is the way things gonna be.
     */
    pMyObject->Oid                = BWRM_PAGE_MANAGER_OID;
    pMyObject->Create             = BwrmPmoCreate;
    pMyObject->Remove             = BwrmPmoRemove;
    pMyObject->EnrollObjects      = BwrmPmoEnrollObjects;
    pMyObject->Initialize         = BwrmPmoInitialize;

    pMyObject->Timestamp          = AnscGetTickInSeconds();
    pMyObject->bActive            = FALSE;

    pMyObject->GetCacheEnabled    = BwrmPmoGetCacheEnabled;
    pMyObject->SetCacheEnabled    = BwrmPmoSetCacheEnabled;
    pMyObject->GetCacheEntryCount = BwrmPmoGetCacheEntryCount;
    pMyObject->SetCacheEntryCount = BwrmPmoSetCacheEntryCount;
    pMyObject->GetCacheMemorySize = BwrmPmoGetCacheMemorySize;
    pMyObject->SetCacheMemorySize = BwrmPmoSetCacheMemorySize;
    pMyObject->GetCacheTimeout    = BwrmPmoGetCacheTimeout;
    pMyObject->SetCacheTimeout    = BwrmPmoSetCacheTimeout;

    pMyObject->GetProperty        = BwrmPmoGetProperty;
    pMyObject->SetProperty        = BwrmPmoSetProperty;
    pMyObject->ResetProperty      = BwrmPmoResetProperty;
    pMyObject->Reset              = BwrmPmoReset;

    pMyObject->Engage             = BwrmPmoEngage;
    pMyObject->Cancel             = BwrmPmoCancel;
    pMyObject->CacheTimerInvoke   = BwrmPmoCacheTimerInvoke;

    pMyObject->GetPageCount       = BwrmPmoGetPageCount;
    pMyObject->GetOldestPage      = BwrmPmoGetOldestPage;
    pMyObject->GetPage            = BwrmPmoGetPage;
    pMyObject->AddPage            = BwrmPmoAddPage;
    pMyObject->DelPage            = BwrmPmoDelPage;
    pMyObject->DelAllPages        = BwrmPmoDelAllPages;

    for ( i = 0; i < BWRM_PMO_CPO_TABLE_SIZE; i++ )
    {
        AnscSListInitializeHeader(&pMyObject->CpoTable[i]);
    }
    AnscInitializeLock(&pMyObject->CpoTableLock);

    /*
     * We shall initialize the configuration properties to the default values, which may be changed
     * later via the set_property() member function. Note that this call may not guarantee a valid
     * and legtimate configuration.
     */
    pMyObject->ResetProperty((ANSC_HANDLE)pMyObject);

    return  ANSC_STATUS_SUCCESS;
}