| 1311 | } |
| 1312 | |
| 1313 | void Validation::garbage_collect() |
| 1314 | { |
| 1315 | /************************************** |
| 1316 | * |
| 1317 | * g a r b a g e _ c o l l e c t |
| 1318 | * |
| 1319 | ************************************** |
| 1320 | * |
| 1321 | * Functional description |
| 1322 | * The database has been walked; compare the page inventory against |
| 1323 | * the bitmap of pages visited. |
| 1324 | * |
| 1325 | **************************************/ |
| 1326 | Database* dbb = vdr_tdbb->getDatabase(); |
| 1327 | |
| 1328 | PageManager& pageSpaceMgr = dbb->dbb_page_manager; |
| 1329 | PageSpace* pageSpace = pageSpaceMgr.findPageSpace(DB_PAGE_SPACE); |
| 1330 | fb_assert(pageSpace); |
| 1331 | |
| 1332 | WIN window(DB_PAGE_SPACE, -1); |
| 1333 | |
| 1334 | for (ULONG sequence = 0, number = 0; number < vdr_max_page; sequence++) |
| 1335 | { |
| 1336 | const ULONG page_number = sequence ? sequence * pageSpaceMgr.pagesPerPIP - 1 : pageSpace->pipFirst; |
| 1337 | page_inv_page* page = 0; |
| 1338 | fetch_page(false, page_number, pag_pages, &window, &page); |
| 1339 | UCHAR* p = page->pip_bits; |
| 1340 | const UCHAR* const end = p + pageSpaceMgr.bytesBitPIP; |
| 1341 | while (p < end && number < vdr_max_page) |
| 1342 | { |
| 1343 | UCHAR byte = *p++; |
| 1344 | for (int i = 8; i; --i, byte >>= 1, number++) |
| 1345 | { |
| 1346 | if (PageBitmap::test(vdr_page_bitmap, number)) |
| 1347 | { |
| 1348 | if (byte & 1) |
| 1349 | { |
| 1350 | corrupt(VAL_PAG_IN_USE, 0, number); |
| 1351 | if (vdr_flags & VDR_update) |
| 1352 | { |
| 1353 | CCH_MARK(vdr_tdbb, &window); |
| 1354 | p[-1] &= ~(1 << (number & 7)); |
| 1355 | vdr_fixed++; |
| 1356 | } |
| 1357 | } |
| 1358 | } |
| 1359 | else if (!(byte & 1) && (vdr_flags & VDR_records)) |
| 1360 | { |
| 1361 | // Page is potentially an orphan - but don't declare it as such |
| 1362 | // unless we think we walked all pages |
| 1363 | |
| 1364 | corrupt(VAL_PAG_ORPHAN, 0, number); |
| 1365 | if (vdr_flags & VDR_update) |
| 1366 | { |
| 1367 | CCH_MARK(vdr_tdbb, &window); |
| 1368 | p[-1] |= 1 << (number & 7); |
| 1369 | vdr_fixed++; |
| 1370 |
nothing calls this directly
no test coverage detected