glib/tsrc/BC/tests/refcount/signals-singlethread.c
changeset 72 403e7f6ed6c5
parent 18 47c74d1534e1
equal deleted inserted replaced
71:28ccaba883f4 72:403e7f6ed6c5
     1 /* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
     1 /* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
       
     2 
       
     3 
       
     4 
       
     5 
     2 #include <unistd.h>
     6 #include <unistd.h>
     3 #include <glib.h>
     7 #include <glib.h>
     4 #include <glib-object.h>
     8 #include <glib-object.h>
     5 
     9 
     6 #ifdef SYMBIAN
    10 #ifdef SYMBIAN
    22 /*
    26 /*
    23 Define NULL explictly here rather than expecting e32def.h to be included!
    27 Define NULL explictly here rather than expecting e32def.h to be included!
    24 */
    28 */
    25 #define NULL 0
    29 #define NULL 0
    26 
    30 
    27 #define G_TYPE_TEST               (g_test_get_type ())
    31 #define G_TYPE_TEST                (my_test_get_type ())
    28 #define G_TEST(test)              (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
    32 #define MY_TEST(test)              (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
    29 #define G_IS_TEST(test)           (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
    33 #define MY_IS_TEST(test)           (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
    30 #define G_TEST_CLASS(tclass)      (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
    34 #define MY_TEST_CLASS(tclass)      (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
    31 #define G_IS_TEST_CLASS(tclass)   (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
    35 #define MY_IS_TEST_CLASS(tclass)   (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
    32 #define G_TEST_GET_CLASS(test)    (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
    36 #define MY_TEST_GET_CLASS(test)    (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
    33 
    37 
    34 static GRand *grand;
    38 static GRand *grand;
    35 
    39 
    36 typedef struct _GTest GTest;
    40 typedef struct _GTest GTest;
    37 typedef struct _GTestClass GTestClass;
    41 typedef struct _GTestClass GTestClass;
    49 
    53 
    50   void (*test_signal1) (GTest * test, gint an_int);
    54   void (*test_signal1) (GTest * test, gint an_int);
    51   void (*test_signal2) (GTest * test, gint an_int);
    55   void (*test_signal2) (GTest * test, gint an_int);
    52 };
    56 };
    53 
    57 
    54 static GType g_test_get_type (void);
    58 static GType my_test_get_type (void);
    55 static volatile gboolean stopping;
    59 static volatile gboolean stopping;
    56 
    60 
    57 /* Element signals and args */
    61 /* Element signals and args */
    58 enum
    62 enum
    59 {
    63 {
    67 {
    71 {
    68   ARG_0,
    72   ARG_0,
    69   ARG_TEST_PROP
    73   ARG_TEST_PROP
    70 };
    74 };
    71 
    75 
    72 static void g_test_class_init (GTestClass * klass);
    76 static void my_test_class_init (GTestClass * klass);
    73 static void g_test_init (GTest * test);
    77 static void my_test_init (GTest * test);
    74 static void g_test_dispose (GObject * object);
    78 static void my_test_dispose (GObject * object);
    75 
    79 
    76 static void signal2_handler (GTest * test, gint anint);
    80 static void signal2_handler (GTest * test, gint anint);
    77 
    81 
    78 static void g_test_set_property (GObject * object, guint prop_id,
    82 static void my_test_set_property (GObject * object, guint prop_id,
    79     const GValue * value, GParamSpec * pspec);
    83     const GValue * value, GParamSpec * pspec);
    80 static void g_test_get_property (GObject * object, guint prop_id,
    84 static void my_test_get_property (GObject * object, guint prop_id,
    81     GValue * value, GParamSpec * pspec);
    85     GValue * value, GParamSpec * pspec);
    82 
    86 
    83 static GObjectClass *parent_class = NULL;
    87 static GObjectClass *parent_class = NULL;
    84 
    88 
    85 static guint g_test_signals[LAST_SIGNAL] = { 0 };
    89 static guint my_test_signals[LAST_SIGNAL] = { 0 };
    86 
    90 
    87 static GType
    91 static GType
    88 g_test_get_type (void)
    92 my_test_get_type (void)
    89 {
    93 {
    90   static GType test_type = 0;
    94   static GType test_type = 0;
    91 
    95 
    92   if (!test_type) {
    96   if (!test_type) {
    93     static const GTypeInfo test_info = {
    97     static const GTypeInfo test_info = {
    94       sizeof (GTestClass),
    98       sizeof (GTestClass),
    95       NULL,
    99       NULL,
    96       NULL,
   100       NULL,
    97       (GClassInitFunc) g_test_class_init,
   101       (GClassInitFunc) my_test_class_init,
    98       NULL,
   102       NULL,
    99       NULL,
   103       NULL,
   100       sizeof (GTest),
   104       sizeof (GTest),
   101       0,
   105       0,
   102       (GInstanceInitFunc) g_test_init,
   106       (GInstanceInitFunc) my_test_init,
   103       NULL
   107       NULL
   104     };
   108     };
   105 
   109 
   106     grand = g_rand_new();
   110     grand = g_rand_new();
   107 
   111 
   110   }
   114   }
   111   return test_type;
   115   return test_type;
   112 }
   116 }
   113 
   117 
   114 static void
   118 static void
   115 g_test_class_init (GTestClass * klass)
   119 my_test_class_init (GTestClass * klass)
   116 {
   120 {
   117   GObjectClass *gobject_class;
   121   GObjectClass *gobject_class;
   118 
   122 
   119   gobject_class = (GObjectClass *) klass;
   123   gobject_class = (GObjectClass *) klass;
   120 
   124 
   128   if (!g_thread_supported ())
   132   if (!g_thread_supported ())
   129     g_thread_init (NULL);
   133     g_thread_init (NULL);
   130 #endif /*MULTITHREAD*/
   134 #endif /*MULTITHREAD*/
   131 
   135 
   132 #endif /*SYMBAIN*/
   136 #endif /*SYMBAIN*/
   133 
   137   gobject_class->dispose = my_test_dispose;
   134   gobject_class->dispose = g_test_dispose;
   138   gobject_class->set_property = my_test_set_property;
   135   gobject_class->set_property = g_test_set_property;
   139   gobject_class->get_property = my_test_get_property;
   136   gobject_class->get_property = g_test_get_property;
   140 
   137 
   141   my_test_signals[TEST_SIGNAL1] =
   138   g_test_signals[TEST_SIGNAL1] =
       
   139       g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass),
   142       g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass),
   140       G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal1), NULL,
   143       G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal1), NULL,
   141       NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
   144       NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
   142   g_test_signals[TEST_SIGNAL2] =
   145   my_test_signals[TEST_SIGNAL2] =
   143       g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass),
   146       g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass),
   144       G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal2), NULL,
   147       G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal2), NULL,
   145       NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
   148       NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
   146 
   149 
   147   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP,
   150   g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP,
   150 
   153 
   151   klass->test_signal2 = signal2_handler;
   154   klass->test_signal2 = signal2_handler;
   152 }
   155 }
   153 
   156 
   154 static void
   157 static void
   155 g_test_init (GTest * test)
   158 my_test_init (GTest * test)
   156 {
   159 {
   157   #ifndef SYMBIAN
   160   #ifndef SYMBIAN
   158   g_print ("init %p\n", test);
   161   g_print ("init %p\n", test);
   159   #else
   162   #else
   160   
   163   
   166 
   169 
   167   test->value = 0;
   170   test->value = 0;
   168 }
   171 }
   169 
   172 
   170 static void
   173 static void
   171 g_test_dispose (GObject * object)
   174 my_test_dispose (GObject * object)
   172 {
   175 {
   173   GTest *test;
   176   GTest *test;
   174 
   177 
   175   test = G_TEST (object);
   178   test = MY_TEST (object);
   176 
   179 
   177   g_print ("dispose %p!\n", object);
   180   g_print ("dispose %p!\n", object);
   178 
   181 
   179   G_OBJECT_CLASS (parent_class)->dispose (object);
   182   G_OBJECT_CLASS (parent_class)->dispose (object);
   180 }
   183 }
   181 
   184 
   182 static void
   185 static void
   183 g_test_set_property (GObject * object, guint prop_id,
   186 my_test_set_property (GObject * object, guint prop_id,
   184     const GValue * value, GParamSpec * pspec)
   187                       const GValue * value, GParamSpec * pspec)
   185 {
   188 {
   186   GTest *test;
   189   GTest *test;
   187 
   190 
   188   test = G_TEST (object);
   191   test = MY_TEST (object);
   189 
   192 
   190   switch (prop_id) {
   193   switch (prop_id) {
   191     case ARG_TEST_PROP:
   194     case ARG_TEST_PROP:
   192       test->value = g_value_get_int (value);
   195       test->value = g_value_get_int (value);
   193       break;
   196       break;
   196       break;
   199       break;
   197   }
   200   }
   198 }
   201 }
   199 
   202 
   200 static void
   203 static void
   201 g_test_get_property (GObject * object, guint prop_id,
   204 my_test_get_property (GObject * object, guint prop_id,
   202     GValue * value, GParamSpec * pspec)
   205                       GValue * value, GParamSpec * pspec)
   203 {
   206 {
   204   GTest *test;
   207   GTest *test;
   205 
   208 
   206   test = G_TEST (object);
   209   test = MY_TEST (object);
   207 
   210 
   208   switch (prop_id) {
   211   switch (prop_id) {
   209     case ARG_TEST_PROP:
   212     case ARG_TEST_PROP:
   210       g_value_set_int (value, test->value);
   213       g_value_set_int (value, test->value);
   211       break;
   214       break;
   214       break;
   217       break;
   215   }
   218   }
   216 }
   219 }
   217 
   220 
   218 static void
   221 static void
   219 g_test_do_signal1 (GTest * test)
   222 my_test_do_signal1 (GTest * test)
   220 {
   223 {
   221   g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL1], 0, 0);
   224   g_signal_emit (G_OBJECT (test), my_test_signals[TEST_SIGNAL1], 0, 0);
   222 }
   225 }
   223 
   226 
   224 static void
   227 static void
   225 signal2_handler (GTest * test, gint anint)
   228 signal2_handler (GTest * test, gint anint)
   226 {
   229 {
   230 	
   233 	
   231 	handlernum++;
   234 	handlernum++;
   232 }
   235 }
   233 
   236 
   234 static void
   237 static void
   235 g_test_do_signal2 (GTest * test)
   238 my_test_do_signal2 (GTest * test)
   236 {
   239 {
   237   g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL2], 0, 0);
   240   g_signal_emit (G_OBJECT (test), my_test_signals[TEST_SIGNAL2], 0, 0);
   238 }
   241 }
   239 
   242 
   240 static void
   243 static void
   241 g_test_do_prop (GTest * test)
   244 my_test_do_prop (GTest * test)
   242 {
   245 {
   243   test->value = g_rand_int (grand);
   246   test->value = g_rand_int (grand);
   244   g_object_notify (G_OBJECT (test), "test-prop");
   247   g_object_notify (G_OBJECT (test), "test-prop");
   245 }
   248 }
   246 
   249 
   251 
   254 
   252 #ifndef SYMBIAN
   255 #ifndef SYMBIAN
   253   while (!stopping)
   256   while (!stopping)
   254    {
   257    {
   255     if (TESTNUM == 1)
   258     if (TESTNUM == 1)
   256       g_test_do_signal1 (test);    
   259       my_test_do_signal1 (test);
   257     if (TESTNUM == 2)
   260     if (TESTNUM == 2)
   258       g_test_do_signal2 (test);
   261       my_test_do_signal2 (test);
   259     if (TESTNUM == 3)
   262     if (TESTNUM == 3)
   260       g_test_do_prop (test);
   263       my_test_do_prop (test);
   261     if ((i++ % 10000) == 0) {
   264     if ((i++ % 10000) == 0) {
   262       g_print (".");
   265       g_print (".");
   263      g_thread_yield();  /*force context switch */
   266       g_thread_yield(); /* force context switch */
   264     }
   267     }
   265    }
   268    }
   266 #else
   269 #else
   267 
   270 
   268 #ifdef MULTITHREAD
   271 #ifdef MULTITHREAD
   269   while (!stopping)
   272   while (!stopping)
   270    {
   273    {
   271     if (TESTNUM == 1)
   274     if (TESTNUM == 1)
   272       g_test_do_signal1 (test);
   275       my_test_do_signal1 (test);
   273     if (TESTNUM == 2)
   276     if (TESTNUM == 2)
   274       g_test_do_signal2 (test);
   277       my_test_do_signal2 (test);
   275     if (TESTNUM == 3)
   278     if (TESTNUM == 3)
   276       g_test_do_prop (test);
   279       my_test_do_prop (test);
   277     if ((i++ % 10/*000*/) == 0) 
   280     if ((i++ % 10/*000*/) == 0) 
   278     {
   281     {
   279     #ifdef VERBOSE
   282     #ifdef VERBOSE
   280       g_print (".");
   283       g_print (".");
   281     #endif  /*VERBOSE*/
   284     #endif  /*VERBOSE*/
   284    }
   287    }
   285 #else
   288 #else
   286   for(i=0;i <= LOOP;i++)    
   289   for(i=0;i <= LOOP;i++)    
   287   {
   290   {
   288     if (TESTNUM == 1)
   291     if (TESTNUM == 1)
   289       g_test_do_signal1 (test);
   292       my_test_do_signal1 (test);
   290     if (TESTNUM == 2)
   293     if (TESTNUM == 2)
   291       g_test_do_signal2 (test);
   294       my_test_do_signal2 (test);
   292     if (TESTNUM == 3)
   295     if (TESTNUM == 3)
   293       g_test_do_prop (test);  
   296       my_test_do_prop (test);  
   294     
   297     
   295     #ifdef 	VERBOSE
   298     #ifdef 	VERBOSE
   296     g_print(".");
   299     g_print(".");
   297     #endif
   300     #endif
   298   }
   301   }
   301 #endif /*SYMBIAN*/ 
   304 #endif /*SYMBIAN*/ 
   302 
   305 
   303   return NULL;
   306   return NULL;
   304 }
   307 }
   305 
   308 
   306 
       
   307 
       
   308 
       
   309 static void
   309 static void
   310 notify (GObject *object, GParamSpec *spec, gpointer user_data)
   310 notify (GObject *object, GParamSpec *spec, gpointer user_data)
   311 {
   311 {
   312   gint value;
   312   gint value;
   313   
   313   
   315 	#ifdef VERBOSE
   315 	#ifdef VERBOSE
   316 	g_print ("Function: notify called\n");
   316 	g_print ("Function: notify called\n");
   317 	#endif
   317 	#endif
   318 
   318 
   319   g_object_get (object, "test-prop", &value, NULL);
   319   g_object_get (object, "test-prop", &value, NULL);
   320   //g_print ("+ %d", value);
   320   /*g_print ("+ %d", value);*/
   321 }
   321 }
   322 
   322 
   323 #ifdef SYMBIAN
   323 #ifdef SYMBIAN
   324 void hook_function()
   324 void hook_function()
   325 {
   325 {
   339   const gint n_threads = 1;
   339   const gint n_threads = 1;
   340 
   340 
   341   #ifdef SYMBIAN
   341   #ifdef SYMBIAN
   342   g_log_set_handler (NULL,  G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
   342   g_log_set_handler (NULL,  G_LOG_FLAG_FATAL| G_LOG_FLAG_RECURSION | G_LOG_LEVEL_CRITICAL | G_LOG_LEVEL_WARNING | G_LOG_LEVEL_MESSAGE | G_LOG_LEVEL_INFO | G_LOG_LEVEL_DEBUG, &mrtLogHandler, NULL);
   343   g_set_print_handler(mrtPrintHandler);
   343   g_set_print_handler(mrtPrintHandler);
   344   #endif /*SYMBIAN*/
   344   #endif /*__SYMBIAN32__*/
   345 
   345 
   346   g_thread_init (NULL);
   346   g_thread_init (NULL);
   347   
   347   
   348   #ifndef SYMBIAN
   348   #ifndef SYMBIAN
   349   g_print ("START: %s\n", argv[0]);
   349   g_print ("START: %s\n", argv[0]);
   622 
   622 
   623 /*******************/
   623 /*******************/
   624 
   624 
   625 
   625 
   626 handlernum=0;
   626 handlernum=0;
   627 g_signal_emit(G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0);
   627 g_signal_emit(G_OBJECT (test1), my_test_signals[TEST_SIGNAL1], 0, 0);
   628 g_signal_emit(G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0);
   628 g_signal_emit(G_OBJECT (test2), my_test_signals[TEST_SIGNAL1], 0, 0);
   629 g_assert(handlernum==2);
   629 g_assert(handlernum==2);
   630 
   630 
   631 
   631 
   632 g_signal_remove_emission_hook(g_signal_lookup("test-signal1",G_TYPE_TEST),hookid);
   632 g_signal_remove_emission_hook(g_signal_lookup("test-signal1",G_TYPE_TEST),hookid);
   633 
   633 
   634 #ifdef VERBOSE
   634 #ifdef VERBOSE
   635 g_print("Emitting signal again after removing emission hook\n");
   635 g_print("Emitting signal again after removing emission hook\n");
   636 #endif
   636 #endif
   637 
   637 
   638 handlernum=0;
   638 handlernum=0;
   639 g_signal_emit (G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0);
   639 g_signal_emit (G_OBJECT (test1), my_test_signals[TEST_SIGNAL1], 0, 0);
   640 g_signal_emit (G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0);
   640 g_signal_emit (G_OBJECT (test2), my_test_signals[TEST_SIGNAL1], 0, 0);
   641 g_assert(handlernum==0);
   641 g_assert(handlernum==0);
   642 
   642 
   643 g_assert (strcmp ("test-signal1", g_signal_name (g_signal_lookup("test-signal1",G_TYPE_TEST))) == 0);
   643 g_assert (strcmp ("test-signal1", g_signal_name (g_signal_lookup("test-signal1",G_TYPE_TEST))) == 0);
   644 g_assert (strcmp ("test-signal2", g_signal_name (g_signal_lookup("test-signal2",G_TYPE_TEST))) == 0);
   644 g_assert (strcmp ("test-signal2", g_signal_name (g_signal_lookup("test-signal2",G_TYPE_TEST))) == 0);
   645 
   645 
   651 gi=0;
   651 gi=0;
   652 g_signal_list_ids(G_OBJECT_TYPE(test1),&gi);
   652 g_signal_list_ids(G_OBJECT_TYPE(test1),&gi);
   653 g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gi);
   653 g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gi);
   654 
   654 
   655 notifynum=0;
   655 notifynum=0;
   656 g_signal_emitv (&gv, g_test_signals[TEST_SIGNAL1], 0, &gv);
   656 g_signal_emitv (&gv, my_test_signals[TEST_SIGNAL1], 0, &gv);
   657 g_assert(notifynum==1);
   657 g_assert(notifynum==1);
   658 
   658 
   659 g_signal_query(g_signal_lookup("test-signal1",G_TYPE_TEST),&gq);
   659 g_signal_query(g_signal_lookup("test-signal1",G_TYPE_TEST),&gq);
   660 g_assert(strcmp("test-signal1",gq.signal_name)==0);
   660 g_assert(strcmp("test-signal1",gq.signal_name)==0);
   661 g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gq.signal_id);
   661 g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gq.signal_id);
   668 handlernum=g_signal_handlers_unblock_matched(G_OBJECT(test1),G_SIGNAL_MATCH_FUNC,g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,NULL,(gpointer)G_CALLBACK(notify),NULL);
   668 handlernum=g_signal_handlers_unblock_matched(G_OBJECT(test1),G_SIGNAL_MATCH_FUNC,g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,NULL,(gpointer)G_CALLBACK(notify),NULL);
   669 g_assert(notifynum==handlernum);
   669 g_assert(notifynum==handlernum);
   670 
   670 
   671 #endif /*MULTITHREAD*/
   671 #endif /*MULTITHREAD*/
   672 
   672 
   673 
       
   674 #ifdef VERBOSE	
   673 #ifdef VERBOSE	
   675 g_printf ("\nsignals-multithread.c: Completed all tests\n");
   674 g_printf ("\nsignals-singlethread.c: Completed all tests\n");
   676 #endif
   675 #endif
   677 
   676 
   678 #endif /*SYMBIAN*/ 
   677 #endif /*SYMBIAN*/ 
   679 
   678 
   680 
   679