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; }
ANSC_HANDLE Bmc2ReqcoPecGetCookedPage ( ANSC_HANDLE hThisObject, char* page_path ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PBMC2_REQ_CONTROLLER_OBJECT pMyObject = (PBMC2_REQ_CONTROLLER_OBJECT)hThisObject; PBMC2_ENV_CONTROLLER_OBJECT pBmc2EnvController = (PBMC2_ENV_CONTROLLER_OBJECT)pMyObject->hBmc2EnvController; PBMC2_COM_DOMAIN_OBJECT pBmc2ComDomain = (PBMC2_COM_DOMAIN_OBJECT )pMyObject->hBmc2ComDomain; PBMC2_COM_TERMINAL_OBJECT pBmc2ComTerminal = (PBMC2_COM_TERMINAL_OBJECT )pBmc2ComDomain->hBmc2ComTerminal; PBMC2_COM_EXECUTOR_OBJECT pBmc2ComExecutor = (PBMC2_COM_EXECUTOR_OBJECT )pBmc2EnvController->hBmc2ComExecutor; PBWRM_ENV_CONTROLLER_OBJECT pBwrmEnvController = (PBWRM_ENV_CONTROLLER_OBJECT)pBmc2EnvController->hBwrmEnvController; PBWRM_RAM_INTERFACE pBwrmRamIf = (PBWRM_RAM_INTERFACE )pBwrmEnvController->GetBwrmRamIf((ANSC_HANDLE)pBwrmEnvController); char* pRootPath = (char* )pBmc2EnvController->Property.RootPath; PBWRM_COOKED_PAGE_OBJECT pBwrmCookedPage = (PBWRM_COOKED_PAGE_OBJECT )NULL; void* pPageBuffer = (void* )NULL; ULONG ulPageSize = (ULONG )0; /* * The script parsing can take fairly long time, which mandates some sort of page caching * mechanism to be used. The BWRM (BroadWay Web Resource Manager) module is responsible for * file-based page access and page caching. We first try to retrieve the requested page from * the in-memory cache, and only load the page from the underlying storage system if the * requested page is not in the cache. */ returnStatus = pBwrmRamIf->GetCookedPage ( pBwrmRamIf->hOwnerContext, pRootPath, page_path, &pBwrmCookedPage ); if ( returnStatus != ANSC_STATUS_SUCCESS ) { returnStatus = pBwrmRamIf->GetRawPage ( pBwrmRamIf->hOwnerContext, pRootPath, page_path, &pPageBuffer, &ulPageSize ); if ( returnStatus != ANSC_STATUS_SUCCESS ) { return (ANSC_HANDLE)NULL; } else { pBwrmCookedPage = (PBWRM_COOKED_PAGE_OBJECT)pBmc2ComExecutor->PreparePage ( (ANSC_HANDLE)pBmc2ComExecutor, page_path, pPageBuffer, ulPageSize ); } if ( !pBwrmCookedPage ) { AnscFreeMemory(pPageBuffer); return (ANSC_HANDLE)NULL; } else if ( pBmc2EnvController->Property.bCacheScpPages || pBwrmRamIf->IsPageCacheForced(pBwrmRamIf->hOwnerContext, page_path) ) { returnStatus = pBwrmRamIf->AddCookedPage ( pBwrmRamIf->hOwnerContext, pRootPath, page_path, (ANSC_HANDLE)pBwrmCookedPage ); } else { pBwrmCookedPage->SetRootPath ((ANSC_HANDLE)pBwrmCookedPage, pRootPath ); pBwrmCookedPage->SetPagePath ((ANSC_HANDLE)pBwrmCookedPage, page_path ); pBwrmCookedPage->SetTimestamp((ANSC_HANDLE)pBwrmCookedPage, AnscGetTickInSeconds()); } } return (ANSC_HANDLE)pBwrmCookedPage; }