On pon, 2016-10-10 at 08:58 +0200, Dirk Ziegelmeier wrote: > You can't. All you can do in such cases is count how many > mboxes/semaphores/threads etc. you need and allocate their storage > statically. A call to sys_mbox_new() just returns "the next one" from > the static allocated ones. This is what we do at work in constrained > devices.
? Even in lwIP 1.4.1 the prototype for these functions was: err_t sys_sem_new(sys_sem_t *sem, u8_t count); err_t sys_mbox_new(sys_mbox_t *mbox, int size); These functions clearly don't return anything else other than error and the buffer for semaphore/mailbox has to be provided by user. These can work the way you describe but only if you define sys_sem_t and sys_mbox_t to be pointers, which is not the best approach. If you define them as storage with the same size and alignment as the "real" semaphore/mailbox, then these functions can just construct the object into the storage, with no memory allocation (except the storage for mailbox contents). For example this is what I have in lwIP port to my RTOS. in sys_arch.h: ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- ... /// struct with same size and alignment as distortos::Semaphore struct distortosSemaphore { /// implementation details const void* const implementation[4]; }; /// lwIP semaphore typedef struct distortosSemaphore sys_sem_t; ... ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- Then in some source file: ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- ... void sys_sem_free(sys_sem_t* const semaphore) { reinterpret_cast<distortos::Semaphore*>(semaphore)->~Semaphore(); } err_t sys_sem_new(sys_sem_t* const semaphore, const u8_t count) { new (semaphore) distortos::Semaphore {count}; return ERR_OK; } ... ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- There is no dynamic allocation here and this works perfectly fine... Regards, FCh _______________________________________________ lwip-users mailing list lwip-users@nongnu.org https://lists.nongnu.org/mailman/listinfo/lwip-users