Files
openGauss-server/src/include/utils/mmpool.h
2020-06-30 17:38:27 +08:00

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_ */