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