3636 * 2019-09-16 tyx add send wait support for message queue
3737 * 2020-07-29 Meco Man fix thread->event_set/event_info when received an
3838 * event without pending
39- * 2020-10-11 Meco Man add semaphore values' overflow-check code
40- * 2020-10-21 Meco Man add mutex values' overflow-check code
39+ * 2020-10-11 Meco Man add value overflow-check code
4140 */
4241
4342#include <rtthread.h>
@@ -724,7 +723,15 @@ rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time)
724723 /* set mutex owner and original priority */
725724 mutex -> owner = thread ;
726725 mutex -> original_priority = thread -> current_priority ;
727- mutex -> hold ++ ;
726+ if (mutex -> hold < 255u )
727+ {
728+ mutex -> hold ++ ;
729+ }
730+ else
731+ {
732+ rt_hw_interrupt_enable (temp ); /* enable interrupt */
733+ return - RT_EFULL ; /* value overflowed */
734+ }
728735 }
729736 else
730737 {
@@ -881,7 +888,15 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
881888 /* set new owner and priority */
882889 mutex -> owner = thread ;
883890 mutex -> original_priority = thread -> current_priority ;
884- mutex -> hold ++ ;
891+ if (mutex -> hold < 255u )
892+ {
893+ mutex -> hold ++ ;
894+ }
895+ else
896+ {
897+ rt_hw_interrupt_enable (temp ); /* enable interrupt */
898+ return - RT_EFULL ; /* value overflowed */
899+ }
885900
886901 /* resume thread */
887902 rt_ipc_list_resume (& (mutex -> parent .suspend_thread ));
@@ -890,9 +905,17 @@ rt_err_t rt_mutex_release(rt_mutex_t mutex)
890905 }
891906 else
892907 {
893- /* increase value */
894- mutex -> value ++ ;
895-
908+ if (mutex -> value < 65535u )
909+ {
910+ /* increase value */
911+ mutex -> value ++ ;
912+ }
913+ else
914+ {
915+ rt_hw_interrupt_enable (temp ); /* enable interrupt */
916+ return - RT_EFULL ; /* value overflowed */
917+ }
918+
896919 /* clear owner */
897920 mutex -> owner = RT_NULL ;
898921 mutex -> original_priority = 0xff ;
@@ -1583,9 +1606,18 @@ rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
15831606 ++ mb -> in_offset ;
15841607 if (mb -> in_offset >= mb -> size )
15851608 mb -> in_offset = 0 ;
1586- /* increase message entry */
1587- mb -> entry ++ ;
1588-
1609+
1610+ if (mb -> entry < 65535u )
1611+ {
1612+ /* increase message entry */
1613+ mb -> entry ++ ;
1614+ }
1615+ else
1616+ {
1617+ rt_hw_interrupt_enable (temp ); /* enable interrupt */
1618+ return - RT_EFULL ; /* value overflowed */
1619+ }
1620+
15891621 /* resume suspended thread */
15901622 if (!rt_list_isempty (& mb -> parent .suspend_thread ))
15911623 {
@@ -2147,8 +2179,16 @@ rt_err_t rt_mq_send_wait(rt_mq_t mq,
21472179 if (mq -> msg_queue_head == RT_NULL )
21482180 mq -> msg_queue_head = msg ;
21492181
2150- /* increase message entry */
2151- mq -> entry ++ ;
2182+ if (mq -> entry < 65535u )
2183+ {
2184+ /* increase message entry */
2185+ mq -> entry ++ ;
2186+ }
2187+ else
2188+ {
2189+ rt_hw_interrupt_enable (temp ); /* enable interrupt */
2190+ return - RT_EFULL ; /* value overflowed */
2191+ }
21522192
21532193 /* resume suspended thread */
21542194 if (!rt_list_isempty (& mq -> parent .suspend_thread ))
@@ -2247,9 +2287,17 @@ rt_err_t rt_mq_urgent(rt_mq_t mq, const void *buffer, rt_size_t size)
22472287 if (mq -> msg_queue_tail == RT_NULL )
22482288 mq -> msg_queue_tail = msg ;
22492289
2250- /* increase message entry */
2251- mq -> entry ++ ;
2252-
2290+ if (mq -> entry < 65535u )
2291+ {
2292+ /* increase message entry */
2293+ mq -> entry ++ ;
2294+ }
2295+ else
2296+ {
2297+ rt_hw_interrupt_enable (temp ); /* enable interrupt */
2298+ return - RT_EFULL ; /* value overflowed */
2299+ }
2300+
22532301 /* resume suspended thread */
22542302 if (!rt_list_isempty (& mq -> parent .suspend_thread ))
22552303 {
0 commit comments