00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _RTAI_MALLOC_H
00025 #define _RTAI_MALLOC_H
00026
00027 #include <rtai_types.h>
00028
00029 #ifdef __KERNEL__
00030
00031 #ifndef __cplusplus
00032
00033 #include <linux/kernel.h>
00034 #include <linux/list.h>
00035 #include <linux/spinlock.h>
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 #define RTHEAP_MINLOG2 4
00058 #define RTHEAP_MAXLOG2 22
00059 #define RTHEAP_MINALLOCSZ (1 << RTHEAP_MINLOG2)
00060 #define RTHEAP_MINALIGNSZ RTHEAP_MINALLOCSZ
00061 #define RTHEAP_NBUCKETS (RTHEAP_MAXLOG2 - RTHEAP_MINLOG2 + 2)
00062 #define RTHEAP_MAXEXTSZ (1 << 24)
00063 #define RTHEAP_GLOBALSZ (CONFIG_RTAI_MALLOC_HEAPSZ * 1024)
00064
00065 #define RTHEAP_PFREE 0
00066 #define RTHEAP_PCONT 1
00067 #define RTHEAP_PLIST 2
00068
00069 #define KMALLOC_LIMIT (128 * 1024)
00070
00071 #define RTHEAP_NOMEM (-1)
00072 #define RTHEAP_PARAM (-2)
00073
00074 typedef struct rtextent {
00075
00076 struct list_head link;
00077
00078 caddr_t membase,
00079 memlim,
00080 freelist;
00081
00082 u_char pagemap[1];
00083
00084 } rtextent_t;
00085
00086
00087 #define RTHEAP_EXTENDABLE 0x1
00088
00089
00090 #define RTHEAP_EXTEND 0x1
00091
00092 typedef struct rtheap {
00093
00094 spinlock_t lock;
00095
00096 int flags;
00097
00098 u_long extentsize,
00099 pagesize,
00100 pageshift,
00101 hdrsize,
00102 npages,
00103 ubytes,
00104 maxcont;
00105
00106 struct list_head extents;
00107
00108 caddr_t buckets[RTHEAP_NBUCKETS];
00109
00110 } rtheap_t;
00111
00112 #else
00113
00114 struct rtheap;
00115
00116 typedef struct rtheap rtheap_t;
00117
00118 #endif
00119
00120 extern rtheap_t rtai_global_heap;
00121
00122 #define rtheap_page_size(heap) ((heap)->pagesize)
00123 #define rtheap_page_count(heap) ((heap)->npages)
00124 #define rtheap_used_mem(heap) ((heap)->ubytes)
00125
00126 #define rt_malloc(sz) rtheap_alloc(&rtai_global_heap,sz,0)
00127 #define rt_free(p) rtheap_free(&rtai_global_heap,p)
00128
00129 #ifdef __cplusplus
00130 extern "C" {
00131 #endif
00132
00133 int __rtai_heap_init(void);
00134
00135 void __rtai_heap_exit(void);
00136
00137 int rtheap_init(rtheap_t *heap,
00138 void *heapaddr,
00139 u_long heapsize,
00140 u_long pagesize);
00141
00142 void rtheap_destroy(rtheap_t *heap);
00143
00144 void *rtheap_alloc(rtheap_t *heap,
00145 u_long size,
00146 int flags);
00147
00148 int rtheap_free(rtheap_t *heap,
00149 void *block);
00150
00151 #ifdef __cplusplus
00152 }
00153 #endif
00154
00155 #endif
00156
00157 #endif