edje_signal: reduce member count when deleted edje_signal_callback is found 19/139119/5
authorSungtaek Hong <sth253.hong@samsung.com>
Mon, 17 Jul 2017 10:28:55 +0000 (19:28 +0900)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Tue, 10 Oct 2017 11:10:38 +0000 (11:10 +0000)
    Summary:
     - when deleted callback is found _edje_signal_callback_move_last() is called
       in order to pack match array.
     - during _edje_signal_callback_move_last() index skips when another deleted
       callback is found, but does not reduce members_count.
     - this duplicates a remaining callback and calls the callback twice.

    Test Plan:
    1. add multiple edje_signal_callback by edje_object_signal_callback_add()
                  which have the same source, signal, func but different data.
               2. delete first and last callback by
                  edje_object_signal_callback_del/edje_object_signal_callback_del_full.
               3. emit edje_signal.
               4. observe one callback is called twice.

    Reviewers: SanghyeonLee, conr2d, jpeg

    Subscribers: cedric, jpeg

    Differential Revision: https://phab.enlightenment.org/D4985

Change-Id: Ie6c8f2f05c7c4bdeb1ed692960588ab0b7244bfb
Signed-off-by: Sungtaek Hong <sth253.hong@samsung.com>
src/lib/edje/edje_signal.c

index f8988af..d856106 100644 (file)
@@ -359,6 +359,11 @@ _edje_signal_callback_move_last(Edje_Signal_Callback_Group *gp,
              gp->custom_data[i] = gp->custom_data[j];
              return;
           }
+        else
+          {
+             _edje_signal_callback_unset(gp, j);
+             m->matches_count--;
+          }
      }
 }