@@ -116,6 +116,9 @@ u32_t sys_now(void) {
116116/* CMSIS-RTOS implementation of the lwip operating system abstraction */
117117#include "arch/sys_arch.h"
118118
119+ /* modulus subtract: (a - b) mod m, where a, b belongs to mod m ring */
120+ #define SUB_MOD (a , b , m ) ((a) >= (b) ? (a) - (b) : (m) - (b) + (a))
121+
119122/*---------------------------------------------------------------------------*
120123 * Routine: sys_mbox_new
121124 *---------------------------------------------------------------------------*
@@ -174,11 +177,11 @@ void sys_mbox_post(sys_mbox_t *mbox, void *msg) {
174177
175178 int state = osKernelLock ();
176179
177- mbox -> queue [mbox -> post_idx % MB_SIZE ] = msg ;
178- mbox -> post_idx += 1 ;
180+ mbox -> queue [mbox -> post_idx ] = msg ;
181+ mbox -> post_idx = ( mbox -> post_idx + 1 ) % MB_SIZE ;
179182
180183 osEventFlagsSet (mbox -> id , SYS_MBOX_FETCH_EVENT );
181- if (mbox -> post_idx - mbox -> fetch_idx = = MB_SIZE - 1 )
184+ if (SUB_MOD ( mbox -> post_idx , mbox -> fetch_idx , MB_SIZE ) > = MB_SIZE - 1 )
182185 osEventFlagsClear (mbox -> id , SYS_MBOX_POST_EVENT );
183186
184187 osKernelRestoreLock (state );
@@ -207,11 +210,11 @@ err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) {
207210
208211 int state = osKernelLock ();
209212
210- mbox -> queue [mbox -> post_idx % MB_SIZE ] = msg ;
211- mbox -> post_idx += 1 ;
213+ mbox -> queue [mbox -> post_idx ] = msg ;
214+ mbox -> post_idx = ( mbox -> post_idx + 1 ) % MB_SIZE ;
212215
213216 osEventFlagsSet (mbox -> id , SYS_MBOX_FETCH_EVENT );
214- if (mbox -> post_idx - mbox -> fetch_idx = = MB_SIZE - 1 )
217+ if (SUB_MOD ( mbox -> post_idx , mbox -> fetch_idx , MB_SIZE ) > = MB_SIZE - 1 )
215218 osEventFlagsClear (mbox -> id , SYS_MBOX_POST_EVENT );
216219
217220 osKernelRestoreLock (state );
@@ -261,8 +264,8 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {
261264 int state = osKernelLock ();
262265
263266 if (msg )
264- * msg = mbox -> queue [mbox -> fetch_idx % MB_SIZE ];
265- mbox -> fetch_idx += 1 ;
267+ * msg = mbox -> queue [mbox -> fetch_idx ];
268+ mbox -> fetch_idx = ( mbox -> fetch_idx + 1 ) % MB_SIZE ;
266269
267270 osEventFlagsSet (mbox -> id , SYS_MBOX_POST_EVENT );
268271 if (mbox -> post_idx == mbox -> fetch_idx )
@@ -297,8 +300,8 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) {
297300 int state = osKernelLock ();
298301
299302 if (msg )
300- * msg = mbox -> queue [mbox -> fetch_idx % MB_SIZE ];
301- mbox -> fetch_idx += 1 ;
303+ * msg = mbox -> queue [mbox -> fetch_idx ];
304+ mbox -> fetch_idx = ( mbox -> fetch_idx + 1 ) % MB_SIZE ;
302305
303306 osEventFlagsSet (mbox -> id , SYS_MBOX_POST_EVENT );
304307 if (mbox -> post_idx == mbox -> fetch_idx )
0 commit comments