9 #define UIP_ERROR(m) uip_log(__FILE__,__LINE__,m)
12 #endif /* UIP_ERRORING == 1 */
15 #define SIZEOF_STRUCT_MEM (sizeof(struct mem)+(((sizeof(struct mem)%MEM_ALIGNMENT)==0)?0:(4-(sizeof(struct mem)%MEM_ALIGNMENT))))
22 static struct mem
*ram_free
;
23 static struct mem
*ram_end
;
24 static u8 ram_block
[sizeof(struct mem
)+UIP_MEM_SIZE
+MEM_ALIGNMENT
];
26 static void plug_holes(struct mem
*rmem
)
31 nmem
= (struct mem
*)&ram_block
[rmem
->next
];
32 if(rmem
!=nmem
&& nmem
->used
==0 && (u8_t
*)nmem
!=(u8_t
*)ram_end
) {
33 if(ram_free
==nmem
) ram_free
= rmem
;
35 rmem
->next
= nmem
->next
;
36 ((struct mem
*)&ram_block
[nmem
->next
])->prev
= (u8_t
*)rmem
- ram_block
;
39 pmem
= (struct mem
*)&ram_block
[rmem
->prev
];
40 if(pmem
!=rmem
&& pmem
->used
==0) {
41 if(ram_free
==rmem
) ram_free
= pmem
;
42 pmem
->next
= rmem
->next
;
43 ((struct mem
*)&ram_block
[rmem
->next
])->prev
= (u8_t
*)pmem
- ram_block
;
51 UIP_MEMSET(ram_block
,0,UIP_MEM_SIZE
);
52 rmem
= (struct mem
*)ram_block
;
53 rmem
->next
= UIP_MEM_SIZE
;
57 ram_end
= (struct mem
*)&ram_block
[UIP_MEM_SIZE
];
59 ram_end
->prev
= UIP_MEM_SIZE
;
60 ram_end
->next
= UIP_MEM_SIZE
;
62 ram_free
= (struct mem
*)ram_block
;
65 void* memr_malloc(u32 size
)
68 struct mem
*rmem
,*rmem2
;
70 if(size
==0) return NULL
;
72 if(size
%MEM_ALIGNMENT
) size
+= MEM_ALIGNMENT
- ((size
+SIZEOF_STRUCT_MEM
)%SIZEOF_STRUCT_MEM
);
73 if(size
>UIP_MEM_SIZE
) return NULL
;
75 for(ptr
= (u8_t
*)ram_free
- ram_block
;ptr
<UIP_MEM_SIZE
;ptr
=((struct mem
*)&ram_block
[ptr
])->next
) {
76 rmem
= (struct mem
*)&ram_block
[ptr
];
77 if(!rmem
->used
&& rmem
->next
- (ptr
+ SIZEOF_STRUCT_MEM
)>=size
+ SIZEOF_STRUCT_MEM
) {
78 ptr2
= ptr
+ SIZEOF_STRUCT_MEM
+ size
;
79 rmem2
= (struct mem
*)&ram_block
[ptr2
];
82 rmem2
->next
= rmem
->next
;
84 if(rmem
->next
!=UIP_MEM_SIZE
) ((struct mem
*)&ram_block
[rmem2
->next
])->prev
= ptr2
;
90 while(ram_free
->used
&& ram_free
!=ram_end
) ram_free
= (struct mem
*)&ram_block
[ram_free
->next
];
93 return (u8_t
*)rmem
+SIZEOF_STRUCT_MEM
;
99 void memr_free(void *ptr
)
103 if(ptr
==NULL
) return;
104 if((u8_t
*)ptr
<(u8_t
*)ram_block
|| (u8_t
*)ptr
>=(u8_t
*)ram_end
) return;
106 rmem
= (struct mem
*)((u8_t
*)ptr
- SIZEOF_STRUCT_MEM
);
109 if(rmem
<ram_free
) ram_free
= rmem
;
114 void* memr_realloc(void *ptr
,u32 newsize
)
117 struct mem
*rmem
,*rmem2
;
119 if(newsize
%MEM_ALIGNMENT
) newsize
+= MEM_ALIGNMENT
- ((newsize
+ SIZEOF_STRUCT_MEM
)%MEM_ALIGNMENT
);
120 if(newsize
>UIP_MEM_SIZE
) return NULL
;
121 if((u8_t
*)ptr
<(u8_t
*)ram_block
|| (u8_t
*)ptr
>=(u8_t
*)ram_end
) {
122 UIP_ERROR("memr_realloc: illegal memory.\n");
125 rmem
= (struct mem
*)((u8_t
*)ptr
- SIZEOF_STRUCT_MEM
);
126 ptr1
= (u8_t
*)rmem
- ram_block
;
127 size
= rmem
->next
- ptr1
- SIZEOF_STRUCT_MEM
;
129 if(newsize
+SIZEOF_STRUCT_MEM
+MIN_SIZE
<size
) {
130 ptr2
= ptr1
+ SIZEOF_STRUCT_MEM
+ newsize
;
131 rmem2
= (struct mem
*)&ram_block
[ptr2
];
133 rmem2
->next
= rmem
->next
;
136 if(rmem2
->next
!=UIP_MEM_SIZE
) ((struct mem
*)&ram_block
[rmem2
->next
])->prev
= ptr2
;
144 void* memr_reallocm(void *ptr
,u32 newsize
)
148 nmem
= memr_malloc(newsize
);
149 if(nmem
==NULL
) return memr_realloc(ptr
,newsize
);
151 UIP_MEMCPY(nmem
,ptr
,newsize
);