summaryrefslogtreecommitdiffstats
path: root/firmware/export
diff options
context:
space:
mode:
authorWilliam Wilgus <me.theuser@yahoo.com>2019-10-09 17:22:48 -0500
committerWilliam Wilgus <me.theuser@yahoo.com>2019-10-17 21:19:00 +0200
commit1da2708a7c48c144605d84da94d0184209713683 (patch)
tree976a29826def7be4cc2bd24141064ed2cd6209ce /firmware/export
parent3d6d90382ea368135544ebae875de99df73986ee (diff)
downloadrockbox-1da2708a7c48c144605d84da94d0184209713683.tar.gz
rockbox-1da2708a7c48c144605d84da94d0184209713683.tar.bz2
rockbox-1da2708a7c48c144605d84da94d0184209713683.zip
Fix timer Agptek Rocker (other hosted players)
on timer_unregister callbacks are not removed It seems (at least on the Rocker) timers continue to fire (for a bit??) Now we store the registered callback in the sigev structure and check that the callback matches the one registered when the timer is created. This should stop the possible case of a new timer getting spurious callbacks We also now NULL the callbacks on un-register which should stop the segfaults Added some notes to timer.c and timer.h Change-Id: Ia155c3a4e4af89f474d55ed845560ccc1fab85aa
Diffstat (limited to 'firmware/export')
-rw-r--r--firmware/export/timer.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/firmware/export/timer.h b/firmware/export/timer.h
index b12ec55881..92b26db216 100644
--- a/firmware/export/timer.h
+++ b/firmware/export/timer.h
@@ -30,6 +30,7 @@
#define TIMER_FREQ 1000000
#endif
+/* NOTE: if unreg cb is defined you are in charge of calling timer_unregister() */
bool timer_register(int reg_prio, void (*unregister_callback)(void),
long cycles, void (*timer_callback)(void)
IF_COP(,int core));
@@ -37,6 +38,10 @@ bool timer_set_period(long cycles);
#ifdef CPU_COLDFIRE
void timers_adjust_prescale(int multiplier, bool enable_irq);
#endif
+
+/* NOTE: unregister callbacks are not called by timer_unregister()
+* the unregister_callback only gets called when your timer gets
+* overwritten by a lower priority timer using timer_register() */
void timer_unregister(void);
/* target-specific interface */