00001
00002
00003
00004 #if !defined(_MEMINTH)
00005 #define _MEMINTH
00006
00007
00008
00009
00010 #include "memuser.h"
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #if defined(USE_MALLOC_FREE)
00029 #if defined(__STDC__)
00030 extern void *malloc(unsigned long);
00031 extern void free(void *);
00032 extern void *realloc(void *, unsigned long);
00033 #define MALLOC(size) ((pointer)malloc((unsigned long)(size)))
00034 #define FREE(p) (free((void *)(p)))
00035 #define REALLOC(p, size) ((pointer)realloc((void *)(p), (unsigned long)(size)))
00036 #else
00037 extern char *malloc();
00038 extern void free();
00039 extern char *realloc();
00040 #define MALLOC(size) ((pointer)malloc((int)(size)))
00041 #define FREE(p) (free((char *)(p)))
00042 #define REALLOC(p, size) ((pointer)realloc((char *)(p), (int)(size)))
00043 #endif
00044 #else
00045 #if defined(__STDC__)
00046 #ifdef HAVE_UNISTD_H
00047 #include <unistd.h>
00048 #else
00049 extern char *sbrk(int);
00050 #endif
00051 #define SBRK(size) ((pointer)sbrk((int)(size)))
00052 #else
00053 extern char *sbrk();
00054 #define SBRK(size) ((pointer)sbrk((int)(size)))
00055 #endif
00056 #endif
00057
00058
00059
00060
00061 #if defined(__STDC__)
00062 #if STDC_HEADERS
00063 #include <string.h>
00064 #else
00065 extern void *memcpy();
00066
00067
00068 extern void *memset();
00069
00070
00071 #endif
00072 #define MEM_COPY(dest, src, size) (void)memcpy((void *)(dest), (const void *)(src), (unsigned long)(size))
00073 #define MEM_ZERO(ptr, size) (void)memset((void *)(ptr), 0, (unsigned long)(size))
00074 #else
00075 extern void bcopy();
00076 extern void bzero();
00077 #define MEM_COPY(dest, src, size) bcopy((char *)(src), (char *)(dest), (int)(size))
00078 #define MEM_ZERO(ptr, size) bzero((char *)(ptr), (int)(size))
00079 #endif
00080
00081
00082 #if defined(__STDC__)
00083 #define ARGS(args) args
00084 #else
00085 #define ARGS(args) ()
00086 #endif
00087
00088
00089
00090
00091 struct segment_
00092 {
00093 pointer base_address;
00094 SIZE_T limit;
00095 };
00096
00097 typedef struct segment_ *segment;
00098
00099
00100 struct block_
00101 {
00102 int used;
00103 int size_index;
00104 struct block_ *next;
00105 struct block_ *prev;
00106 segment seg;
00107 };
00108
00109 typedef struct block_ *block;
00110
00111
00112 #define HEADER_SIZE ((SIZE_T)ROUNDUP(sizeof(struct block_)))
00113 #define MAX_SIZE_INDEX (8*sizeof(SIZE_T)-2)
00114 #define MAX_SEG_SIZE ((SIZE_T)1 << MAX_SIZE_INDEX)
00115 #define MAX_SIZE ((SIZE_T)(MAX_SEG_SIZE-HEADER_SIZE))
00116 #define MIN_ALLOC_SIZE_INDEX 15
00117
00118 #define NICE_BLOCK_SIZE ((SIZE_T)4096-ROUNDUP(sizeof(struct block_)))
00119
00120
00121 extern void mem_fatal ARGS((char *));
00122
00123
00124 #undef ARGS
00125
00126 #endif