Core: Invert schedule queue direction to avoid excess memmove

This commit is contained in:
Jeffrey Pfau 2016-10-31 01:32:15 -07:00
parent ed3a3b2fab
commit fa3d263dd9
1 changed files with 8 additions and 6 deletions

View File

@ -33,7 +33,7 @@ void mTimingSchedule(struct mTiming* timing, struct mTimingEvent* event, int32_t
for (e = 0; e < mTimingEventListSize(&timing->events); ++e) { for (e = 0; e < mTimingEventListSize(&timing->events); ++e) {
struct mTimingEvent* next = *mTimingEventListGetPointer(&timing->events, e); struct mTimingEvent* next = *mTimingEventListGetPointer(&timing->events, e);
int32_t nextWhen = next->when - timing->masterCycles; int32_t nextWhen = next->when - timing->masterCycles;
if (nextWhen > when) { if (nextWhen < when) {
mTimingEventListUnshift(&timing->events, e, 1); mTimingEventListUnshift(&timing->events, e, 1);
*mTimingEventListGetPointer(&timing->events, e) = event; *mTimingEventListGetPointer(&timing->events, e) = event;
return; return;
@ -56,22 +56,24 @@ void mTimingDeschedule(struct mTiming* timing, struct mTimingEvent* event) {
int32_t mTimingTick(struct mTiming* timing, int32_t cycles) { int32_t mTimingTick(struct mTiming* timing, int32_t cycles) {
timing->masterCycles += cycles; timing->masterCycles += cycles;
uint32_t masterCycles = timing->masterCycles; uint32_t masterCycles = timing->masterCycles;
while (mTimingEventListSize(&timing->events)) { size_t listSize;
struct mTimingEvent* next = *mTimingEventListGetPointer(&timing->events, 0); while ((listSize = mTimingEventListSize(&timing->events))) {
struct mTimingEvent* next = *mTimingEventListGetPointer(&timing->events, listSize - 1);
int32_t nextWhen = next->when - masterCycles; int32_t nextWhen = next->when - masterCycles;
if (nextWhen > 0) { if (nextWhen > 0) {
return nextWhen; return nextWhen;
} }
mTimingEventListShift(&timing->events, 0, 1); mTimingEventListResize(&timing->events, -1);
next->callback(timing, next->context, -nextWhen); next->callback(timing, next->context, -nextWhen);
} }
return *timing->nextEvent; return *timing->nextEvent;
} }
int32_t mTimingNextEvent(struct mTiming* timing) { int32_t mTimingNextEvent(struct mTiming* timing) {
if (!mTimingEventListSize(&timing->events)) { size_t listSize;
if (!(listSize = mTimingEventListSize(&timing->events))) {
return INT_MAX; return INT_MAX;
} }
struct mTimingEvent* next = *mTimingEventListGetPointer(&timing->events, 0); struct mTimingEvent* next = *mTimingEventListGetPointer(&timing->events, listSize - 1);
return next->when - timing->masterCycles; return next->when - timing->masterCycles;
} }