53 |
|
|
54 |
static u8_t pbuf_pool_memory[(PBUF_POOL_SIZE * MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE + sizeof(struct pbuf)))]; |
static u8_t pbuf_pool_memory[(PBUF_POOL_SIZE * MEM_ALIGN_SIZE(PBUF_POOL_BUFSIZE + sizeof(struct pbuf)))]; |
55 |
|
|
56 |
#ifndef SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
57 |
static volatile u8_t pbuf_pool_free_lock, pbuf_pool_alloc_lock; |
static volatile u8_t pbuf_pool_free_lock, pbuf_pool_alloc_lock; |
58 |
static sys_sem_t pbuf_pool_free_sem; |
static sys_sem_t pbuf_pool_free_sem; |
59 |
#endif |
#endif |
103 |
are no more pbufs in the pool. */ |
are no more pbufs in the pool. */ |
104 |
q->next = NULL; |
q->next = NULL; |
105 |
|
|
106 |
#ifndef SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
107 |
pbuf_pool_alloc_lock = 0; |
pbuf_pool_alloc_lock = 0; |
108 |
pbuf_pool_free_lock = 0; |
pbuf_pool_free_lock = 0; |
109 |
pbuf_pool_free_sem = sys_sem_new(1); |
pbuf_pool_free_sem = sys_sem_new(1); |
126 |
pbuf_pool_alloc_cache = p->next; |
pbuf_pool_alloc_cache = p->next; |
127 |
} |
} |
128 |
} else { |
} else { |
129 |
#ifndef SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
130 |
/* Next, check the actual pbuf pool, but if the pool is locked, we |
/* Next, check the actual pbuf pool, but if the pool is locked, we |
131 |
pretend to be out of buffers and return NULL. */ |
pretend to be out of buffers and return NULL. */ |
132 |
if(pbuf_pool_free_lock) { |
if(pbuf_pool_free_lock) { |
142 |
if(p) { |
if(p) { |
143 |
pbuf_pool = p->next; |
pbuf_pool = p->next; |
144 |
} |
} |
145 |
#ifndef SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
146 |
#ifdef PBUF_STATS |
#ifdef PBUF_STATS |
147 |
} else { |
} else { |
148 |
++lwip_stats.pbuf.alloc_locked; |
++lwip_stats.pbuf.alloc_locked; |
331 |
SYS_ARCH_DECL_PROTECT(old_level); |
SYS_ARCH_DECL_PROTECT(old_level); |
332 |
SYS_ARCH_PROTECT(old_level); |
SYS_ARCH_PROTECT(old_level); |
333 |
|
|
334 |
#ifndef SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
335 |
sys_sem_wait(pbuf_pool_free_sem); |
sys_sem_wait(pbuf_pool_free_sem); |
336 |
#endif /* else SYS_LIGHTWEIGHT_PROT */ |
#endif /* else SYS_LIGHTWEIGHT_PROT */ |
337 |
|
|
338 |
if(pbuf_pool_free_cache != NULL) { |
if(pbuf_pool_free_cache != NULL) { |
339 |
#ifndef SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
340 |
pbuf_pool_free_lock = 1; |
pbuf_pool_free_lock = 1; |
341 |
if(!pbuf_pool_alloc_lock) { |
if(!pbuf_pool_alloc_lock) { |
342 |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
347 |
p->next = pbuf_pool_free_cache; |
p->next = pbuf_pool_free_cache; |
348 |
} |
} |
349 |
pbuf_pool_free_cache = NULL; |
pbuf_pool_free_cache = NULL; |
350 |
#ifndef SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
351 |
#ifdef PBUF_STATS |
#ifdef PBUF_STATS |
352 |
} else { |
} else { |
353 |
++lwip_stats.pbuf.refresh_locked; |
++lwip_stats.pbuf.refresh_locked; |
358 |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
359 |
} |
} |
360 |
SYS_ARCH_UNPROTECT(old_level); |
SYS_ARCH_UNPROTECT(old_level); |
361 |
#ifndef SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
362 |
sys_sem_signal(pbuf_pool_free_sem); |
sys_sem_signal(pbuf_pool_free_sem); |
363 |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
364 |
} |
} |
375 |
DEC_PBUF_STATS; \ |
DEC_PBUF_STATS; \ |
376 |
} while (0) |
} while (0) |
377 |
|
|
378 |
#ifdef SYS_LIGHTWEIGHT_PROT |
#if SYS_LIGHTWEIGHT_PROT |
379 |
#define PBUF_POOL_FREE(p) do { \ |
#define PBUF_POOL_FREE(p) do { \ |
380 |
SYS_ARCH_DECL_PROTECT(old_level); \ |
SYS_ARCH_DECL_PROTECT(old_level); \ |
381 |
SYS_ARCH_PROTECT(old_level); \ |
SYS_ARCH_PROTECT(old_level); \ |