1 |
|
/** @file |
2 |
|
* |
3 |
|
* Dynamic memory manager |
4 |
|
* |
5 |
|
*/ |
6 |
|
|
7 |
/* |
/* |
8 |
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
* Copyright (c) 2001-2003 Swedish Institute of Computer Science. |
9 |
* All rights reserved. |
* All rights reserved. |
36 |
* |
* |
37 |
*/ |
*/ |
38 |
|
|
|
/*-----------------------------------------------------------------------------------*/ |
|
|
/* mem.c |
|
|
* |
|
|
* Memory manager. |
|
|
* |
|
|
*/ |
|
|
/*-----------------------------------------------------------------------------------*/ |
|
39 |
|
|
40 |
#include "lwip/arch.h" |
#include "lwip/arch.h" |
41 |
#include "lwip/opt.h" |
#include "lwip/opt.h" |
73 |
|
|
74 |
static sys_sem_t mem_sem; |
static sys_sem_t mem_sem; |
75 |
|
|
|
/*-----------------------------------------------------------------------------------*/ |
|
76 |
static void |
static void |
77 |
plug_holes(struct mem *mem) |
plug_holes(struct mem *mem) |
78 |
{ |
{ |
106 |
} |
} |
107 |
|
|
108 |
} |
} |
|
/*-----------------------------------------------------------------------------------*/ |
|
109 |
void |
void |
110 |
mem_init(void) |
mem_init(void) |
111 |
{ |
{ |
129 |
lwip_stats.mem.avail = MEM_SIZE; |
lwip_stats.mem.avail = MEM_SIZE; |
130 |
#endif /* MEM_STATS */ |
#endif /* MEM_STATS */ |
131 |
} |
} |
|
/*-----------------------------------------------------------------------------------*/ |
|
132 |
void |
void |
133 |
mem_free(void *rmem) |
mem_free(void *rmem) |
134 |
{ |
{ |
141 |
sys_sem_wait(mem_sem); |
sys_sem_wait(mem_sem); |
142 |
|
|
143 |
LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && |
LWIP_ASSERT("mem_free: legal memory", (u8_t *)rmem >= (u8_t *)ram && |
144 |
(u8_t *)rmem < (u8_t *)ram_end); |
(u8_t *)rmem < (u8_t *)ram_end); |
145 |
|
|
146 |
|
|
147 |
if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { |
if ((u8_t *)rmem < (u8_t *)ram || (u8_t *)rmem >= (u8_t *)ram_end) { |
169 |
plug_holes(mem); |
plug_holes(mem); |
170 |
sys_sem_signal(mem_sem); |
sys_sem_signal(mem_sem); |
171 |
} |
} |
|
/*-----------------------------------------------------------------------------------*/ |
|
172 |
void * |
void * |
173 |
mem_reallocm(void *rmem, mem_size_t newsize) |
mem_reallocm(void *rmem, mem_size_t newsize) |
174 |
{ |
{ |
233 |
sys_sem_signal(mem_sem); |
sys_sem_signal(mem_sem); |
234 |
return rmem; |
return rmem; |
235 |
} |
} |
|
/*-----------------------------------------------------------------------------------*/ |
|
236 |
void * |
void * |
237 |
mem_malloc(mem_size_t size) |
mem_malloc(mem_size_t size) |
238 |
{ |
{ |
255 |
|
|
256 |
sys_sem_wait(mem_sem); |
sys_sem_wait(mem_sem); |
257 |
|
|
258 |
for(ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE; ptr = ((struct mem *)&ram[ptr])->next) { |
for (ptr = (u8_t *)lfree - ram; ptr < MEM_SIZE; ptr = ((struct mem *)&ram[ptr])->next) { |
259 |
mem = (struct mem *)&ram[ptr]; |
mem = (struct mem *)&ram[ptr]; |
260 |
if (!mem->used && |
if (!mem->used && |
261 |
mem->next - (ptr + SIZEOF_STRUCT_MEM) >= size + SIZEOF_STRUCT_MEM) { |
mem->next - (ptr + SIZEOF_STRUCT_MEM) >= size + SIZEOF_STRUCT_MEM) { |
303 |
sys_sem_signal(mem_sem); |
sys_sem_signal(mem_sem); |
304 |
return NULL; |
return NULL; |
305 |
} |
} |
|
/*-----------------------------------------------------------------------------------*/ |
|