/*
 * $Id: __osMalloc.h,v 1.1 2003/02/07 18:15:44 wheeler Exp $
 * $Log: __osMalloc.h,v $
 * Revision 1.1  2003/02/07 18:15:44  wheeler
 * Fox's version of libultra and friends.
 *
 * Revision 1.7  1997/03/05  05:01:15  hayakawa
 * gccのワーニングに対応
 *
 * Revision 1.6  1996/12/18  02:52:15  hayakawa
 * FINALROM と DEBUGを入れ替えた
 *
 * Revision 1.5  1996/12/18  02:35:50  hayakawa
 * コンパイルエラー対処
 * OSArenaメンバ追加
 *
 * Revision 1.4  1996/12/18  01:31:30  hayakawa
 * realloc追加
 * realloc,freeのDEBUGバージョンの追加
 *
 * Revision 1.3  1996/11/01  09:21:43  hayakawa
 * デバッグ情報にmalloc時刻を追加
 *
 * Revision 1.2  1996/10/25  14:03:23  hayakawa
 * __osで始まる関数をmallocから__osMallocに移した
 *
 * Revision 1.1  1996/10/24  07:52:47  hayakawa
 * Initial revision
 *
 */

#ifndef __OSMALLOC_H_
#define __OSMALLOC_H_

#include "ultra64.h"
#include "stddef.h"

typedef struct OSMemBlock_s {
    s16         mark;                   /* magic cookie */
    s16         free;
    s32         size;
    struct      OSMemBlock_s *next;     /* pointer to the next header   */
    struct      OSMemBlock_s *prev;
#ifndef FINALROM
    const char 	*file;			/* __FILE__ */
    s32 	line;			/* __LINE__ */
    OSId/*s32*/	osid;			/* osGetThreadId() */
    u32 	dummy1;
    OSTime/*u64*/ time;			/* osGetTime() */
    u32 	dummy2;
#endif
} OSMemBlock;

typedef struct {
    OSMemBlock *start;		/* list of allocated blocks     */
    u8 *base;			/* ヒープ領域先頭ポインタ */
    s32 len;			/* ヒープサイズ */
} OSArena;

#ifdef _LANGUAGE_C_PLUS_PLUS
extern "C" {
#endif

    void __osMallocInit(OSArena *arena, u8 *base, s32 len);
#if DEBUG
    void *__osMalloc_DEBUG(OSArena *arena, size_t size, const char *file, int line);
    void *__osRealloc_DEBUG(OSArena *arena, void *ptr, size_t size, const char *file, int line);
    void __osFree_DEBUG(OSArena *arena, void *ptr, const char *file, int line);
#endif /* DEBUG */
    void *__osMalloc(OSArena *arena, size_t size);
    void *__osRealloc(OSArena *arena, void *ptr, size_t size);
    void __osFree(OSArena *, void *ptr);
#if DEBUG
    void __osDisplayArena(OSArena *arena);
    int __osCheckArena(OSArena *arena);
#endif /* DEBUG */

#ifdef _LANGUAGE_C_PLUS_PLUS
} /* extern "C" */
#endif

#endif /* __OSMALLOC_H_ */
