picox  0.1
xpico_allocator.h ファイル

Pico variable memory allocator. [詳解]

#include <picox/core/xcore.h>
xpico_allocator.h の依存先関係図:
被依存関係図:

[ソースコード]

データ構造

struct  XPicoAllocator
 

型定義

typedef void(* XPicoAllocatorWalker) (const uint8_t *chunk, size_t size, void *user)
 

関数

void * xpalloc_allocate (XPicoAllocator *self, size_t size)
 
size_t xpalloc_allocation_overhead (const XPicoAllocator *self, size_t n)
 
static size_t xpalloc_capacity (const XPicoAllocator *self)
 
void xpalloc_clear (XPicoAllocator *self)
 
void xpalloc_deallocate (XPicoAllocator *self, void *ptr)
 
void xpalloc_deinit (XPicoAllocator *self)
 
static uint8_t * xpalloc_heap (const XPicoAllocator *self)
 
bool xpalloc_init (XPicoAllocator *self, void *heap, size_t size, size_t alignment)
 
bool xpalloc_is_owner (const XPicoAllocator *self, const void *ptr)
 
static size_t xpalloc_max_used (const XPicoAllocator *self)
 
void * xpalloc_reallocate (XPicoAllocator *self, void *old_mem, size_t size)
 
static size_t xpalloc_reserve (const XPicoAllocator *self)
 
void xpalloc_walk_heap (const XPicoAllocator *self, XPicoAllocatorWalker walker, void *user)
 

詳解

Pico variable memory allocator.

最低限の機能を備えた可変長メモリアロケータです。最低限の機能というのは、 断片化対策を一切していないという意味です。色々なメモリアロケータのアルゴ リズム(TLSF, dlmalloc, etc..)では断片化しづらいようにしたり、断片化して も性能が劣化しないように等、色々と工夫を凝らしているようですが、小規模な 組み込み環境を想定した場合、最低限の機能で十分なことが多いと思われます。

また、復数のヒープを使って機能ごとに専用アロケータを用意する等、柔軟な使 い方ができる。ヒープの使用状況を確認できるインターフェースが用意されてい るといった点もこのモジュールの利点です。

実装も超シンプルなので、メモリアロケータ実装に興味のある人の入門用にも ピッタリでしょう。

@author  MaskedW

型定義詳解

typedef void(* XPicoAllocatorWalker) (const uint8_t *chunk, size_t size, void *user)

ヒープの空きブロック走査用コールバック関数です

引数
chunk空きブロックのポインタ
size空きブロックのサイズ
userユーザーデータポインタ

関数詳解

void* xpalloc_allocate ( XPicoAllocator self,
size_t  size 
)

ヒープからsizeバイトのメモリを切り出して返します

事前条件
  • size > 0
size_t xpalloc_allocation_overhead ( const XPicoAllocator self,
size_t  n 
)

nバイトのメモリ確保を行った場合に必要な余分なメモリサイズを返します。

static size_t xpalloc_capacity ( const XPicoAllocator self)
inlinestatic

ヒープのサイズを返します

void xpalloc_clear ( XPicoAllocator self)

ヒープを初期状態に戻します

void xpalloc_deallocate ( XPicoAllocator self,
void *  ptr 
)

ヒープにメモリを返却します

事前条件
  • xpallloc_is_owner(self, ptr) == true
覚え書き
ptr == NULLの時は何もしません。
void xpalloc_deinit ( XPicoAllocator self)

オブジェクトの終了処理を行います

static uint8_t* xpalloc_heap ( const XPicoAllocator self)
inlinestatic

ヒープメモリ自身を返します

bool xpalloc_init ( XPicoAllocator self,
void *  heap,
size_t  size,
size_t  alignment 
)

メモリブロックを初期化します

引数
heapheapとして利用するメモリ領域
sizeheap領域のサイズ
alignmentallocatorが返すメモリアドレスのアライメント

heap == NULLの場合はsizeバイトのメモリをx_malloc()で確保します。

事前条件
  • heapをアライメント調整したあとのサイズ > 0
  • alignment == 2のべき乗
戻り値
true初期化成功
falseメモリ確保失敗
覚え書き
heapが指すアドレスはalignmentに切り上げられます。そのため、可能であればheap をあらかじめalignmentに合わせておくと無駄がありません。 また、alocation時にもalignmentに応じた切り上げが行われるので、sizeで指定した バイト数を余すことなく動的メモリとして使用することはできないことに注意してく ださい。

alignmentには特殊なアラインメントが必要な時以外はX_ALIGN_OF(XMaxAlign)を指定 しておくのが無難です。例えば文字列等のバイトデータしか扱わないということがわ かっているなら、アライメントを1とすることができますが、管理データの格納用に 内部的には最低でもX_ALIGN_OF(size_t)まで、切り上げが行われます。

bool xpalloc_is_owner ( const XPicoAllocator self,
const void *  ptr 
)

ポインタがヒープ領域の範囲内かどうかを返します。

static size_t xpalloc_max_used ( const XPicoAllocator self)
inlinestatic

ヒープの最大使用バイト数を返します

void* xpalloc_reallocate ( XPicoAllocator self,
void *  old_mem,
size_t  size 
)

realloc()相当の処理を行います

static size_t xpalloc_reserve ( const XPicoAllocator self)
inlinestatic

空きメモリバイト数を返します

void xpalloc_walk_heap ( const XPicoAllocator self,
XPicoAllocatorWalker  walker,
void *  user 
)

ヒープ内の空きブロックを走査し、ブロックごとにwalkerを呼び出します

デバッグ用です。walkerがデータを収集することで、断片化状況等を確認できます。

引数
walker空きブロック検出毎に呼び出される関数
userwalker呼び出し時に渡されるポインタ