diff --git a/src/storage/buffer_pool_manager.cpp b/src/storage/buffer_pool_manager.cpp index 17a4613a979816147e6b88a046b2b337a63abdfd..24035151fcb42b5d19a7ed2df94806a10334f118 100644 --- a/src/storage/buffer_pool_manager.cpp +++ b/src/storage/buffer_pool_manager.cpp @@ -65,13 +65,12 @@ Page* BufferPoolManager::fetch_page(PageId page_id) { // 1.2 å¦åˆ™ï¼Œå°è¯•调用find_victim_page获得一个å¯ç”¨çš„frame,若失败则返回nullptr frame_id_t frame_id; - latch_.lock(); + std::scoped_lock lock{latch_}; if(page_table_.find(page_id) != page_table_.end()){ frame_id = page_table_[page_id]; Page& page_des = pages_[frame_id]; page_des.pin_count_++; replacer_->pin(frame_id); - latch_.unlock(); return &page_des; } frame_id = -1; @@ -103,19 +102,17 @@ Page* BufferPoolManager::fetch_page(PageId page_id) { bool BufferPoolManager::unpin_page(PageId page_id, bool is_dirty) { // Todo: // 0. lock latch - latch_.lock(); + std::scoped_lock lock{latch_};; // 1. å°è¯•在page_table_䏿œå¯»page_id对应的页P auto it = page_table_.find(page_id); // 1.1 P在页表ä¸ä¸å˜åœ¨ return false if(it == page_table_.end()){ - latch_.unlock(); return false; } // 1.2 P在页表ä¸å˜åœ¨ï¼ŒèŽ·å–å…¶pin_count_ frame_id_t frame_id = it -> second; // 2.1 è‹¥pin_count_å·²ç»ç‰äºŽ0,则返回false if(pages_[frame_id].pin_count_ == 0){ - latch_.unlock(); return false; } // 2.2 è‹¥pin_count_大于0,则pin_count_自å‡ä¸€ @@ -128,7 +125,6 @@ bool BufferPoolManager::unpin_page(PageId page_id, bool is_dirty) { if(is_dirty){ pages_[frame_id].is_dirty_ = true; } - latch_.unlock(); return true; } @@ -140,7 +136,7 @@ bool BufferPoolManager::unpin_page(PageId page_id, bool is_dirty) { bool BufferPoolManager::flush_page(PageId page_id) { // Todo: // 0. lock latch - latch_.lock(); + std::scoped_lock lock{latch_};; // 1. 查找页表,å°è¯•获å–ç›®æ ‡é¡µP auto it = page_table_.find(page_id); // 1.1 ç›®æ ‡é¡µP没有被page_table_记录 ,返回false @@ -153,7 +149,6 @@ bool BufferPoolManager::flush_page(PageId page_id) { disk_manager_->write_page(page_id.fd,page_id.page_no,pages_[frame_id].data_,PAGE_SIZE); // 3. æ›´æ–°Pçš„is_dirty_ pages_[frame_id].is_dirty_ = false; - latch_.unlock(); return true; } @@ -165,7 +160,7 @@ bool BufferPoolManager::flush_page(PageId page_id) { Page* BufferPoolManager::new_page(PageId* page_id) { // 1. 获得一个å¯ç”¨çš„frameï¼Œè‹¥æ— æ³•èŽ·å¾—åˆ™è¿”å›žnullptr frame_id_t frame_id = -1; - latch_.lock(); + std::scoped_lock lock{latch_};; if(!find_victim_page(&frame_id)){ latch_.unlock(); return nullptr; @@ -190,7 +185,7 @@ Page* BufferPoolManager::new_page(PageId* page_id) { */ bool BufferPoolManager::delete_page(PageId page_id) { // 1. 在page_table_䏿Ÿ¥æ‰¾ç›®æ ‡é¡µï¼Œè‹¥ä¸å˜åœ¨è¿”回true - latch_.lock(); + std::scoped_lock lock{latch_};; auto it = page_table_.find(page_id); if(it == page_table_.end()){ latch_.unlock(); @@ -219,7 +214,7 @@ bool BufferPoolManager::delete_page(PageId page_id) { * @param {int} fd æ–‡ä»¶å¥æŸ„ */ void BufferPoolManager::flush_all_pages(int fd) { - for(frame_id_t frame_id = 0;frame_id < pool_size_;frame_id++) + for(size_t frame_id = 0;frame_id < pool_size_;frame_id++) { if(pages_[frame_id].id_.fd == fd && pages_[frame_id].id_.page_no != INVALID_PAGE_ID) flush_page(pages_[frame_id].id_);