/* * __wt_page_out -- * Discard an in-memory page, freeing all memory associated with it. */ void __wt_page_out(WT_SESSION_IMPL *session, WT_PAGE *page, uint32_t flags) { /* * When a page is discarded, it's been disconnected from its parent and * parent's WT_REF structure may now point to a different page. Make * sure we don't use any of that information by accident. */ page->parent = NULL; page->ref = NULL; WT_ASSERT(session, !F_ISSET(page, WT_PAGE_EVICT_LRU)); /* If not a split merged into its parent, the page must be clean. */ WT_ASSERT(session, !__wt_page_is_modified(page) || F_ISSET(page, WT_PAGE_REC_SPLIT_MERGE)); #ifdef HAVE_DIAGNOSTIC __wt_hazard_validate(session, page); #endif /* * If this page has a memory footprint associated with it, update * the cache information. */ if (page->memory_footprint != 0) __wt_cache_page_evict(session, page); switch (page->type) { case WT_PAGE_COL_FIX: __free_page_col_fix(session, page); break; case WT_PAGE_COL_INT: __free_page_col_int(session, page); break; case WT_PAGE_COL_VAR: __free_page_col_var(session, page); break; case WT_PAGE_ROW_INT: __free_page_row_int(session, page); break; case WT_PAGE_ROW_LEAF: __free_page_row_leaf(session, page); break; } if (!LF_ISSET(WT_PAGE_FREE_IGNORE_DISK)) /* Disk image */ __wt_free(session, page->dsk); if (page->modify != NULL) { /* WT_PAGE_MODIFY */ __wt_free(session, page->modify->track); __wt_free(session, page->modify); } #ifdef HAVE_DIAGNOSTIC memset(page, WT_DEBUG_BYTE, sizeof(WT_PAGE)); #endif __wt_free(session, page); }
/* * __wt_page_out -- * Discard an in-memory page, freeing all memory associated with it. */ void __wt_page_out(WT_SESSION_IMPL *session, WT_PAGE **pagep) { WT_PAGE *page; /* * When a page is discarded, it's been disconnected from its parent and * its parent's WT_REF structure may now point to a different page. * Make sure we don't accidentally use the page itself or any other * information. */ page = *pagep; *pagep = NULL; page->parent = NULL; page->ref = NULL; WT_ASSERT(session, !F_ISSET_ATOMIC(page, WT_PAGE_EVICT_LRU)); #ifdef HAVE_DIAGNOSTIC { WT_HAZARD *hp; if ((hp = __wt_page_hazard_check(session, page)) != NULL) __wt_errx(session, "discarded page has hazard pointer: (%p: %s, line %d)", hp->page, hp->file, hp->line); } #endif /* Update the cache's information. */ __wt_cache_page_evict(session, page); /* Free the page modification information. */ if (page->modify != NULL) __free_page_modify(session, page); switch (page->type) { case WT_PAGE_COL_FIX: break; case WT_PAGE_COL_INT: __free_page_col_int(session, page); break; case WT_PAGE_COL_VAR: __free_page_col_var(session, page); break; case WT_PAGE_ROW_INT: __free_page_row_int(session, page); break; case WT_PAGE_ROW_LEAF: __free_page_row_leaf(session, page); break; } /* Free any allocated disk image. */ if (!F_ISSET_ATOMIC(page, WT_PAGE_DISK_NOT_ALLOC)) __wt_free(session, page->dsk); __wt_overwrite_and_free(session, page); }