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; }
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; }
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; }
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; }
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); }
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; }
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; }
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; }