122 lines
2.7 KiB
C++
122 lines
2.7 KiB
C++
/*
|
|
* Copyright (c) 2020 Huawei Technologies Co.,Ltd.
|
|
*
|
|
* openGauss is licensed under Mulan PSL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PSL v2.
|
|
* You may obtain a copy of Mulan PSL v2 at:
|
|
*
|
|
* http://license.coscl.org.cn/MulanPSL2
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PSL v2 for more details.
|
|
* ---------------------------------------------------------------------------------------
|
|
*
|
|
* mmpool.h
|
|
*
|
|
*
|
|
*
|
|
* IDENTIFICATION
|
|
* src/include/utils/mmpool.h
|
|
*
|
|
* ---------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef SRC_INCLUDE_UTILS_MMPOOL_H_
|
|
#define SRC_INCLUDE_UTILS_MMPOOL_H_
|
|
|
|
#include "postgres.h"
|
|
#include "utils/memutils.h"
|
|
#include "nodes/pg_list.h"
|
|
|
|
struct MemoryBlock {
|
|
int64 blkSize;
|
|
bool isFree;
|
|
|
|
MemoryBlock* prev;
|
|
MemoryBlock* next;
|
|
};
|
|
|
|
#define MEMORY_BLOCK_HEADER TYPEALIGN(ALIGNOF_LONG, sizeof(MemoryBlock))
|
|
#define MEMORY_BLOCK_MIN_SIZE (2 * MEMORY_BLOCK_HEADER)
|
|
|
|
struct MemoryBlockListHeader {
|
|
MemoryBlock* start;
|
|
MemoryBlock* end;
|
|
};
|
|
|
|
#define POOL_INIT_SUCCESS 0
|
|
#define POOL_INIT_FAIL 1
|
|
|
|
class MemoryPool {
|
|
public:
|
|
// constructor
|
|
MemoryPool();
|
|
|
|
// destructor
|
|
~MemoryPool();
|
|
|
|
// init the memory pool.
|
|
int CreatePool();
|
|
|
|
// release the memory pool.
|
|
void ReleasePool();
|
|
|
|
// Malloc the memory from memory pool.
|
|
void* Malloc(int64 sizeBytes);
|
|
|
|
// Realloc the memory
|
|
void* Realloc(void* addr, int64 sizeBytes);
|
|
|
|
// Free the memory
|
|
void Free(void* addr);
|
|
|
|
// pool is ready?
|
|
inline bool Ready()
|
|
{
|
|
return m_ready;
|
|
}
|
|
|
|
// static function to init/deinit the memory pool
|
|
static int Init();
|
|
|
|
static void Deinit();
|
|
|
|
private:
|
|
// Split a block for fit the size
|
|
bool SplitFreeList(int idx);
|
|
|
|
// Merge block and its buddy
|
|
void MergeBlock(void* addr, MemoryBlock* block, MemoryBlock* blockBuddy, int idx);
|
|
|
|
MemoryBlock* FindBuddy(MemoryBlock* block, int64 size);
|
|
|
|
void AddLast(int idx, MemoryBlock* blk);
|
|
|
|
void AddFirst(int idx, MemoryBlock* blk);
|
|
|
|
void Remove(int idx, MemoryBlock* blk);
|
|
|
|
private:
|
|
// the memory buffer
|
|
char* m_buf; //
|
|
|
|
// memory buffer size
|
|
int64 m_size;
|
|
|
|
// the usage size of memory buffer
|
|
int64 m_use;
|
|
|
|
// concurrency control for mutex
|
|
pthread_mutex_t m_mutex; // lock
|
|
|
|
// free list for the memory pool.
|
|
MemoryBlockListHeader m_freeList[64];
|
|
|
|
// flag to indicate the pool is ready
|
|
volatile bool m_ready;
|
|
};
|
|
|
|
#endif /* SRC_INCLUDE_UTILS_MMPOOL_H_ */
|