1
/*****************************************************************************
3
Copyright (c) 2006, 2009, Innobase Oy. All Rights Reserved.
5
This program is free software; you can redistribute it and/or modify it under
6
the terms of the GNU General Public License as published by the Free Software
7
Foundation; version 2 of the License.
9
This program is distributed in the hope that it will be useful, but WITHOUT
10
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
13
You should have received a copy of the GNU General Public License along with
14
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
15
Place, Suite 330, Boston, MA 02111-1307 USA
17
*****************************************************************************/
19
/**************************************************//**
20
@file include/buf0buddy.ic
21
Binary buddy allocator for compressed pages
23
Created December 2006 by Marko Makela
24
*******************************************************/
26
#ifdef UNIV_MATERIALIZE
32
#include "buf0buddy.h"
34
#include "sync0sync.h"
36
/**********************************************************************//**
37
Allocate a block. The thread calling this function must hold
38
buf_pool_mutex and must not hold buf_pool_zip_mutex or any block->mutex.
39
The buf_pool_mutex may only be released and reacquired if lru != NULL.
40
@return allocated block, possibly NULL if lru==NULL */
45
ulint i, /*!< in: index of buf_pool->zip_free[],
47
ibool* lru) /*!< in: pointer to a variable that will be assigned
48
TRUE if storage was allocated from the LRU list
49
and buf_pool_mutex was temporarily released,
50
or NULL if the LRU list should not be used */
51
__attribute__((malloc));
53
/**********************************************************************//**
54
Deallocate a block. */
59
void* buf, /*!< in: block to be freed, must not be
60
pointed to by the buffer pool */
61
ulint i) /*!< in: index of buf_pool->zip_free[],
63
__attribute__((nonnull));
65
/**********************************************************************//**
66
Get the index of buf_pool->zip_free[] for a given block size.
67
@return index of buf_pool->zip_free[], or BUF_BUDDY_SIZES */
72
ulint size) /*!< in: block size */
77
for (i = 0, s = BUF_BUDDY_LOW; s < size; i++, s <<= 1) {
80
ut_ad(i <= BUF_BUDDY_SIZES);
84
/**********************************************************************//**
85
Allocate a block. The thread calling this function must hold
86
buf_pool_mutex and must not hold buf_pool_zip_mutex or any
87
block->mutex. The buf_pool_mutex may only be released and reacquired
88
if lru != NULL. This function should only be used for allocating
89
compressed page frames or control blocks (buf_page_t). Allocated
90
control blocks must be properly initialized immediately after
91
buf_buddy_alloc() has returned the memory, before releasing
93
@return allocated block, possibly NULL if lru == NULL */
98
ulint size, /*!< in: block size, up to UNIV_PAGE_SIZE */
99
ibool* lru) /*!< in: pointer to a variable that will be assigned
100
TRUE if storage was allocated from the LRU list
101
and buf_pool_mutex was temporarily released,
102
or NULL if the LRU list should not be used */
104
ut_ad(buf_pool_mutex_own());
106
return(buf_buddy_alloc_low(buf_buddy_get_slot(size), lru));
109
/**********************************************************************//**
110
Deallocate a block. */
115
void* buf, /*!< in: block to be freed, must not be
116
pointed to by the buffer pool */
117
ulint size) /*!< in: block size, up to UNIV_PAGE_SIZE */
119
ut_ad(buf_pool_mutex_own());
121
buf_buddy_free_low(buf, buf_buddy_get_slot(size));
124
#ifdef UNIV_MATERIALIZE
126
# define UNIV_INLINE UNIV_INLINE_ORIGINAL