- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
ZEB_CALLBACK ZEB_CACHE_GetPage(ZEB_PagesCache *pPagesCache, ZEB_PAGEIDX fpPageIndex, void **ppCachedPageAdress)
{
ZEB_WORD i;
for(i = 0; i < pPagesCache->loadedCount; i++)
{
if(pPagesCache->pDescriptors[i].fpPosition == fpPageIndex)
{
pPagesCache->pDescriptors[i].hitPoints++;
(*ppCachedPageAdress)=(pPagesCache->pCache)+(i<<(pPagesCache->pageRatio)); //выдаю адрес подгруженной страницы в кэше
return ZEBCB_GOOD;
}
}
// запрошенная страница все еще не найдена}
//если страницы нету - то проверяем - есть ли свободный слот, а если нет слotа, то проводим операцию по выпиливанию страницы с наименьшим ХП
if( pPagesCache->loadedCount < pPagesCache->capacity )
{//если слот еще есть то загружаем в позицию края - это loadedCount и увеличиваем его на 1
pPagesCache->pDescriptors[pPagesCache->loadedCount].fpPosition = fpPageIndex; //указываем реальный адрес в соусе
pPagesCache->pDescriptors[pPagesCache->loadedCount].hitPoints = 1; //ХП ставим в 1
ZEB_CACHE_MechMountPage(pPagesCache,pPagesCache->loadedCount,fpPageIndex);//загружаем эту страницу в кэш (позиция соответствует индексу дескриптора)
(*ppCachedPageAdress)=(pPagesCache->pCache) + ((pPagesCache->loadedCount) << (pPagesCache->pageRatio)); //получаем адрес страницы
pPagesCache->loadedCount++; //увеличиваем количество загруженных страниц
return ZEBCB_GOOD;
}else //TODO: елсе не нужен // Почему не нужен? (2010 07 12) //Не знаю (2010 07 28)
{//если свободных слотов нет - то проводим поиск наименьшего хп и выпиливаем его, загружая на его место новый дескриптор и страницу
//поиск наименбшего хп
ZEB_WORD
register minHP,
register minDIDX //Descriptor InDeX
;
minHP = pPagesCache->pDescriptors[0].hitPoints;
minDIDX = 0;
for(i = 1; i < pPagesCache->capacity; i++)
{
if(pPagesCache->pDescriptors[i].hitPoints < minHP)
{
minHP = pPagesCache->pDescriptors[i].hitPoints;
minDIDX = i;
}
}
//страница в любос случае найдена - выпиливаем ее - сохраняя ее в сурс обратно
ZEB_CACHE_MechUnmountPage(pPagesCache,minDIDX,pPagesCache->pDescriptors[minDIDX].fpPosition);
//и на ее место грузим новый дескриптор и саму страницу
pPagesCache->pDescriptors[minDIDX].fpPosition = fpPageIndex; //указываем реальный адрес в соусе //TODO: Нужно запихивать дескрипторы в отдельный массив и обращаться по указателю, потом это дело можно сортировать для ускорения поиска страниц. Режимы сортировок - максимум и минимум: 1 - для быстрого обращения к наиболее часто используемым страницам, 2 - для быстрого выпиливания менее используемых страниц. (2010 07 28)
pPagesCache->pDescriptors[minDIDX].hitPoints = 1; //ХП ставим в 1
//кэшируем требуемую страницу
ZEB_CACHE_MechMountPage(pPagesCache,minDIDX,fpPageIndex);
(*ppCachedPageAdress)=(pPagesCache->pCache) + ((pPagesCache->loadedCount) << (pPagesCache->pageRatio)); //получаем адрес страницы
return ZEBCB_GOOD;
}
}
Господа - я не уверен говнокод ли это, но вы как бесспорные эксперты в области обнаружения ГК дайте свое заключение. Метод получает страницу из кэша. Страницы фиксированного размера и кэшируются из файла. Буфер под кэш - определяется один раз при создании как единый динамически полученный массив. Код кодил ОП.