Changed the pbuf_free/mem_free callback functions a little: created extra functions for that

This commit is contained in:
goldsimon 2008-03-28 07:56:47 +00:00
parent 43dd38df0a
commit 05587f5da9
4 changed files with 37 additions and 13 deletions

View File

@ -25,9 +25,8 @@ HISTORY
2008-03-27 Simon Goldschmidt 2008-03-27 Simon Goldschmidt
* mem.c, tcpip.c, tcpip.h, opt.h: fixed bug #21433 (Calling mem_free/pbuf_free * mem.c, tcpip.c, tcpip.h, opt.h: fixed bug #21433 (Calling mem_free/pbuf_free
from interrupt context isn't safe): set LWIP_USE_HEAP_FROM_INTERRUPT to 1 from interrupt context isn't safe): set LWIP_USE_HEAP_FROM_INTERRUPT to 1
in lwipopts.h or use tcpip_callback_nonblocking(pbuf_free_int, p)/ in lwipopts.h or use pbuf_free_callback(p)/mem_free_callback(m) to free pbufs
tcpip_callback_nonblocking(mem_free, m) to free pbufs or heap memory from or heap memory from interrupt context
interrupt context
2008-03-26 Simon Goldschmidt 2008-03-26 Simon Goldschmidt
* tcp_in.c, tcp.c: fixed bug #22249: division by zero could occur if a remote * tcp_in.c, tcp.c: fixed bug #22249: division by zero could occur if a remote

View File

@ -518,17 +518,42 @@ tcpip_init(void (* initfunc)(void *), void *arg)
sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO); sys_thread_new(TCPIP_THREAD_NAME, tcpip_thread, NULL, TCPIP_THREAD_STACKSIZE, TCPIP_THREAD_PRIO);
} }
/** /**
* A simple wrapper function that allows you to free a pbuf using one of the * Simple callback function used with tcpip_callback to free a pbuf
* tcpip_callback functions. * (pbuf_free has a wrong signature for tcpip_callback)
* *
* @param p The pbuf (chain) to be dereferenced. * @param p The pbuf (chain) to be dereferenced.
*/ */
void static void
pbuf_free_int(struct pbuf *p) pub_free_int(void *p)
{ {
pbuf_free(p); struct pbuf *q = p;
pbuf_free(q);
}
/**
* A simple wrapper function that allows you to free a pbuf from interrupt context.
*
* @param p The pbuf (chain) to be dereferenced.
* @return ERR_OK if callback could be enqueued, an err_t if not
*/
err_t
pbuf_free_callback(struct pbuf *p)
{
return tcpip_callback_with_block(pub_free_int, p, 0);
}
/**
* A simple wrapper function that allows you to free heap memory from
* interrupt context.
*
* @param m the heap memory to free
* @return ERR_OK if callback could be enqueued, an err_t if not
*/
err_t
mem_free_callback(void *m)
{
return tcpip_callback_with_block(mem_free, m, 0);
} }
#endif /* !NO_SYS */ #endif /* !NO_SYS */

View File

@ -166,8 +166,8 @@
* *** USE THIS WITH CARE: Setting this to 1 can disable interrupts for a long time! *** * *** USE THIS WITH CARE: Setting this to 1 can disable interrupts for a long time! ***
* *
* If you don't want that, call * If you don't want that, call
* - tcpip_callback_nonblocking(pbuf_free_int, p); * - pbuf_free_callback(p);
* - tcpip_callback_nonblocking(mem_free, m); * - mem_free_callback(m);
*/ */
#ifndef LWIP_USE_HEAP_FROM_INTERRUPT #ifndef LWIP_USE_HEAP_FROM_INTERRUPT
#define LWIP_USE_HEAP_FROM_INTERRUPT 0 #define LWIP_USE_HEAP_FROM_INTERRUPT 0

View File

@ -84,9 +84,9 @@ err_t tcpip_netifapi_lock(struct netifapi_msg *netifapimsg);
err_t tcpip_callback_with_block(void (*f)(void *ctx), void *ctx, u8_t block); err_t tcpip_callback_with_block(void (*f)(void *ctx), void *ctx, u8_t block);
#define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1) #define tcpip_callback(f, ctx) tcpip_callback_with_block(f, ctx, 1)
#define tcpip_callback_nonblocking(f, ctx) tcpip_callback_with_block(f, ctx, 0)
void pbuf_free_int(struct pbuf *p); err_t pbuf_free_callback(struct pbuf *p);
err_t mem_free_callback(void *m);
err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg); err_t tcpip_timeout(u32_t msecs, sys_timeout_handler h, void *arg);
#define tcpip_untimeout(h, arg) tcpip_timeout(0xffffffff, h, arg) #define tcpip_untimeout(h, arg) tcpip_timeout(0xffffffff, h, arg)