@@ -775,12 +775,16 @@ class EventQueue : private mbed::NonCopyable<EventQueue> {
775775 {
776776 void *p = equeue_alloc (&_equeue, sizeof (F));
777777 if (!p) {
778+ queue_full (QUEUE_FULL_CALL, sizeof (F));
778779 return 0 ;
779780 }
780781
781782 F *e = new (p) F (std::move (f));
782783 equeue_event_dtor (e, &EventQueue::function_dtor<F>);
783- return equeue_post (&_equeue, &EventQueue::function_call<F>, e);
784+ int id = equeue_post (&_equeue, &EventQueue::function_call<F>, e);
785+ if (!id)
786+ queue_full (QUEUE_FULL_CALL, sizeof (F));
787+ return id;
784788 }
785789
786790
@@ -850,13 +854,17 @@ class EventQueue : private mbed::NonCopyable<EventQueue> {
850854 {
851855 void *p = equeue_alloc (&_equeue, sizeof (F));
852856 if (!p) {
857+ queue_full (QUEUE_FULL_CALL_IN, sizeof (F));
853858 return 0 ;
854859 }
855860
856861 F *e = new (p) F (std::move (f));
857862 equeue_event_delay (e, ms.count ());
858863 equeue_event_dtor (e, &EventQueue::function_dtor<F>);
859- return equeue_post (&_equeue, &EventQueue::function_call<F>, e);
864+ int id = equeue_post (&_equeue, &EventQueue::function_call<F>, e);
865+ if (!id)
866+ queue_full (QUEUE_FULL_CALL_IN, sizeof (F));
867+ return id;
860868 }
861869
862870 /* * Calls an event on the queue after a specified delay
@@ -1003,14 +1011,18 @@ class EventQueue : private mbed::NonCopyable<EventQueue> {
10031011 {
10041012 void *p = equeue_alloc (&_equeue, sizeof (F));
10051013 if (!p) {
1014+ queue_full (QUEUE_FULL_CALL_EVERY, sizeof (F));
10061015 return 0 ;
10071016 }
10081017
10091018 F *e = new (p) F (std::move (f));
10101019 equeue_event_delay (e, ms.count ());
10111020 equeue_event_period (e, ms.count ());
10121021 equeue_event_dtor (e, &EventQueue::function_dtor<F>);
1013- return equeue_post (&_equeue, &EventQueue::function_call<F>, e);
1022+ int id = equeue_post (&_equeue, &EventQueue::function_call<F>, e);
1023+ if (!id)
1024+ queue_full (QUEUE_FULL_CALL_EVERY, sizeof (F));
1025+ return id;
10141026 }
10151027
10161028 /* * Calls an event on the queue periodically
@@ -1398,6 +1410,18 @@ class EventQueue : private mbed::NonCopyable<EventQueue> {
13981410#endif
13991411
14001412protected:
1413+ enum queue_full_call_type {
1414+ QUEUE_FULL_CALL,
1415+ QUEUE_FULL_CALL_IN,
1416+ QUEUE_FULL_CALL_EVERY,
1417+ };
1418+
1419+ /* * Error callback. Called when task is rejected because queue is full */
1420+ virtual void queue_full (queue_full_call_type call_type, size_t function_size) const
1421+ {
1422+ // Can be overridden in subclass
1423+ }
1424+
14011425#if !defined(DOXYGEN_ONLY)
14021426 template <typename F>
14031427 friend class Event ;
0 commit comments