rusefi/firmware/controllers/system/timer/event_queue.h

78 lines
2.7 KiB
C
Raw Normal View History

2015-07-10 06:01:56 -07:00
/**
* @file event_queue.h
*
* @date Apr 17, 2014
2020-01-13 18:57:43 -08:00
* @author Andrey Belomutskiy, (c) 2012-2020
2015-07-10 06:01:56 -07:00
*/
#include "scheduler.h"
#include "utlist.h"
#include <rusefi/expected.h>
2015-07-10 06:01:56 -07:00
2020-01-20 22:40:11 -08:00
#pragma once
2015-07-10 06:01:56 -07:00
#define QUEUE_LENGTH_LIMIT 1000
// templates do not accept field names so we use a macro here
#define assertNotInListMethodBody(head, element, field) \
/* this code is just to validate state, no functional load*/ \
decltype(head) current; \
int counter = 0; \
LL_FOREACH2(head, current, field) { \
if (++counter > QUEUE_LENGTH_LIMIT) { \
firmwareError(ObdCode::CUSTOM_ERR_LOOPED_QUEUE, "Looped queue?"); \
return false; \
} \
if (current == element) { \
/** \
* for example, this might happen in case of sudden RPM change if event \
* was not scheduled by angle but was scheduled by time. In case of scheduling \
* by time with slow RPM the whole next fast revolution might be within the wait period \
*/ \
warning(ObdCode::CUSTOM_RE_ADDING_INTO_EXECUTION_QUEUE, "re-adding element into event_queue"); \
return true; \
} \
} \
2015-07-10 06:01:56 -07:00
return false;
2015-07-10 06:01:56 -07:00
2016-01-25 20:01:36 -08:00
/**
* Execution sorted linked list
*/
2015-07-10 06:01:56 -07:00
class EventQueue {
public:
2024-01-07 13:04:36 -08:00
// See comment in EventQueue::executeAll for info about lateDelay - it sets the
// time gap between events for which we will wait instead of rescheduling the next
// event in a group of events near one another.
explicit EventQueue(efitick_t lateDelay = 0);
2015-07-10 06:01:56 -07:00
/**
2016-01-25 20:01:36 -08:00
* O(size) - linear search in sorted linked list
2015-07-10 06:01:56 -07:00
*/
bool insertTask(scheduling_s *scheduling, efitick_t timeX, action_s action);
void remove(scheduling_s* scheduling);
2015-07-10 06:01:56 -07:00
int executeAll(efitick_t now);
bool executeOne(efitick_t now);
2015-07-10 06:01:56 -07:00
expected<efitick_t> getNextEventTime(efitick_t nowUs) const;
2015-07-10 06:01:56 -07:00
void clear(void);
int size(void) const;
2019-12-02 21:20:47 -08:00
scheduling_s *getElementAtIndexForUnitText(int index);
2015-07-10 06:01:56 -07:00
scheduling_s * getHead();
scheduling_s* getFreeScheduling();
void tryReturnScheduling(scheduling_s* sched);
2015-07-10 06:01:56 -07:00
private:
void assertListIsSorted() const;
2015-07-10 06:01:56 -07:00
/**
* this list is sorted
*/
2024-01-07 13:04:36 -08:00
scheduling_s *m_head = nullptr;
const efitick_t m_lateDelay;
scheduling_s* m_freelist = nullptr;
scheduling_s m_pool[64];
2015-07-10 06:01:56 -07:00
};