126 |
SYS_ARCH_DECL_PROTECT(old_level); |
SYS_ARCH_DECL_PROTECT(old_level); |
127 |
SYS_ARCH_PROTECT(old_level); |
SYS_ARCH_PROTECT(old_level); |
128 |
/* First, see if there are pbufs in the cache. */ |
/* First, see if there are pbufs in the cache. */ |
129 |
if(pbuf_pool_alloc_cache) { |
if (pbuf_pool_alloc_cache) { |
130 |
p = pbuf_pool_alloc_cache; |
p = pbuf_pool_alloc_cache; |
131 |
if(p) { |
if (p) { |
132 |
pbuf_pool_alloc_cache = p->next; |
pbuf_pool_alloc_cache = p->next; |
133 |
} |
} |
134 |
} else { |
} else { |
135 |
#if !SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
136 |
/* 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 |
137 |
pretend to be out of buffers and return NULL. */ |
pretend to be out of buffers and return NULL. */ |
138 |
if(pbuf_pool_free_lock) { |
if (pbuf_pool_free_lock) { |
139 |
#ifdef PBUF_STATS |
#ifdef PBUF_STATS |
140 |
++lwip_stats.pbuf.alloc_locked; |
++lwip_stats.pbuf.alloc_locked; |
141 |
#endif /* PBUF_STATS */ |
#endif /* PBUF_STATS */ |
142 |
return NULL; |
return NULL; |
143 |
} |
} |
144 |
pbuf_pool_alloc_lock = 1; |
pbuf_pool_alloc_lock = 1; |
145 |
if(!pbuf_pool_free_lock) { |
if (!pbuf_pool_free_lock) { |
146 |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
147 |
p = pbuf_pool; |
p = pbuf_pool; |
148 |
if(p) { |
if (p) { |
149 |
pbuf_pool = p->next; |
pbuf_pool = p->next; |
150 |
} |
} |
151 |
#if !SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
159 |
} |
} |
160 |
|
|
161 |
#ifdef PBUF_STATS |
#ifdef PBUF_STATS |
162 |
if(p != NULL) { |
if (p != NULL) { |
163 |
++lwip_stats.pbuf.used; |
++lwip_stats.pbuf.used; |
164 |
if(lwip_stats.pbuf.used > lwip_stats.pbuf.max) { |
if (lwip_stats.pbuf.used > lwip_stats.pbuf.max) { |
165 |
lwip_stats.pbuf.max = lwip_stats.pbuf.used; |
lwip_stats.pbuf.max = lwip_stats.pbuf.used; |
166 |
} |
} |
167 |
} |
} |
187 |
} |
} |
188 |
#endif /* PBUF_STATS */ |
#endif /* PBUF_STATS */ |
189 |
|
|
190 |
if(pbuf_pool_alloc_cache == NULL) { |
if (pbuf_pool_alloc_cache == NULL) { |
191 |
pbuf_pool_alloc_cache = p; |
pbuf_pool_alloc_cache = p; |
192 |
} else { |
} else { |
193 |
for(q = pbuf_pool_alloc_cache; q->next != NULL; q = q->next); |
for(q = pbuf_pool_alloc_cache; q->next != NULL; q = q->next); |
284 |
/* remaining length to be allocated */ |
/* remaining length to be allocated */ |
285 |
rem_len = length - p->len; |
rem_len = length - p->len; |
286 |
/* any remaining pbufs to be allocated? */ |
/* any remaining pbufs to be allocated? */ |
287 |
while(rem_len > 0) { |
while (rem_len > 0) { |
288 |
q = pbuf_pool_alloc(); |
q = pbuf_pool_alloc(); |
289 |
if (q == NULL) { |
if (q == NULL) { |
290 |
DEBUGF(PBUF_DEBUG | 2, ("pbuf_alloc: Out of pbufs in pool.\n")); |
DEBUGF(PBUF_DEBUG | 2, ("pbuf_alloc: Out of pbufs in pool.\n")); |
370 |
sys_sem_wait(pbuf_pool_free_sem); |
sys_sem_wait(pbuf_pool_free_sem); |
371 |
#endif /* else SYS_LIGHTWEIGHT_PROT */ |
#endif /* else SYS_LIGHTWEIGHT_PROT */ |
372 |
|
|
373 |
if(pbuf_pool_free_cache != NULL) { |
if (pbuf_pool_free_cache != NULL) { |
374 |
#if !SYS_LIGHTWEIGHT_PROT |
#if !SYS_LIGHTWEIGHT_PROT |
375 |
pbuf_pool_free_lock = 1; |
pbuf_pool_free_lock = 1; |
376 |
if(!pbuf_pool_alloc_lock) { |
if (!pbuf_pool_alloc_lock) { |
377 |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
378 |
if(pbuf_pool == NULL) { |
if (pbuf_pool == NULL) { |
379 |
pbuf_pool = pbuf_pool_free_cache; |
pbuf_pool = pbuf_pool_free_cache; |
380 |
} else { |
} else { |
381 |
for(p = pbuf_pool; p->next != NULL; p = p->next); |
for(p = pbuf_pool; p->next != NULL; p = p->next); |
416 |
SYS_ARCH_PROTECT(old_level); \ |
SYS_ARCH_PROTECT(old_level); \ |
417 |
PBUF_POOL_FAST_FREE(p); \ |
PBUF_POOL_FAST_FREE(p); \ |
418 |
SYS_ARCH_UNPROTECT(old_level); \ |
SYS_ARCH_UNPROTECT(old_level); \ |
419 |
} while(0) |
} while (0) |
420 |
#else /* SYS_LIGHTWEIGHT_PROT */ |
#else /* SYS_LIGHTWEIGHT_PROT */ |
421 |
#define PBUF_POOL_FREE(p) do { \ |
#define PBUF_POOL_FREE(p) do { \ |
422 |
sys_sem_wait(pbuf_pool_free_sem); \ |
sys_sem_wait(pbuf_pool_free_sem); \ |
423 |
PBUF_POOL_FAST_FREE(p); \ |
PBUF_POOL_FAST_FREE(p); \ |
424 |
sys_sem_signal(pbuf_pool_free_sem); \ |
sys_sem_signal(pbuf_pool_free_sem); \ |
425 |
} while(0) |
} while (0) |
426 |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
#endif /* SYS_LIGHTWEIGHT_PROT */ |
427 |
|
|
428 |
/** |
/** |