mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 06:44:16 +01:00
8e3e3d16d3
buf_LRU_free_block(): Free compressed-only pages and their descriptors with buf_buddy_free(). buf_LRU_get_free_only(): New function for returning a block from buf_pool->free if one is available. Split from buf_LRU_get_free_block(). buf_buddy_alloc_zip(): Rename from buf_buddy_alloc_low() and make static. Remove parameter "split". Always try to split. buf_buddy_free_block(): Rename to buf_buddy_block_free(). buf_buddy_block_register(): New function for registering buf_block_t objects reserved by the allocator. buf_buddy_alloc_from(): New function for allocating an object from a bigger object, and putting the unused parts on the free list. buf_buddy_alloc_clean_zip(): New function for allocating memory by replacing an unmodified compressed page. buf_buddy_alloc_low(): New function for allocating memory, either from the free lists of compressed pages, from the global free list, or from unmodified pages in the buffer pool.
111 lines
2.6 KiB
Text
111 lines
2.6 KiB
Text
/******************************************************
|
|
Binary buddy allocator for compressed pages
|
|
|
|
(c) 2006 Innobase Oy
|
|
|
|
Created December 2006 by Marko Makela
|
|
*******************************************************/
|
|
|
|
#ifdef UNIV_MATERIALIZE
|
|
# undef UNIV_INLINE
|
|
# define UNIV_INLINE
|
|
#endif
|
|
|
|
#include "buf0buddy.h"
|
|
#include "ut0ut.h"
|
|
|
|
/**************************************************************************
|
|
Allocate a block. */
|
|
|
|
void*
|
|
buf_buddy_alloc_low(
|
|
/*================*/
|
|
/* out: pointer to the start of the block */
|
|
ulint i) /* in: index of buf_pool->zip_free[] */
|
|
__attribute__((malloc));
|
|
|
|
/**************************************************************************
|
|
Deallocate a block. */
|
|
|
|
void
|
|
buf_buddy_free_low(
|
|
/*===============*/
|
|
void* buf, /* in: block to free */
|
|
ulint i) /* in: index of buf_pool->zip_free[] */
|
|
__attribute__((nonnull));
|
|
|
|
/**************************************************************************
|
|
Get the offset of the buddy of a compressed page frame. */
|
|
UNIV_INLINE
|
|
lint
|
|
buf_buddy_get_offset(
|
|
/*=================*/
|
|
/* out: offset of the buddy relative to page */
|
|
const void* page, /* in: compressed page */
|
|
ulint size) /* in: page size in bytes */
|
|
{
|
|
ut_ad(ut_is_2pow(size));
|
|
ut_ad(size >= BUF_BUDDY_LOW);
|
|
ut_ad(size < BUF_BUDDY_HIGH);
|
|
|
|
if (((ulint) page) & size) {
|
|
return(-(lint) size);
|
|
} else {
|
|
return((lint) size);
|
|
}
|
|
}
|
|
|
|
/**************************************************************************
|
|
Get the index of buf_pool->zip_free[] for a given block size. */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_buddy_get_slot(
|
|
/*===============*/
|
|
/* out: index of buf_pool->zip_free[] */
|
|
ulint size) /* in: block size */
|
|
{
|
|
ulint i;
|
|
ulint s;
|
|
|
|
for (i = 0, s = BUF_BUDDY_LOW; s < size; i++, s <<= 1);
|
|
|
|
ut_ad(i < BUF_BUDDY_SIZES);
|
|
return(i);
|
|
}
|
|
|
|
/**************************************************************************
|
|
Allocate a block. */
|
|
UNIV_INLINE
|
|
void*
|
|
buf_buddy_alloc(
|
|
/*============*/
|
|
/* out: pointer to the start of the block */
|
|
ulint size) /* in: block size, up to UNIV_PAGE_SIZE / 2 */
|
|
{
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
ut_a(mutex_own(&buf_pool->mutex));
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
return(buf_buddy_alloc_low(buf_buddy_get_slot(size)));
|
|
}
|
|
|
|
/**************************************************************************
|
|
Deallocate a block. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_buddy_free(
|
|
/*===========*/
|
|
void* buf, /* in: block to free */
|
|
ulint size) /* in: block size, up to UNIV_PAGE_SIZE / 2 */
|
|
{
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
ut_a(mutex_own(&buf_pool->mutex));
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
|
|
buf_buddy_free_low(buf, buf_buddy_get_slot(size));
|
|
}
|
|
|
|
#ifdef UNIV_MATERIALIZE
|
|
# undef UNIV_INLINE
|
|
# define UNIV_INLINE UNIV_INLINE_ORIGINAL
|
|
#endif
|