@@ -7,7 +7,7 @@ typedef void (*voidFuncPtr)(void);
77typedef void (*voidFuncPtrArg)(void *);
88
99// Helper functions for Functional interrupt routines
10- extern " C" void __attachInterruptFunctionalArg (uint8_t pin, voidFuncPtr userFunc, void *fp, int mode, bool functional);
10+ extern " C" bool __attachInterruptFunctionalArg (uint8_t pin, voidFuncPtr userFunc, void *fp, int mode, bool functional);
1111
1212
1313void ICACHE_RAM_ATTR interruptFunctional (void * arg)
@@ -34,32 +34,52 @@ extern "C"
3434 }
3535}
3636
37- void attachInterrupt (uint8_t pin, std::function<void (void )> intRoutine, int mode)
37+ bool attachInterrupt (uint8_t pin, std::function<void (void )> intRoutine, int mode)
3838{
3939 // use the local interrupt routine which takes the ArgStructure as argument
4040
4141 InterruptInfo* ii = nullptr ;
4242
43- FunctionInfo* fi = new FunctionInfo;
43+ FunctionInfo* fi = new (std::nothrow) FunctionInfo;
44+ if (fi == nullptr )
45+ return false ;
4446 fi->reqFunction = intRoutine;
4547
46- ArgStructure* as = new ArgStructure;
48+ ArgStructure* as = new (std::nothrow) ArgStructure;
49+ if (as == nullptr )
50+ {
51+ delete (fi);
52+ return false ;
53+ }
4754 as->interruptInfo = ii;
4855 as->functionInfo = fi;
4956
50- __attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true );
57+ return __attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true );
5158}
5259
53- void attachScheduledInterrupt (uint8_t pin, std::function<void (InterruptInfo)> scheduledIntRoutine, int mode)
60+ bool attachScheduledInterrupt (uint8_t pin, std::function<void (InterruptInfo)> scheduledIntRoutine, int mode)
5461{
55- InterruptInfo* ii = new InterruptInfo;
62+ InterruptInfo* ii = new (std::nothrow) InterruptInfo;
63+ if (ii == nullptr )
64+ return false ;
5665
5766 FunctionInfo* fi = new FunctionInfo;
67+ if (fi == nullptr )
68+ {
69+ delete ii;
70+ return false ;
71+ }
5872 fi->reqScheduledFunction = scheduledIntRoutine;
5973
60- ArgStructure* as = new ArgStructure;
74+ ArgStructure* as = new (std::nothrow) ArgStructure;
75+ if (as == nullptr )
76+ {
77+ delete ii;
78+ delete fi;
79+ return false ;
80+ }
6181 as->interruptInfo = ii;
6282 as->functionInfo = fi;
6383
64- __attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true );
84+ return __attachInterruptFunctionalArg (pin, (voidFuncPtr)interruptFunctional, as, mode, true );
6585}
0 commit comments