Eo: Optimise event callback call
authorJérémy Zurcher <jeremy@asynk.ch>
Mon, 9 Nov 2015 14:03:03 +0000 (15:03 +0100)
committerJérémy Zurcher <jeremy@asynk.ch>
Mon, 9 Nov 2015 14:03:03 +0000 (15:03 +0100)
 check if the event is frozen before walking the event list

src/lib/eo/eo_base_class.c

index f99ca37..daf7a9d 100644 (file)
@@ -671,48 +671,45 @@ _eo_base_event_callback_call(Eo *obj_id, Eo_Base_Data *pd,
 
    pd->walking_list++;
 
+   if (!desc->unfreezable && (event_freeze_count || pd->event_freeze_count))
+     goto end;
+
    for (cb = pd->callbacks; cb; cb = cb->next)
      {
-        if (!cb->delete_me)
+        if (cb->delete_me)
+          continue;
+
+        if (cb->func_array)
           {
-             if (cb->func_array)
-               {
-                  const Eo_Callback_Array_Item *it;
+             const Eo_Callback_Array_Item *it;
 
-                  for (it = cb->items.item_array; it->func; it++)
-                    {
-                       if (!_cb_desc_match(it->desc, desc))
-                          continue;
-                       if (!it->desc->unfreezable &&
-                           (event_freeze_count || pd->event_freeze_count))
-                          continue;
-
-                       /* Abort callback calling if the func says so. */
-                       if (!it->func((void *) cb->func_data, obj_id, desc,
-                                (void *) event_info))
-                         {
-                            ret = EINA_FALSE;
-                            goto end;
-                         }
-                    }
-               }
-             else
+             for (it = cb->items.item_array; it->func; it++)
                {
-                  if (!_cb_desc_match(cb->items.item.desc, desc))
-                    continue;
-                  if (!cb->items.item.desc->unfreezable &&
-                      (event_freeze_count || pd->event_freeze_count))
+                  if (!_cb_desc_match(it->desc, desc))
                     continue;
 
                   /* Abort callback calling if the func says so. */
-                  if (!cb->items.item.func((void *) cb->func_data, obj_id, desc,
-                                           (void *) event_info))
+                  if (!it->func((void *) cb->func_data, obj_id, desc,
+                                (void *) event_info))
                     {
                        ret = EINA_FALSE;
                        goto end;
                     }
                }
           }
+        else
+          {
+             if (!_cb_desc_match(cb->items.item.desc, desc))
+               continue;
+
+             /* Abort callback calling if the func says so. */
+             if (!cb->items.item.func((void *) cb->func_data, obj_id, desc,
+                                      (void *) event_info))
+               {
+                  ret = EINA_FALSE;
+                  goto end;
+               }
+          }
      }
 
 end: