Provide fix for issue #5835 - Tickers update should be atomic

Synchronise only (and all) the public functions.
pull/5889/head
Przemyslaw Stekiel 2018-01-19 13:16:05 +01:00
parent c59c400093
commit 6d3ba94f98
1 changed files with 14 additions and 2 deletions

View File

@ -110,7 +110,6 @@ static us_timestamp_t convert_timestamp(us_timestamp_t ref, timestamp_t timestam
*/ */
static void update_present_time(const ticker_data_t *const ticker) static void update_present_time(const ticker_data_t *const ticker)
{ {
ticker_event_queue_t *queue = ticker->queue; ticker_event_queue_t *queue = ticker->queue;
uint32_t ticker_time = ticker->interface->read(); uint32_t ticker_time = ticker->interface->read();
if (ticker_time == ticker->queue->tick_last_read) { if (ticker_time == ticker->queue->tick_last_read) {
@ -252,11 +251,16 @@ static void schedule_interrupt(const ticker_data_t *const ticker)
void ticker_set_handler(const ticker_data_t *const ticker, ticker_event_handler handler) void ticker_set_handler(const ticker_data_t *const ticker, ticker_event_handler handler)
{ {
initialize(ticker); initialize(ticker);
core_util_critical_section_enter();
set_handler(ticker, handler); set_handler(ticker, handler);
core_util_critical_section_exit();
} }
void ticker_irq_handler(const ticker_data_t *const ticker) void ticker_irq_handler(const ticker_data_t *const ticker)
{ {
core_util_critical_section_enter();
ticker->interface->clear_interrupt(); ticker->interface->clear_interrupt();
/* Go through all the pending TimerEvents */ /* Go through all the pending TimerEvents */
@ -284,6 +288,8 @@ void ticker_irq_handler(const ticker_data_t *const ticker)
} }
schedule_interrupt(ticker); schedule_interrupt(ticker);
core_util_critical_section_exit();
} }
void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj, timestamp_t timestamp, uint32_t id) void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj, timestamp_t timestamp, uint32_t id)
@ -296,13 +302,14 @@ void ticker_insert_event(const ticker_data_t *const ticker, ticker_event_t *obj,
ticker->queue->present_time, ticker->queue->present_time,
timestamp timestamp
); );
core_util_critical_section_exit();
// defer to ticker_insert_event_us // defer to ticker_insert_event_us
ticker_insert_event_us( ticker_insert_event_us(
ticker, ticker,
obj, absolute_timestamp, id obj, absolute_timestamp, id
); );
core_util_critical_section_exit();
} }
void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *obj, us_timestamp_t timestamp, uint32_t id) void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *obj, us_timestamp_t timestamp, uint32_t id)
@ -343,6 +350,7 @@ void ticker_insert_event_us(const ticker_data_t *const ticker, ticker_event_t *o
schedule_interrupt(ticker); schedule_interrupt(ticker);
core_util_critical_section_exit(); core_util_critical_section_exit();
} }
void ticker_remove_event(const ticker_data_t *const ticker, ticker_event_t *obj) void ticker_remove_event(const ticker_data_t *const ticker, ticker_event_t *obj)
@ -377,7 +385,11 @@ timestamp_t ticker_read(const ticker_data_t *const ticker)
us_timestamp_t ticker_read_us(const ticker_data_t *const ticker) us_timestamp_t ticker_read_us(const ticker_data_t *const ticker)
{ {
initialize(ticker); initialize(ticker);
core_util_critical_section_enter();
update_present_time(ticker); update_present_time(ticker);
core_util_critical_section_exit();
return ticker->queue->present_time; return ticker->queue->present_time;
} }