From ee866ca59904077d6e69723d4f996e6bf571db7f Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Mon, 13 Mar 2017 11:11:44 -0700 Subject: [PATCH] Revert "ecore-evas reduce modifier modification on every event to cut cpu" This reverts commit 3a9d54085b8751cbd0bca4698a8ff702d9bdc7b4. I got crash and a lot of valgrind warning with this patch. All in all, I think we can just wait for next release and do a proper cleanup of our API to not rely on strings at all. For references this is the first valgrind warning I get (Not going to past the 100 following one) : ==11860== Invalid write of size 4 ==11860== at 0xB10DDD1: _ecore_event_evas_modifier_lock_update (ecore_input_evas.c:432) ==11860== by 0xB10E3DD: ecore_event_evas_mouse_move (ecore_input_evas.c:725) ==11860== by 0x5D5115D: _ecore_call_handler_cb (ecore_private.h:317) ==11860== by 0x5D5115D: _ecore_event_call (ecore_events.c:518) ==11860== by 0x5D5CC47: _ecore_main_loop_iterate_internal (ecore_main.c:2381) ==11860== by 0x5D5D42E: ecore_main_loop_begin (ecore_main.c:1289) ==11860== by 0x5D5D490: _efl_loop_begin (ecore_main.c:2831) ==11860== by 0x5D59555: efl_loop_begin (efl_loop.eo.c:32) ==11860== by 0x14F275: main (test.c:1188) ==11860== Address 0x19a36828 is 7 bytes after a block of size 1 alloc'd ==11860== at 0x4C2AACE: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==11860== by 0x4C2CC81: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==11860== by 0xB10DDA8: _ecore_event_evas_modifier_lock_update (ecore_input_evas.c:425) ==11860== by 0xB10E3DD: ecore_event_evas_mouse_move (ecore_input_evas.c:725) ==11860== by 0x5D5115D: _ecore_call_handler_cb (ecore_private.h:317) ==11860== by 0x5D5115D: _ecore_event_call (ecore_events.c:518) ==11860== by 0x5D5CC47: _ecore_main_loop_iterate_internal (ecore_main.c:2381) ==11860== by 0x5D5D42E: ecore_main_loop_begin (ecore_main.c:1289) ==11860== by 0x5D5D490: _efl_loop_begin (ecore_main.c:2831) ==11860== by 0x5D59555: efl_loop_begin (efl_loop.eo.c:32) ==11860== by 0x14F275: main (test.c:1188) --- src/lib/ecore_input_evas/ecore_input_evas.c | 163 ++++---------------- 1 file changed, 28 insertions(+), 135 deletions(-) diff --git a/src/lib/ecore_input_evas/ecore_input_evas.c b/src/lib/ecore_input_evas/ecore_input_evas.c index 1748167289..7866bd5d9a 100644 --- a/src/lib/ecore_input_evas/ecore_input_evas.c +++ b/src/lib/ecore_input_evas/ecore_input_evas.c @@ -15,28 +15,17 @@ int _ecore_input_evas_log_dom = -1; -typedef struct _Ecore_Input_Window Ecore_Input_Window; -typedef struct _Ecore_Input_Seat_State Ecore_Input_Seat_State; - +typedef struct _Ecore_Input_Window Ecore_Input_Window; struct _Ecore_Input_Window { - Evas *evas; - void *window; - Ecore_Input_Seat_State *device_states; - Ecore_Event_Mouse_Move_Cb move_mouse; - Ecore_Event_Multi_Move_Cb move_multi; - Ecore_Event_Multi_Down_Cb down_multi; - Ecore_Event_Multi_Up_Cb up_multi; - Ecore_Event_Direct_Input_Cb direct; - int device_states_num; - int ignore_event; -}; - -struct _Ecore_Input_Seat_State -{ - Evas_Device *seat; - unsigned int modifiers; - unsigned int invalid; + Evas *evas; + void *window; + Ecore_Event_Mouse_Move_Cb move_mouse; + Ecore_Event_Multi_Move_Cb move_multi; + Ecore_Event_Multi_Down_Cb down_multi; + Ecore_Event_Multi_Up_Cb up_multi; + Ecore_Event_Direct_Input_Cb direct; + int ignore_event; }; typedef enum _Ecore_Input_State { @@ -289,9 +278,9 @@ _ecore_event_evas_push_mouse_move(Ecore_Event_Mouse_Move *e) } } -static void -_ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers, - Evas_Device *seat) +EAPI void +ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers, + Evas_Device *seat) { if (modifiers & ECORE_EVENT_MODIFIER_SHIFT) evas_seat_key_modifier_on(e, "Shift", seat); @@ -337,102 +326,10 @@ _ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers, else evas_seat_key_lock_off(e, "Shift_Lock", seat); } -static void -_ecore_event_evas_modifier_lock_invalidate(Ecore_Input_Window *w) -{ - int i; - - if (!w) return; - for (i = 0; i < w->device_states_num; i++) w->device_states[i].invalid = 1; -} - -typedef struct -{ - const Evas *evas; - Ecore_Input_Window *w; -} Find_Foreach_Data; - -static Eina_Bool -_ecore_event_evas_window_evas_find_foreach_cb(const Eina_Hash *hash EINA_UNUSED, - const void *key EINA_UNUSED, - void *data, void *fdata) -{ - Ecore_Input_Window *w = data; - Find_Foreach_Data *foreach_data = fdata; - - if (foreach_data->evas == w->evas) - { - foreach_data->w = w; - return EINA_FALSE; - } - return EINA_TRUE; -} - -static Ecore_Input_Window * -_ecore_event_evas_window_evas_find(const Evas *evas) -{ - Find_Foreach_Data fdata; - - fdata.evas = evas; - fdata.w = NULL; - eina_hash_foreach(_window_hash, - _ecore_event_evas_window_evas_find_foreach_cb, - &fdata); - return fdata.w; -} - -EAPI void -ecore_event_evas_seat_modifier_lock_update(Evas *e, unsigned int modifiers, - Evas_Device *seat) -{ - _ecore_event_evas_modifier_lock_invalidate - (_ecore_event_evas_window_evas_find(e)); - _ecore_event_evas_seat_modifier_lock_update(e, modifiers, seat); -} - EAPI void ecore_event_evas_modifier_lock_update(Evas *e, unsigned int modifiers) { - _ecore_event_evas_modifier_lock_invalidate - (_ecore_event_evas_window_evas_find(e)); - _ecore_event_evas_seat_modifier_lock_update(e, modifiers, NULL); -} - -static void -_ecore_event_evas_modifier_lock_update(Ecore_Input_Window *w, - unsigned int modifiers, - Evas_Device *seat) -{ - Ecore_Input_Seat_State *states; - int i; - - for (i = 0; i < w->device_states_num; i++) - { - if (w->device_states[i].seat == seat) - { - if ((w->device_states[i].invalid) || - (modifiers != w->device_states[i].modifiers)) - { - w->device_states[i].invalid = 0; - w->device_states[i].modifiers = modifiers; - ecore_event_evas_seat_modifier_lock_update - (w->evas, modifiers, seat); - } - return; - } - } - w->device_states_num++; - states = realloc(w->device_states, w->device_states_num); - if (!states) - { - w->device_states_num--; - return; - } - states[w->device_states_num - 1].seat = seat; - states[w->device_states_num - 1].modifiers = modifiers; - states[w->device_states_num - 1].invalid = 0; - w->device_states = states; - _ecore_event_evas_seat_modifier_lock_update(w->evas, modifiers, seat); + ecore_event_evas_seat_modifier_lock_update(e, modifiers, NULL); } EAPI void @@ -469,14 +366,6 @@ ecore_event_window_register(Ecore_Window id, void *window, Evas *evas, evas_key_lock_add(evas, "Scroll_Lock"); } -static void -_ecore_evas_input_win_free(void *data) -{ - Ecore_Input_Window *w = data; - free(w->device_states); - free(w); -} - EAPI void ecore_event_window_unregister(Ecore_Window id) { @@ -531,8 +420,9 @@ _ecore_event_evas_key(Ecore_Event_Key *e, Ecore_Event_Press press) lookup = _ecore_event_window_match(e->event_window); if (!lookup) return ECORE_CALLBACK_PASS_ON; - _ecore_event_evas_modifier_lock_update - (lookup, e->modifiers, efl_input_device_seat_get(e->dev)); + ecore_event_evas_seat_modifier_lock_update(lookup->evas, + e->modifiers, + efl_input_device_seat_get(e->dev)); if (press == ECORE_DOWN) { if (!lookup->direct || @@ -641,8 +531,9 @@ _ecore_event_evas_mouse_button(Ecore_Event_Mouse_Button *e, Ecore_Event_Press pr if (e->multi.device == 0) { - _ecore_event_evas_modifier_lock_update - (lookup, e->modifiers, efl_input_device_seat_get(e->dev)); + ecore_event_evas_seat_modifier_lock_update(lookup->evas, + e->modifiers, + efl_input_device_seat_get(e->dev)); if (press == ECORE_DOWN) { if (!lookup->direct || @@ -722,8 +613,9 @@ ecore_event_evas_mouse_move(void *data EINA_UNUSED, int type EINA_UNUSED, void * if (e->multi.device == 0) { _ecore_event_evas_push_mouse_move(e); - _ecore_event_evas_modifier_lock_update - (lookup, e->modifiers, efl_input_device_seat_get(e->dev)); + ecore_event_evas_seat_modifier_lock_update(lookup->evas, + e->modifiers, + efl_input_device_seat_get(e->dev)); if (!lookup->direct || !lookup->direct(lookup->window, ECORE_EVENT_MOUSE_MOVE, e)) { @@ -782,8 +674,9 @@ _ecore_event_evas_mouse_io(Ecore_Event_Mouse_IO *e, Ecore_Event_IO io) lookup = _ecore_event_window_match(e->event_window); if (!lookup) return ECORE_CALLBACK_PASS_ON; - _ecore_event_evas_modifier_lock_update - (lookup, e->modifiers, efl_input_device_seat_get(e->dev)); + ecore_event_evas_seat_modifier_lock_update(lookup->evas, + e->modifiers, + efl_input_device_seat_get(e->dev)); switch (io) { case ECORE_IN: @@ -829,8 +722,8 @@ ecore_event_evas_mouse_wheel(void *data EINA_UNUSED, int type EINA_UNUSED, void e = event; lookup = _ecore_event_window_match(e->event_window); if (!lookup) return ECORE_CALLBACK_PASS_ON; - _ecore_event_evas_modifier_lock_update - (lookup, e->modifiers, efl_input_device_seat_get(e->dev)); + ecore_event_evas_seat_modifier_lock_update(lookup->evas, e->modifiers, + efl_input_device_seat_get(e->dev)); if (!lookup->direct || !lookup->direct(lookup->window, ECORE_EVENT_MOUSE_WHEEL, e)) { @@ -927,7 +820,7 @@ ecore_event_evas_init(void) ecore_event_evas_mouse_button_cancel, NULL); - _window_hash = eina_hash_pointer_new(_ecore_evas_input_win_free); + _window_hash = eina_hash_pointer_new(free); if (getenv("ECORE_INPUT_FIX")) {