Locks the pages_mutex_ and Loads as many pages can fit in max_memory_ starting at index pages_offset_.
| 503 | // Locks the pages_mutex_ and Loads as many pages can fit in max_memory_ |
| 504 | // starting at index pages_offset_. |
| 505 | bool DocumentData::ReCachePages() { |
| 506 | SVAutoLock lock(&pages_mutex_); |
| 507 | // Read the file. |
| 508 | set_total_pages(0); |
| 509 | set_memory_used(0); |
| 510 | int loaded_pages = 0; |
| 511 | pages_.truncate(0); |
| 512 | TFile fp; |
| 513 | if (!fp.Open(document_name_, reader_) || |
| 514 | !PointerVector<ImageData>::DeSerializeSize(false, &fp, &loaded_pages) || |
| 515 | loaded_pages <= 0) { |
| 516 | tprintf("Deserialize header failed: %s\n", document_name_.string()); |
| 517 | return false; |
| 518 | } |
| 519 | pages_offset_ %= loaded_pages; |
| 520 | // Skip pages before the first one we want, and load the rest until max |
| 521 | // memory and skip the rest after that. |
| 522 | int page; |
| 523 | for (page = 0; page < loaded_pages; ++page) { |
| 524 | if (page < pages_offset_ || |
| 525 | (max_memory_ > 0 && memory_used() > max_memory_)) { |
| 526 | if (!PointerVector<ImageData>::DeSerializeSkip(false, &fp)) break; |
| 527 | } else { |
| 528 | if (!pages_.DeSerializeElement(false, &fp)) break; |
| 529 | ImageData* image_data = pages_.back(); |
| 530 | if (image_data->imagefilename().length() == 0) { |
| 531 | image_data->set_imagefilename(document_name_); |
| 532 | image_data->set_page_number(page); |
| 533 | } |
| 534 | image_data->set_language(lang_); |
| 535 | set_memory_used(memory_used() + image_data->MemoryUsed()); |
| 536 | } |
| 537 | } |
| 538 | if (page < loaded_pages) { |
| 539 | tprintf("Deserialize failed: %s read %d/%d pages\n", |
| 540 | document_name_.string(), page, loaded_pages); |
| 541 | pages_.truncate(0); |
| 542 | } else { |
| 543 | tprintf("Loaded %d/%d pages (%d-%d) of document %s\n", pages_.size(), |
| 544 | loaded_pages, pages_offset_, pages_offset_ + pages_.size(), |
| 545 | document_name_.string()); |
| 546 | } |
| 547 | set_total_pages(loaded_pages); |
| 548 | return !pages_.empty(); |
| 549 | } |
| 550 | |
| 551 | // A collection of DocumentData that knows roughly how much memory it is using. |
| 552 | DocumentCache::DocumentCache(inT64 max_memory) |
no test coverage detected