Moved delta insertion code in lists module.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@14364 27425a3e-05d8-49a3-a47f-9c15f0e5edd8
This commit is contained in:
Giovanni Di Sirio 2021-05-11 09:08:33 +00:00
parent dabd48d6cc
commit 8b5c492e9e
2 changed files with 40 additions and 56 deletions

View File

@ -522,6 +522,43 @@ static inline void ch_dlist_insert_before(ch_delta_list_t *dlhp,
dlhp->prev = dlp;
}
/**
* @brief Inserts an element in a delta list.
*
* @param[in] dlhp pointer to the delta list header element
* @param[in] dlep element to be inserted before the header element
* @param[in] delta delta of the element to be inserted
*
* @notapi
*/
static inline void ch_dlist_insert(ch_delta_list_t *dlhp,
ch_delta_list_t *dlep,
sysinterval_t delta) {
ch_delta_list_t *dlp;
/* The delta list is scanned in order to find the correct position for
this element. */
dlp = dlhp->next;
while (dlp->delta < delta) {
/* Debug assert if the element is already in the list.*/
chDbgAssert(dlp != dlep, "element already in list");
delta -= dlp->delta;
dlp = dlp->next;
}
/* The timer is inserted in the delta list.*/
ch_dlist_insert_before(dlp, dlep, delta);
/* Adjusting delta for the following element.*/
dlp->delta -= delta;
/* Special case when the inserted element is in last position in the list,
the value in the header must be restored, just doing it is faster than
checking then doing.*/
dlhp->delta = (sysinterval_t)-1;
}
/**
* @brief Dequeues an element from the delta list.
*

View File

@ -61,39 +61,6 @@ static inline bool is_timer(ch_delta_list_t *dlhp, ch_delta_list_t *dlp) {
return (bool)(dlp != dlhp);
}
#if 0
/**
* @brief Delta list compression.
*
* @param[in] vtlp pointer to the delta list to be compressed
* @param[in] deltanow interval to be compacted starting from "lasttime"
*
* @notapi
*/
static void vt_list_compress(virtual_timers_list_t *vtlp,
sysinterval_t deltanow) {
ch_delta_list_t *dlp = vtlp->dlist.next;
vtlp->lasttime = chTimeAddX(vtlp->lasttime, deltanow);
/* The loop is bounded because the delta list header has the delta field
set to (sysinterval_t)-1 which is larger than all deltas.*/
while (dlp->delta < deltanow) {
deltanow -= dlp->delta;
dlp->delta = (sysinterval_t)0;
dlp = dlp->next;
}
/* Adjusting next timer in the list, if any.*/
if (is_timer(&vtlp->dlist, dlp)) {
chDbgAssert(deltanow <= dlp->delta, "invalid delta");
dlp->delta -= deltanow;
}
}
#endif
#endif
/**
@ -103,7 +70,6 @@ static void vt_enqueue(virtual_timers_list_t *vtlp,
virtual_timer_t *vtp,
systime_t now,
sysinterval_t delay) {
ch_delta_list_t *dlp;
sysinterval_t delta;
#if CH_CFG_ST_TIMEDELTA > 0
@ -148,7 +114,6 @@ static void vt_enqueue(virtual_timers_list_t *vtlp,
delta is shortened to make it fit the numeric range, the timer
will be triggered "deltanow" cycles earlier.*/
if (delta < deltanow) {
// vt_list_compress(vtlp, deltanow);
delta = delay;
}
@ -161,7 +126,8 @@ static void vt_enqueue(virtual_timers_list_t *vtlp,
and next deadline.*/
deadline_delta = delta;
#if CH_CFG_INTERVALS_SIZE > CH_CFG_ST_RESOLUTION
/* The delta could be too large for the physical timer to handle.*/
/* The delta could be too large for the physical timer to handle
this can happen when: sizeof (systime_t) < sizeof (sysinterval_t).*/
if (deadline_delta > (sysinterval_t)TIME_MAX_SYSTIME) {
deadline_delta = (sysinterval_t)TIME_MAX_SYSTIME;
}
@ -176,26 +142,7 @@ static void vt_enqueue(virtual_timers_list_t *vtlp,
delta = delay;
#endif /* CH_CFG_ST_TIMEDELTA == 0 */
/* The delta list is scanned in order to find the correct position for
this timer. */
dlp = vtlp->dlist.next;
while (dlp->delta < delta) {
/* Debug assert if the timer is already in the list.*/
chDbgAssert(dlp != &vtp->dlist, "timer already armed");
delta -= dlp->delta;
dlp = dlp->next;
}
/* The timer is inserted in the delta list.*/
ch_dlist_insert_before(dlp, &vtp->dlist, delta);
/* Calculate new delta for the following entry.*/
dlp->delta -= delta;
/* Special case when the timer is in last position in the list, the
value in the header must be restored.*/
vtlp->dlist.delta = (sysinterval_t)-1;
ch_dlist_insert(&vtlp->dlist, &vtp->dlist, delta);
}
/*===========================================================================*/