blob: 38be39c34f27a18be2cb0cb92239437c58702c11 [file] [log] [blame]
//===- Slab.h - Implementation of poolallocator runtime -------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This header file defines structures used internally by the free list pool
// allocator library.
//
//===----------------------------------------------------------------------===//
#ifndef _POOLSLAB_H
#define _POOLSLAB_H
#include "PoolAllocator.h"
#include "PageManager.h"
#include <assert.h>
#include <stdlib.h>
//===----------------------------------------------------------------------===//
//
// Defintion of Slab Data Structures
//
//===----------------------------------------------------------------------===//
//
// Provide a pointer type that points to pointers of itself.
//
typedef struct NodePointer
{
struct NodePointer * Next;
} NodePointer;
//
// Structure: SlabHeader
//
// Description:
// This structure defines the beginning of a memory slab. A memory slab
// consists of book keeping information, a list of pointers, and a list of
// data blocks.
//
// There is a 1 to 1 correspondence between the pointers and the data blocks.
// Pointer[x] points to Pointer[y] if Data[y] is linked after Data[x] in a
// linked list. In other words, Pointer[x] is the "next" pointer for Data[x].
//
// The slab is allocated on a page boundary, so it is easy to find match
// pointers to blocks if you know the offset of one of them.
//
struct SlabHeader
{
// Flags whether this is an array
unsigned char IsArray : 1;
// Flags whether this is managed by the Page Manager
unsigned char IsManaged : 1;
// Number of nodes per slab
unsigned int NodesPerSlab;
// Reference Count
unsigned int LiveNodes;
// Next free data block
unsigned int NextFreeData;
// Pointer to the next slab
struct SlabHeader * Next;
// Pointer to the data area (will be in the same page)
unsigned char * Data;
// Pointer to the list of nodes
//NodePointer* BlockList;
};
#define BlockList(x) ((NodePointer*)((char*)x + sizeof(SlabHeader)))
#endif /* _POOLSLAB_H */