comrogue-pi/kernel/lib/heap_arena.c

117 lines
3.7 KiB
C

/*
* This file is part of the COMROGUE Operating System for Raspberry Pi
*
* Copyright (c) 2013, Eric J. Bowersox / Erbosoft Enterprises
* All rights reserved.
*
* This program is free for commercial and non-commercial use as long as the following conditions are
* adhered to.
*
* Copyright in this file remains Eric J. Bowersox and/or Erbosoft, and as such any copyright notices
* in the code are not to be removed.
*
* Redistribution and use in source and binary forms, with or without modification, are permitted
* provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice, this list of conditions and
* the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
* the following disclaimer in the documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* "Raspberry Pi" is a trademark of the Raspberry Pi Foundation.
*/
/*
* This code is based on/inspired by jemalloc-3.3.1. Please see LICENSE.jemalloc for further details.
*/
#include <comrogue/compiler_macros.h>
#include <comrogue/types.h>
#include <comrogue/scode.h>
#include <comrogue/internals/mmu.h>
#include "heap_internals.h"
#ifdef _H_THIS_FILE
#undef _H_THIS_FILE
_DECLARE_H_THIS_FILE
#endif
/*----------------------------
* Arena management functions
*----------------------------
*/
static SIZE_T bin_info_cbRunSize_calc(PHEAPDATA phd, PARENABININFO pBinInfo, SIZE_T cbMinRun)
{
/*
SIZE_T cbPad;
SIZE_T cbTryRunSize;
SIZE_T cbGoodRunSize;
UINT32 nTryRegions;
UINT32 nGoodRegions;
UINT32 cbTryHeader;
UINT32 cbGoodHeader;
UINT32 ofsTryBitmap;
UINT32 ofsGoodBitmap;
UINT32 ofsTryCtx0;
UINT32 ofsGoodCtx0;
UINT32 ofsTryRedZone0;
UINT32 ofsGoodRedZone0;
*/
_H_ASSERT(phd, cbMinRun >= SYS_PAGE_SIZE);
_H_ASSERT(phd, cbMinRun <= phd->szArenaMaxClass);
return 0; /* TODO */
}
static void bin_info_init(PHEAPDATA phd)
{
PARENABININFO pBinInfo; /* pointer to arena bin information */
SIZE_T szPrevRun = SYS_PAGE_SIZE; /* previous run size */
#define SIZE_CLASS(bin, delta, size) \
pBinInfo = &(phd->aArenaBinInfo[bin]); \
pBinInfo->cbRegions = size; \
szPrevRun = bin_info_cbRunSize_calc(phd, pBinInfo, szPrevRun); \
/* TODO bitmap_info_init */
SIZE_CLASSES
#undef SIZE_CLASS
/* TODO */
}
HRESULT _HeapArenaSetup(PHEAPDATA phd)
{
SIZE_T szHeader; /* size of the header */
UINT32 i; /* loop counter */
phd->cpgMapBias = 0;
for (i = 0; i < 3; i++)
{
szHeader = sizeof(ARENACHUNK) + (sizeof(ARENACHUNKMAP) * (phd->cpgChunk - phd->cpgMapBias));
phd->cpgMapBias = (szHeader >> SYS_PAGE_BITS) + ((szHeader & SYS_PAGE_MASK) != 0);
}
_H_ASSERT(phd, phd->cpgMapBias > 0);
phd->szArenaMaxClass = phd->szChunk - (phd->cpgMapBias << SYS_PAGE_BITS);
bin_info_init(phd);
return S_OK;
}
void _HeapArenaShutdown(PHEAPDATA phd)
{
/* TODO */
}