discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/enlightenment.git/commit/?id=3f5ac7d9aba28f63340a496a5d8296d0c3a8d55a
commit 3f5ac7d9aba28f63340a496a5d8296d0c3a8d55a Author: Mike Blumenkrantz <[email protected]> Date: Thu Mar 13 09:35:06 2014 -0400 use static array of inlists for client hooks to reduce overhead --- src/bin/e_client.c | 54 +++++++++++++++++++++++++++++++++++++++--------------- src/bin/e_client.h | 2 ++ 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/bin/e_client.c b/src/bin/e_client.c index 7fb5a18..779540c 100644 --- a/src/bin/e_client.c +++ b/src/bin/e_client.c @@ -1,6 +1,5 @@ #include "e.h" -static Eina_List *_e_client_hooks = NULL; static int _e_client_hooks_delete = 0; static int _e_client_hooks_walking = 0; @@ -54,6 +53,31 @@ static Eina_Rectangle action_orig = {0}; EINTERN void e_client_focused_set(E_Client *ec); +static Eina_Inlist *_e_client_hooks[] = +{ + [E_CLIENT_HOOK_EVAL_PRE_FETCH] = NULL, + [E_CLIENT_HOOK_EVAL_FETCH] = NULL, + [E_CLIENT_HOOK_EVAL_PRE_POST_FETCH] = NULL, + [E_CLIENT_HOOK_EVAL_POST_FETCH] = NULL, + [E_CLIENT_HOOK_EVAL_PRE_FRAME_ASSIGN] = NULL, + [E_CLIENT_HOOK_EVAL_POST_FRAME_ASSIGN] = NULL, + [E_CLIENT_HOOK_EVAL_PRE_NEW_CLIENT] = NULL, + [E_CLIENT_HOOK_EVAL_POST_NEW_CLIENT] = NULL, + [E_CLIENT_HOOK_EVAL_END] = NULL, + [E_CLIENT_HOOK_FOCUS_SET] = NULL, + [E_CLIENT_HOOK_FOCUS_UNSET] = NULL, + [E_CLIENT_HOOK_NEW_CLIENT] = NULL, + [E_CLIENT_HOOK_DESK_SET] = NULL, + [E_CLIENT_HOOK_MOVE_BEGIN] = NULL, + [E_CLIENT_HOOK_MOVE_UPDATE] = NULL, + [E_CLIENT_HOOK_MOVE_END] = NULL, + [E_CLIENT_HOOK_RESIZE_BEGIN] = NULL, + [E_CLIENT_HOOK_RESIZE_UPDATE] = NULL, + [E_CLIENT_HOOK_RESIZE_END] = NULL, + [E_CLIENT_HOOK_DEL] = NULL, + [E_CLIENT_HOOK_UNREDIRECT] = NULL, + [E_CLIENT_HOOK_REDIRECT] = NULL, +}; /////////////////////////////////////////// @@ -234,31 +258,30 @@ cleanup: static void _e_client_hooks_clean(void) { - Eina_List *l, *ln; + Eina_Inlist *l; E_Client_Hook *ch; + unsigned int x; - EINA_LIST_FOREACH_SAFE(_e_client_hooks, l, ln, ch) - { - if (ch->delete_me) - { - _e_client_hooks = eina_list_remove_list(_e_client_hooks, l); - free(ch); - } - } + for (x = 0; x < E_CLIENT_HOOK_LAST; x++) + EINA_INLIST_FOREACH_SAFE(_e_client_hooks[x], l, ch) + { + if (!ch->delete_me) continue; + _e_client_hooks[x] = eina_inlist_remove(_e_client_hooks[x], EINA_INLIST_GET(ch)); + free(ch); + } } static Eina_Bool _e_client_hook_call(E_Client_Hook_Point hookpoint, E_Client *ec) { - Eina_List *l; E_Client_Hook *ch; e_object_ref(E_OBJECT(ec)); _e_client_hooks_walking++; - EINA_LIST_FOREACH(_e_client_hooks, l, ch) + EINA_INLIST_FOREACH(_e_client_hooks[hookpoint], ch) { if (ch->delete_me) continue; - if (ch->hookpoint == hookpoint) ch->func(ch->data, ec); + ch->func(ch->data, ec); } _e_client_hooks_walking--; if ((_e_client_hooks_walking == 0) && (_e_client_hooks_delete > 0)) @@ -2970,12 +2993,13 @@ e_client_hook_add(E_Client_Hook_Point hookpoint, E_Client_Hook_Cb func, const vo { E_Client_Hook *ch; + EINA_SAFETY_ON_TRUE_RETURN_VAL(hookpoint >= E_CLIENT_HOOK_LAST, NULL); ch = E_NEW(E_Client_Hook, 1); if (!ch) return NULL; ch->hookpoint = hookpoint; ch->func = func; ch->data = (void*)data; - _e_client_hooks = eina_list_append(_e_client_hooks, ch); + _e_client_hooks[hookpoint] = eina_inlist_append(_e_client_hooks[hookpoint], EINA_INLIST_GET(ch)); return ch; } @@ -2985,7 +3009,7 @@ e_client_hook_del(E_Client_Hook *ch) ch->delete_me = 1; if (_e_client_hooks_walking == 0) { - _e_client_hooks = eina_list_remove(_e_client_hooks, ch); + _e_client_hooks[ch->hookpoint] = eina_inlist_remove(_e_client_hooks[ch->hookpoint], EINA_INLIST_GET(ch)); free(ch); } else diff --git a/src/bin/e_client.h b/src/bin/e_client.h index a825375..f73d2c5 100644 --- a/src/bin/e_client.h +++ b/src/bin/e_client.h @@ -164,6 +164,7 @@ typedef enum _E_Client_Hook_Point E_CLIENT_HOOK_DEL, E_CLIENT_HOOK_UNREDIRECT, E_CLIENT_HOOK_REDIRECT, + E_CLIENT_HOOK_LAST, } E_Client_Hook_Point; typedef void (*E_Client_Move_Intercept_Cb)(E_Client *, int x, int y); @@ -197,6 +198,7 @@ struct _E_Event_Client_Property struct _E_Client_Hook { + EINA_INLIST; E_Client_Hook_Point hookpoint; E_Client_Hook_Cb func; void *data; --
