Revert "ecore-evas reduce modifier modification on every event to cut cpu"
authorCedric BAIL <cedric@osg.samsung.com>
Mon, 13 Mar 2017 18:11:44 +0000 (11:11 -0700)
committerCedric BAIL <cedric@osg.samsung.com>
Mon, 13 Mar 2017 20:42:00 +0000 (13:42 -0700)
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

index 1748167..7866bd5 100644 (file)
 
 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"))
      {