LCOV - code coverage report
Current view: top level - glib/gobject/tests - signal-handler.c (source / functions) Hit Total Coverage
Test: unnamed Lines: 139 144 96.5 %
Date: 2024-04-30 05:17:35 Functions: 13 14 92.9 %
Branches: 44 48 91.7 %

           Branch data     Line data    Source code
       1                 :            : #include <glib-object.h>
       2                 :            : 
       3                 :            : typedef struct {
       4                 :            :   GObject instance;
       5                 :            : } MyObj;
       6                 :            : 
       7                 :            : typedef struct {
       8                 :            :   GObjectClass parent_class;
       9                 :            : } MyObjClass;
      10                 :            : 
      11                 :            : enum {
      12                 :            :   SIGNAL1,
      13                 :            :   SIGNAL2,
      14                 :            :   LAST_SIGNAL
      15                 :            : };
      16                 :            : 
      17                 :            : guint signals[LAST_SIGNAL];
      18                 :            : 
      19                 :            : GType my_obj_get_type (void);
      20                 :            : 
      21   [ +  +  +  -  :         10 : G_DEFINE_TYPE (MyObj, my_obj, G_TYPE_OBJECT)
                   +  + ]
      22                 :            : 
      23                 :            : static void
      24                 :          8 : my_obj_init (MyObj *o)
      25                 :            : {
      26                 :          8 : }
      27                 :            : 
      28                 :            : static void
      29                 :          1 : my_obj_class_init (MyObjClass *class)
      30                 :            : {
      31                 :          1 :   signals[SIGNAL1] =
      32                 :          1 :     g_signal_new ("signal1",
      33                 :            :                   G_TYPE_FROM_CLASS (class),
      34                 :            :                   G_SIGNAL_RUN_LAST,
      35                 :            :                   0, NULL, NULL, NULL, G_TYPE_NONE, 0);
      36                 :          1 :   signals[SIGNAL2] =
      37                 :          1 :     g_signal_new ("signal2",
      38                 :            :                   G_TYPE_FROM_CLASS (class),
      39                 :            :                   G_SIGNAL_RUN_LAST,
      40                 :            :                   0, NULL, NULL, NULL, G_TYPE_NONE, 0);
      41                 :          1 : }
      42                 :            : 
      43                 :            : static void
      44                 :          0 : nop (void)
      45                 :            : {
      46                 :          0 : }
      47                 :            : 
      48                 :            : static guint n_handlers = 0;
      49                 :            : 
      50                 :            : static void
      51                 :          1 : test_connect_many (void)
      52                 :            : {
      53                 :            :   MyObj *o;
      54                 :            :   gdouble time_elapsed;
      55                 :            :   guint i;
      56                 :            : 
      57                 :          1 :   o = g_object_new (my_obj_get_type (), NULL);
      58                 :            : 
      59                 :          1 :   g_test_timer_start ();
      60                 :            : 
      61         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
      62                 :          1 :     g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL); 
      63                 :            : 
      64                 :          1 :   time_elapsed = g_test_timer_elapsed ();
      65                 :            : 
      66                 :          1 :   g_object_unref (o);
      67                 :            : 
      68                 :          1 :   g_test_minimized_result (time_elapsed, "connected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
      69                 :          1 : }
      70                 :            : 
      71                 :            : static void
      72                 :          1 : test_disconnect_many_ordered (void)
      73                 :            : {
      74                 :            :   MyObj *o;
      75                 :            :   gulong *handlers;
      76                 :            :   gdouble time_elapsed;
      77                 :            :   guint i;
      78                 :            : 
      79                 :          1 :   handlers = g_malloc_n (n_handlers, sizeof (*handlers));
      80                 :          1 :   o = g_object_new (my_obj_get_type (), NULL);
      81                 :            : 
      82         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
      83                 :          1 :     handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL); 
      84                 :            : 
      85                 :          1 :   g_test_timer_start ();
      86                 :            : 
      87         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
      88                 :          1 :     g_signal_handler_disconnect (o, handlers[i]); 
      89                 :            : 
      90                 :          1 :   time_elapsed = g_test_timer_elapsed ();
      91                 :            : 
      92                 :          1 :   g_object_unref (o);
      93                 :          1 :   g_free (handlers);
      94                 :            : 
      95                 :          1 :   g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
      96                 :          1 : }
      97                 :            : 
      98                 :            : static void
      99                 :          1 : test_disconnect_many_inverse (void)
     100                 :            : {
     101                 :            :   MyObj *o;
     102                 :            :   gulong *handlers;
     103                 :            :   gdouble time_elapsed;
     104                 :            :   guint i;
     105                 :            : 
     106                 :          1 :   handlers = g_malloc_n (n_handlers, sizeof (*handlers));
     107                 :          1 :   o = g_object_new (my_obj_get_type (), NULL);
     108                 :            : 
     109         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     110                 :          1 :     handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL); 
     111                 :            : 
     112                 :          1 :   g_test_timer_start ();
     113                 :            : 
     114         [ +  + ]:          2 :   for (i = n_handlers; i > 0; i--)
     115                 :          1 :     g_signal_handler_disconnect (o, handlers[i - 1]);
     116                 :            : 
     117                 :          1 :   time_elapsed = g_test_timer_elapsed ();
     118                 :            : 
     119                 :          1 :   g_object_unref (o);
     120                 :          1 :   g_free (handlers);
     121                 :            : 
     122                 :          1 :   g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
     123                 :          1 : }
     124                 :            : 
     125                 :            : static void
     126                 :          1 : test_disconnect_many_random (void)
     127                 :            : {
     128                 :            :   MyObj *o;
     129                 :            :   gulong *handlers;
     130                 :            :   gulong id;
     131                 :            :   gdouble time_elapsed;
     132                 :            :   guint i, j;
     133                 :            : 
     134                 :          1 :   handlers = g_malloc_n (n_handlers, sizeof (*handlers));
     135                 :          1 :   o = g_object_new (my_obj_get_type (), NULL);
     136                 :            : 
     137         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     138                 :          1 :     handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL); 
     139                 :            : 
     140         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     141                 :            :     {
     142                 :          1 :       j = g_test_rand_int_range (0, n_handlers);
     143                 :          1 :       id = handlers[i];
     144                 :          1 :       handlers[i] = handlers[j];
     145                 :          1 :       handlers[j] = id;
     146                 :            :     }
     147                 :            : 
     148                 :          1 :   g_test_timer_start ();
     149                 :            : 
     150         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     151                 :          1 :     g_signal_handler_disconnect (o, handlers[i]); 
     152                 :            : 
     153                 :          1 :   time_elapsed = g_test_timer_elapsed ();
     154                 :            : 
     155                 :          1 :   g_object_unref (o);
     156                 :          1 :   g_free (handlers);
     157                 :            : 
     158                 :          1 :   g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
     159                 :          1 : }
     160                 :            : 
     161                 :            : static void
     162                 :          1 : test_disconnect_2_signals (void)
     163                 :            : {
     164                 :            :   MyObj *o;
     165                 :            :   gulong *handlers;
     166                 :            :   gulong id;
     167                 :            :   gdouble time_elapsed;
     168                 :            :   guint i, j;
     169                 :            : 
     170                 :          1 :   handlers = g_malloc_n (n_handlers, sizeof (*handlers));
     171                 :          1 :   o = g_object_new (my_obj_get_type (), NULL);
     172                 :            : 
     173         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     174                 :            :     {
     175         [ +  - ]:          1 :       if (i % 2 == 0)
     176                 :          1 :         handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL); 
     177                 :            :       else
     178                 :          0 :         handlers[i] = g_signal_connect (o, "signal2", G_CALLBACK (nop), NULL); 
     179                 :            :     }
     180                 :            : 
     181         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     182                 :            :     {
     183                 :          1 :       j = g_test_rand_int_range (0, n_handlers);
     184                 :          1 :       id = handlers[i];
     185                 :          1 :       handlers[i] = handlers[j];
     186                 :          1 :       handlers[j] = id;
     187                 :            :     }
     188                 :            : 
     189                 :          1 :   g_test_timer_start ();
     190                 :            : 
     191         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     192                 :          1 :     g_signal_handler_disconnect (o, handlers[i]); 
     193                 :            : 
     194                 :          1 :   time_elapsed = g_test_timer_elapsed ();
     195                 :            : 
     196                 :          1 :   g_object_unref (o);
     197                 :          1 :   g_free (handlers);
     198                 :            : 
     199                 :          1 :   g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
     200                 :          1 : }
     201                 :            : 
     202                 :            : static void
     203                 :          1 : test_disconnect_2_objects (void)
     204                 :            : {
     205                 :            :   MyObj *o1, *o2, *o;
     206                 :            :   gulong *handlers;
     207                 :            :   MyObj **objects;
     208                 :            :   gulong id;
     209                 :            :   gdouble time_elapsed;
     210                 :            :   guint i, j;
     211                 :            : 
     212                 :          1 :   handlers = g_malloc_n (n_handlers, sizeof (*handlers));
     213                 :          1 :   objects = g_malloc_n (n_handlers, sizeof (*objects));
     214                 :          1 :   o1 = g_object_new (my_obj_get_type (), NULL);
     215                 :          1 :   o2 = g_object_new (my_obj_get_type (), NULL);
     216                 :            : 
     217         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     218                 :            :     {
     219         [ +  - ]:          1 :       if (i % 2 == 0)
     220                 :            :         {
     221                 :          1 :           handlers[i] = g_signal_connect (o1, "signal1", G_CALLBACK (nop), NULL); 
     222                 :          1 :           objects[i] = o1;
     223                 :            :         }
     224                 :            :       else
     225                 :            :         {
     226                 :          0 :           handlers[i] = g_signal_connect (o2, "signal1", G_CALLBACK (nop), NULL); 
     227                 :          0 :           objects[i] = o2;
     228                 :            :         }
     229                 :            :     }
     230                 :            : 
     231         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     232                 :            :     {
     233                 :          1 :       j = g_test_rand_int_range (0, n_handlers);
     234                 :          1 :       id = handlers[i];
     235                 :          1 :       handlers[i] = handlers[j];
     236                 :          1 :       handlers[j] = id;
     237                 :          1 :       o = objects[i];
     238                 :          1 :       objects[i] = objects[j];
     239                 :          1 :       objects[j] = o;
     240                 :            :     }
     241                 :            : 
     242                 :          1 :   g_test_timer_start ();
     243                 :            : 
     244         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     245                 :          1 :     g_signal_handler_disconnect (objects[i], handlers[i]); 
     246                 :            : 
     247                 :          1 :   time_elapsed = g_test_timer_elapsed ();
     248                 :            : 
     249                 :          1 :   g_object_unref (o1);
     250                 :          1 :   g_object_unref (o2);
     251                 :          1 :   g_free (objects);
     252                 :          1 :   g_free (handlers);
     253                 :            : 
     254                 :          1 :   g_test_minimized_result (time_elapsed, "disconnected %u handlers in %6.3f seconds", n_handlers, time_elapsed);
     255                 :          1 : }
     256                 :            : 
     257                 :            : static void
     258                 :          1 : test_block_many (void)
     259                 :            : {
     260                 :            :   MyObj *o;
     261                 :            :   gulong *handlers;
     262                 :            :   gulong id;
     263                 :            :   gdouble time_elapsed;
     264                 :            :   guint i, j;
     265                 :            : 
     266                 :          1 :   handlers = g_malloc_n (n_handlers, sizeof (*handlers));
     267                 :          1 :   o = g_object_new (my_obj_get_type (), NULL);
     268                 :            : 
     269         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     270                 :          1 :     handlers[i] = g_signal_connect (o, "signal1", G_CALLBACK (nop), NULL); 
     271                 :            : 
     272         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     273                 :            :     {
     274                 :          1 :       j = g_test_rand_int_range (0, n_handlers);
     275                 :          1 :       id = handlers[i];
     276                 :          1 :       handlers[i] = handlers[j];
     277                 :          1 :       handlers[j] = id;
     278                 :            :     }
     279                 :            : 
     280                 :          1 :   g_test_timer_start ();
     281                 :            : 
     282         [ +  + ]:          2 :   for (i = 0; i < n_handlers; i++)
     283                 :          1 :     g_signal_handler_block (o, handlers[i]); 
     284                 :            : 
     285         [ +  + ]:          2 :   for (i = n_handlers; i > 0; i--)
     286                 :          1 :     g_signal_handler_unblock (o, handlers[i - 1]);
     287                 :            : 
     288                 :          1 :   time_elapsed = g_test_timer_elapsed ();
     289                 :            : 
     290                 :          1 :   g_object_unref (o);
     291                 :          1 :   g_free (handlers);
     292                 :            : 
     293                 :          1 :   g_test_minimized_result (time_elapsed, "blocked and unblocked %u handlers in %6.3f seconds", n_handlers, time_elapsed);
     294                 :          1 : }
     295                 :            : 
     296                 :            : int
     297                 :          1 : main (int argc, char *argv[])
     298                 :            : {
     299                 :          1 :   g_test_init (&argc, &argv, NULL);
     300                 :            : 
     301         [ -  + ]:          1 :   n_handlers = g_test_perf () ? 500000 : 1;
     302                 :            : 
     303                 :          1 :   g_test_add_func ("/signal/handler/connect-many", test_connect_many);
     304                 :          1 :   g_test_add_func ("/signal/handler/disconnect-many-ordered", test_disconnect_many_ordered);
     305                 :          1 :   g_test_add_func ("/signal/handler/disconnect-many-inverse", test_disconnect_many_inverse);
     306                 :          1 :   g_test_add_func ("/signal/handler/disconnect-many-random", test_disconnect_many_random);
     307                 :          1 :   g_test_add_func ("/signal/handler/disconnect-2-signals", test_disconnect_2_signals);
     308                 :          1 :   g_test_add_func ("/signal/handler/disconnect-2-objects", test_disconnect_2_objects);
     309                 :          1 :   g_test_add_func ("/signal/handler/block-many", test_block_many);
     310                 :            : 
     311                 :          1 :   return g_test_run ();
     312                 :            : }

Generated by: LCOV version 1.14