diff --git a/src/events.c b/src/events.c index 2fc1cd79..aff8576e 100644 --- a/src/events.c +++ b/src/events.c @@ -132,7 +132,7 @@ static bool events_invoke_handlers(SDL_Event *event, ListContainer *h_list, Even // merge the array into the list copy, respecting priority for(EventHandler *h = h_array; h->proc; ++h) { - list_insert_at_priority( + list_insert_at_priority_tail( &merged_list, list_wrap_container(h), real_priority(h->priority), @@ -177,7 +177,7 @@ void events_register_handler(EventHandler *handler) { } assert(handler_alloc->priority > EPRIO_DEFAULT); - list_insert_at_priority( + list_insert_at_priority_tail( &global_handlers, list_wrap_container(handler_alloc), handler_alloc->priority, diff --git a/src/item.c b/src/item.c index db952cdf..3efac6fb 100644 --- a/src/item.c +++ b/src/item.c @@ -43,7 +43,7 @@ Item* create_item(complex pos, complex v, ItemType type) { } Item *i = (Item*)objpool_acquire(stage_object_pools.items); - list_insert_at_priority(&global.items, i, type, item_prio); + list_insert_at_priority_tail(&global.items, i, type, item_prio); i->pos = pos; i->pos0 = pos; diff --git a/src/list.c b/src/list.c index 90070ed3..8bf87506 100644 --- a/src/list.c +++ b/src/list.c @@ -69,7 +69,8 @@ List* list_append(List **dest, List *elem) { return list_insert(&end, elem); } -List* list_insert_at_priority(List **list_head, List *elem, int prio, ListPriorityFunc prio_func) { +__attribute__((hot)) +static List* list_insert_at_priority(List **list_head, List *elem, int prio, ListPriorityFunc prio_func, bool head) { assert(list_head != NULL); assert(elem != NULL); assert(prio_func != NULL); @@ -84,9 +85,16 @@ List* list_insert_at_priority(List **list_head, List *elem, int prio, ListPriori int dest_prio = prio_func(dest); int candidate_prio = dest_prio; - for(List *e = dest->next; e && (candidate_prio = prio_func(e)) <= prio; e = e->next) { - dest = e; - dest_prio = candidate_prio; + if(head) { + for(List *e = dest->next; e && (candidate_prio = prio_func(e)) < prio; e = e->next) { + dest = e; + dest_prio = candidate_prio; + } + } else { + for(List *e = dest->next; e && (candidate_prio = prio_func(e)) <= prio; e = e->next) { + dest = e; + dest_prio = candidate_prio; + } } if(dest == *list_head && dest_prio > prio) { @@ -113,6 +121,14 @@ List* list_insert_at_priority(List **list_head, List *elem, int prio, ListPriori return elem; } +List* list_insert_at_priority_head(List **dest, List *elem, int prio, ListPriorityFunc prio_func){ + return list_insert_at_priority(dest, elem, prio, prio_func, true); +} + +List* list_insert_at_priority_tail(List **dest, List *elem, int prio, ListPriorityFunc prio_func){ + return list_insert_at_priority(dest, elem, prio, prio_func, false); +} + List* list_unlink(List **dest, List *elem) { if(elem->prev != NULL) { elem->prev->next = elem->next; diff --git a/src/list.h b/src/list.h index cb10d5ef..9993fa29 100644 --- a/src/list.h +++ b/src/list.h @@ -43,7 +43,8 @@ typedef List* (*ListInsertionRule)(List **dest, List *elem); List* list_insert(List **dest, List *elem); List* list_push(List **dest, List *elem); List* list_append(List **dest, List *elem); -List* list_insert_at_priority(List **dest, List *elem, int prio, ListPriorityFunc prio_func) __attribute__((hot)); +List* list_insert_at_priority_head(List **dest, List *elem, int prio, ListPriorityFunc prio_func) __attribute__((hot)); +List* list_insert_at_priority_tail(List **dest, List *elem, int prio, ListPriorityFunc prio_func) __attribute__((hot)); List* list_pop(List **dest); List* list_unlink(List **dest, List *elem); void* list_foreach(List **dest, ListForeachCallback callback, void *arg); @@ -81,8 +82,11 @@ ListContainer* list_wrap_container(void *data); #define list_append(dest,elem) \ (LIST_CAST_RETURN(elem) list_append(LIST_CAST(dest, **), LIST_CAST(elem, *))) -#define list_insert_at_priority(dest,elem,prio,prio_func) \ - (LIST_CAST_RETURN(elem) list_insert_at_priority(LIST_CAST(dest, **), LIST_CAST(elem, *), prio, prio_func)) +#define list_insert_at_priority_head(dest,elem,prio,prio_func) \ + (LIST_CAST_RETURN(elem) list_insert_at_priority_head(LIST_CAST(dest, **), LIST_CAST(elem, *), prio, prio_func)) + +#define list_insert_at_priority_tail(dest,elem,prio,prio_func) \ + (LIST_CAST_RETURN(elem) list_insert_at_priority_tail(LIST_CAST(dest, **), LIST_CAST(elem, *), prio, prio_func)) #define list_pop(dest) \ (LIST_CAST_RETURN(*(dest)) list_pop(LIST_CAST(dest, **))) diff --git a/src/projectile.c b/src/projectile.c index d97e00e5..ffd748b7 100644 --- a/src/projectile.c +++ b/src/projectile.c @@ -110,7 +110,7 @@ static int projectile_sizeprio_func(List *vproj) { } List* proj_insert_sizeprio(List **dest, List *elem) { - return list_insert_at_priority(dest, elem, projectile_sizeprio_func(elem), projectile_sizeprio_func); + return list_insert_at_priority_tail(dest, elem, projectile_sizeprio_func(elem), projectile_sizeprio_func); } static int projectile_colorprio_func(List *vproj) { @@ -129,7 +129,7 @@ static int projectile_colorprio_func(List *vproj) { } List* proj_insert_colorprio(List **dest, List *elem) { - return list_insert_at_priority(dest, elem, projectile_colorprio_func(elem), projectile_colorprio_func); + return list_insert_at_priority_head(dest, elem, projectile_colorprio_func(elem), projectile_colorprio_func); // return list_push(dest, elem); }