mirror of https://github.com/ARMmbed/mbed-os.git
[BUGFIX] LWIP system mailbox overflow fix
parent
7b0a3dcebd
commit
feb6a46619
|
|
@ -116,6 +116,9 @@ u32_t sys_now(void) {
|
|||
/* CMSIS-RTOS implementation of the lwip operating system abstraction */
|
||||
#include "arch/sys_arch.h"
|
||||
|
||||
/* modulus subtract: (a - b) mod m, where a, b belongs to mod m ring */
|
||||
#define SUB_MOD(a, b, m) ((a) >= (b) ? (a) - (b) : (m) - (b) + (a))
|
||||
|
||||
/*---------------------------------------------------------------------------*
|
||||
* Routine: sys_mbox_new
|
||||
*---------------------------------------------------------------------------*
|
||||
|
|
@ -174,11 +177,11 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) {
|
|||
|
||||
int state = osKernelLock();
|
||||
|
||||
mbox->queue[mbox->post_idx % MB_SIZE] = msg;
|
||||
mbox->post_idx += 1;
|
||||
mbox->queue[mbox->post_idx] = msg;
|
||||
mbox->post_idx = (mbox->post_idx + 1) % MB_SIZE;
|
||||
|
||||
osEventFlagsSet(mbox->id, SYS_MBOX_FETCH_EVENT);
|
||||
if (mbox->post_idx - mbox->fetch_idx == MB_SIZE-1)
|
||||
if (SUB_MOD(mbox->post_idx, mbox->fetch_idx, MB_SIZE) >= MB_SIZE-1)
|
||||
osEventFlagsClear(mbox->id, SYS_MBOX_POST_EVENT);
|
||||
|
||||
osKernelRestoreLock(state);
|
||||
|
|
@ -207,11 +210,11 @@ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) {
|
|||
|
||||
int state = osKernelLock();
|
||||
|
||||
mbox->queue[mbox->post_idx % MB_SIZE] = msg;
|
||||
mbox->post_idx += 1;
|
||||
mbox->queue[mbox->post_idx] = msg;
|
||||
mbox->post_idx = (mbox->post_idx + 1) % MB_SIZE;
|
||||
|
||||
osEventFlagsSet(mbox->id, SYS_MBOX_FETCH_EVENT);
|
||||
if (mbox->post_idx - mbox->fetch_idx == MB_SIZE-1)
|
||||
if (SUB_MOD(mbox->post_idx, mbox->fetch_idx, MB_SIZE) >= MB_SIZE-1)
|
||||
osEventFlagsClear(mbox->id, SYS_MBOX_POST_EVENT);
|
||||
|
||||
osKernelRestoreLock(state);
|
||||
|
|
@ -261,8 +264,8 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {
|
|||
int state = osKernelLock();
|
||||
|
||||
if (msg)
|
||||
*msg = mbox->queue[mbox->fetch_idx % MB_SIZE];
|
||||
mbox->fetch_idx += 1;
|
||||
*msg = mbox->queue[mbox->fetch_idx];
|
||||
mbox->fetch_idx = (mbox->fetch_idx + 1) % MB_SIZE;
|
||||
|
||||
osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT);
|
||||
if (mbox->post_idx == mbox->fetch_idx)
|
||||
|
|
@ -297,8 +300,8 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) {
|
|||
int state = osKernelLock();
|
||||
|
||||
if (msg)
|
||||
*msg = mbox->queue[mbox->fetch_idx % MB_SIZE];
|
||||
mbox->fetch_idx += 1;
|
||||
*msg = mbox->queue[mbox->fetch_idx];
|
||||
mbox->fetch_idx = (mbox->fetch_idx + 1) % MB_SIZE;
|
||||
|
||||
osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT);
|
||||
if (mbox->post_idx == mbox->fetch_idx)
|
||||
|
|
|
|||
Loading…
Reference in New Issue