|
1 /* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/ |
|
2 #include <unistd.h> |
|
3 #include <glib.h> |
|
4 #include <glib-object.h> |
|
5 |
|
6 #ifdef SYMBIAN |
|
7 #include "glib_global.h" |
|
8 #include "mrt2_glib2_test.h" |
|
9 //#define MULTITHREAD |
|
10 //#define TEST_STOP_EMISSION |
|
11 //#define VERBOSE |
|
12 #define LOOP 3 |
|
13 int TESTNUM; |
|
14 int notifynum; |
|
15 int handlernum; |
|
16 gulong hookid; |
|
17 GValue gv ; |
|
18 GSignalQuery gq; |
|
19 guint gi; |
|
20 #endif /*SYMBIAN*/ |
|
21 |
|
22 /* |
|
23 Define NULL explictly here rather than expecting e32def.h to be included! |
|
24 */ |
|
25 #define NULL 0 |
|
26 |
|
27 #define G_TYPE_TEST (g_test_get_type ()) |
|
28 #define G_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)) |
|
30 #define G_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)) |
|
32 #define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass)) |
|
33 |
|
34 static GRand *grand; |
|
35 |
|
36 typedef struct _GTest GTest; |
|
37 typedef struct _GTestClass GTestClass; |
|
38 |
|
39 struct _GTest |
|
40 { |
|
41 GObject object; |
|
42 |
|
43 gint value; |
|
44 }; |
|
45 |
|
46 struct _GTestClass |
|
47 { |
|
48 GObjectClass parent_class; |
|
49 |
|
50 void (*test_signal1) (GTest * test, gint an_int); |
|
51 void (*test_signal2) (GTest * test, gint an_int); |
|
52 }; |
|
53 |
|
54 static GType g_test_get_type (void); |
|
55 static volatile gboolean stopping; |
|
56 |
|
57 /* Element signals and args */ |
|
58 enum |
|
59 { |
|
60 TEST_SIGNAL1, |
|
61 TEST_SIGNAL2, |
|
62 /* add more above */ |
|
63 LAST_SIGNAL |
|
64 }; |
|
65 |
|
66 enum |
|
67 { |
|
68 ARG_0, |
|
69 ARG_TEST_PROP |
|
70 }; |
|
71 |
|
72 static void g_test_class_init (GTestClass * klass); |
|
73 static void g_test_init (GTest * test); |
|
74 static void g_test_dispose (GObject * object); |
|
75 |
|
76 static void signal2_handler (GTest * test, gint anint); |
|
77 |
|
78 static void g_test_set_property (GObject * object, guint prop_id, |
|
79 const GValue * value, GParamSpec * pspec); |
|
80 static void g_test_get_property (GObject * object, guint prop_id, |
|
81 GValue * value, GParamSpec * pspec); |
|
82 |
|
83 static GObjectClass *parent_class = NULL; |
|
84 |
|
85 static guint g_test_signals[LAST_SIGNAL] = { 0 }; |
|
86 |
|
87 static GType |
|
88 g_test_get_type (void) |
|
89 { |
|
90 static GType test_type = 0; |
|
91 |
|
92 if (!test_type) { |
|
93 static const GTypeInfo test_info = { |
|
94 sizeof (GTestClass), |
|
95 NULL, |
|
96 NULL, |
|
97 (GClassInitFunc) g_test_class_init, |
|
98 NULL, |
|
99 NULL, |
|
100 sizeof (GTest), |
|
101 0, |
|
102 (GInstanceInitFunc) g_test_init, |
|
103 NULL |
|
104 }; |
|
105 |
|
106 grand = g_rand_new(); |
|
107 |
|
108 test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", |
|
109 &test_info, 0); |
|
110 } |
|
111 return test_type; |
|
112 } |
|
113 |
|
114 static void |
|
115 g_test_class_init (GTestClass * klass) |
|
116 { |
|
117 GObjectClass *gobject_class; |
|
118 |
|
119 gobject_class = (GObjectClass *) klass; |
|
120 |
|
121 parent_class = g_type_class_ref (G_TYPE_OBJECT); |
|
122 #ifndef SYMBIAN |
|
123 if (!g_thread_supported ()) |
|
124 g_thread_init (NULL); |
|
125 #else |
|
126 |
|
127 #ifdef MULTITHREAD |
|
128 if (!g_thread_supported ()) |
|
129 g_thread_init (NULL); |
|
130 #endif /*MULTITHREAD*/ |
|
131 |
|
132 #endif /*SYMBAIN*/ |
|
133 |
|
134 gobject_class->dispose = g_test_dispose; |
|
135 gobject_class->set_property = g_test_set_property; |
|
136 gobject_class->get_property = g_test_get_property; |
|
137 |
|
138 g_test_signals[TEST_SIGNAL1] = |
|
139 g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass), |
|
140 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); |
|
142 g_test_signals[TEST_SIGNAL2] = |
|
143 g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass), |
|
144 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); |
|
146 |
|
147 g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP, |
|
148 g_param_spec_int ("test-prop", "Test Prop", "Test property", |
|
149 0, 1, 0, G_PARAM_READWRITE)); |
|
150 |
|
151 klass->test_signal2 = signal2_handler; |
|
152 } |
|
153 |
|
154 static void |
|
155 g_test_init (GTest * test) |
|
156 { |
|
157 #ifndef SYMBIAN |
|
158 g_print ("init %p\n", test); |
|
159 #else |
|
160 |
|
161 #ifdef VERBOSE |
|
162 g_print ("init %p\n", test); |
|
163 #endif |
|
164 |
|
165 #endif /*SYMBIAN*/ |
|
166 |
|
167 test->value = 0; |
|
168 } |
|
169 |
|
170 static void |
|
171 g_test_dispose (GObject * object) |
|
172 { |
|
173 GTest *test; |
|
174 |
|
175 test = G_TEST (object); |
|
176 |
|
177 g_print ("dispose %p!\n", object); |
|
178 |
|
179 G_OBJECT_CLASS (parent_class)->dispose (object); |
|
180 } |
|
181 |
|
182 static void |
|
183 g_test_set_property (GObject * object, guint prop_id, |
|
184 const GValue * value, GParamSpec * pspec) |
|
185 { |
|
186 GTest *test; |
|
187 |
|
188 test = G_TEST (object); |
|
189 |
|
190 switch (prop_id) { |
|
191 case ARG_TEST_PROP: |
|
192 test->value = g_value_get_int (value); |
|
193 break; |
|
194 default: |
|
195 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
|
196 break; |
|
197 } |
|
198 } |
|
199 |
|
200 static void |
|
201 g_test_get_property (GObject * object, guint prop_id, |
|
202 GValue * value, GParamSpec * pspec) |
|
203 { |
|
204 GTest *test; |
|
205 |
|
206 test = G_TEST (object); |
|
207 |
|
208 switch (prop_id) { |
|
209 case ARG_TEST_PROP: |
|
210 g_value_set_int (value, test->value); |
|
211 break; |
|
212 default: |
|
213 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
|
214 break; |
|
215 } |
|
216 } |
|
217 |
|
218 static void |
|
219 g_test_do_signal1 (GTest * test) |
|
220 { |
|
221 g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL1], 0, 0); |
|
222 } |
|
223 |
|
224 static void |
|
225 signal2_handler (GTest * test, gint anint) |
|
226 { |
|
227 #ifdef VERBOSE |
|
228 g_print ("Function: signal2_handler called\n"); |
|
229 #endif |
|
230 |
|
231 handlernum++; |
|
232 } |
|
233 |
|
234 static void |
|
235 g_test_do_signal2 (GTest * test) |
|
236 { |
|
237 g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL2], 0, 0); |
|
238 } |
|
239 |
|
240 static void |
|
241 g_test_do_prop (GTest * test) |
|
242 { |
|
243 test->value = g_rand_int (grand); |
|
244 g_object_notify (G_OBJECT (test), "test-prop"); |
|
245 } |
|
246 |
|
247 static gpointer |
|
248 run_thread (GTest * test) |
|
249 { |
|
250 gint i = 1; |
|
251 |
|
252 #ifndef SYMBIAN |
|
253 while (!stopping) |
|
254 { |
|
255 if (TESTNUM == 1) |
|
256 g_test_do_signal1 (test); |
|
257 if (TESTNUM == 2) |
|
258 g_test_do_signal2 (test); |
|
259 if (TESTNUM == 3) |
|
260 g_test_do_prop (test); |
|
261 if ((i++ % 10000) == 0) { |
|
262 g_print ("."); |
|
263 g_thread_yield(); /*force context switch */ |
|
264 } |
|
265 } |
|
266 #else |
|
267 |
|
268 #ifdef MULTITHREAD |
|
269 while (!stopping) |
|
270 { |
|
271 if (TESTNUM == 1) |
|
272 g_test_do_signal1 (test); |
|
273 if (TESTNUM == 2) |
|
274 g_test_do_signal2 (test); |
|
275 if (TESTNUM == 3) |
|
276 g_test_do_prop (test); |
|
277 if ((i++ % 10/*000*/) == 0) |
|
278 { |
|
279 #ifdef VERBOSE |
|
280 g_print ("."); |
|
281 #endif /*VERBOSE*/ |
|
282 g_thread_yield(); /* force context switch */ |
|
283 } |
|
284 } |
|
285 #else |
|
286 for(i=0;i <= LOOP;i++) |
|
287 { |
|
288 if (TESTNUM == 1) |
|
289 g_test_do_signal1 (test); |
|
290 if (TESTNUM == 2) |
|
291 g_test_do_signal2 (test); |
|
292 if (TESTNUM == 3) |
|
293 g_test_do_prop (test); |
|
294 |
|
295 #ifdef VERBOSE |
|
296 g_print("."); |
|
297 #endif |
|
298 } |
|
299 #endif /*MULTITHREAD*/ |
|
300 |
|
301 #endif /*SYMBIAN*/ |
|
302 |
|
303 return NULL; |
|
304 } |
|
305 |
|
306 |
|
307 |
|
308 |
|
309 static void |
|
310 notify (GObject *object, GParamSpec *spec, gpointer user_data) |
|
311 { |
|
312 gint value; |
|
313 |
|
314 notifynum++; |
|
315 #ifdef VERBOSE |
|
316 g_print ("Function: notify called\n"); |
|
317 #endif |
|
318 |
|
319 g_object_get (object, "test-prop", &value, NULL); |
|
320 //g_print ("+ %d", value); |
|
321 } |
|
322 |
|
323 #ifdef SYMBIAN |
|
324 void hook_function() |
|
325 { |
|
326 #ifdef VERBOSE |
|
327 g_print ("Function: hook_function called\n"); |
|
328 #endif |
|
329 handlernum++; |
|
330 } |
|
331 #endif |
|
332 |
|
333 int |
|
334 main (int argc, char **argv) |
|
335 { |
|
336 gint i; |
|
337 GTest *test1, *test2; |
|
338 GArray *test_threads; |
|
339 const gint n_threads = 1; |
|
340 |
|
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); |
|
343 g_set_print_handler(mrtPrintHandler); |
|
344 #endif /*SYMBIAN*/ |
|
345 |
|
346 g_thread_init (NULL); |
|
347 |
|
348 #ifndef SYMBIAN |
|
349 g_print ("START: %s\n", argv[0]); |
|
350 #else |
|
351 |
|
352 #ifdef VERBOSE |
|
353 g_print ("START: %s\n", argv[0]); |
|
354 #endif |
|
355 |
|
356 #endif /*SYMBIAN*/ |
|
357 g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK)); |
|
358 g_type_init (); |
|
359 |
|
360 test1 = g_object_new (G_TYPE_TEST, NULL); |
|
361 test2 = g_object_new (G_TYPE_TEST, NULL); |
|
362 |
|
363 g_signal_connect (test1, "notify::test-prop", G_CALLBACK (notify), NULL); |
|
364 g_signal_connect (test1, "test-signal1", G_CALLBACK (notify), NULL); |
|
365 g_signal_connect (test1, "test-signal2", G_CALLBACK (notify), NULL); |
|
366 |
|
367 |
|
368 |
|
369 |
|
370 #ifndef SYMBIAN |
|
371 test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *)); |
|
372 |
|
373 stopping = FALSE; |
|
374 |
|
375 for (i = 0; i < n_threads; i++) { |
|
376 GThread *thread; |
|
377 |
|
378 thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL); |
|
379 g_array_append_val (test_threads, thread); |
|
380 |
|
381 thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL); |
|
382 g_array_append_val (test_threads, thread); |
|
383 } |
|
384 g_usleep (500000); |
|
385 |
|
386 stopping = TRUE; |
|
387 |
|
388 g_print ("\nstopping\n"); |
|
389 |
|
390 /* join all threads */ |
|
391 for (i = 0; i < 2 * n_threads; i++) { |
|
392 GThread *thread; |
|
393 |
|
394 thread = g_array_index (test_threads, GThread *, i); |
|
395 g_thread_join (thread); |
|
396 } |
|
397 |
|
398 g_print ("stopped:%d\n",TESTNUM); |
|
399 #else |
|
400 |
|
401 #ifdef MULTITHREAD |
|
402 |
|
403 test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *)); |
|
404 stopping = FALSE; |
|
405 TESTNUM=1; |
|
406 notifynum=0; |
|
407 handlernum=0; |
|
408 for (i = 0; i < n_threads; i++) |
|
409 { |
|
410 GThread *thread; |
|
411 |
|
412 thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL); |
|
413 g_array_append_val (test_threads, thread); |
|
414 |
|
415 thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL); |
|
416 g_array_append_val (test_threads, thread); |
|
417 } |
|
418 g_usleep (500000); |
|
419 |
|
420 stopping = TRUE; |
|
421 |
|
422 #ifdef VERBOSE |
|
423 g_print ("\nstopping\n"); |
|
424 #endif |
|
425 /* join all threads */ |
|
426 for (i = 0; i < 2 * n_threads; i++) |
|
427 { |
|
428 GThread *thread; |
|
429 |
|
430 thread = g_array_index (test_threads, GThread *, i); |
|
431 g_thread_join (thread); |
|
432 } |
|
433 |
|
434 g_assert(notifynum != 0); |
|
435 g_assert(handlernum == 0); |
|
436 |
|
437 g_array_free (test_threads, TRUE); |
|
438 |
|
439 #ifdef VERBOSE |
|
440 g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM); |
|
441 #endif |
|
442 |
|
443 |
|
444 |
|
445 test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *)); |
|
446 stopping = FALSE; |
|
447 TESTNUM=2; |
|
448 notifynum=0; |
|
449 handlernum=0; |
|
450 |
|
451 for (i = 0; i < n_threads; i++) |
|
452 { |
|
453 GThread *thread; |
|
454 |
|
455 thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL); |
|
456 g_array_append_val (test_threads, thread); |
|
457 |
|
458 thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL); |
|
459 g_array_append_val (test_threads, thread); |
|
460 } |
|
461 g_usleep (500000); |
|
462 |
|
463 stopping = TRUE; |
|
464 |
|
465 #ifdef VERBOSE |
|
466 g_print ("\nstopping\n"); |
|
467 #endif |
|
468 /* join all threads */ |
|
469 for (i = 0; i < 2 * n_threads; i++) |
|
470 { |
|
471 GThread *thread; |
|
472 |
|
473 thread = g_array_index (test_threads, GThread *, i); |
|
474 g_thread_join (thread); |
|
475 } |
|
476 |
|
477 g_assert(notifynum != 0); |
|
478 g_assert(handlernum != 0); |
|
479 |
|
480 g_array_free (test_threads, TRUE); |
|
481 |
|
482 #ifdef VERBOSE |
|
483 g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM); |
|
484 #endif |
|
485 |
|
486 |
|
487 test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *)); |
|
488 stopping = FALSE; |
|
489 TESTNUM=3; |
|
490 notifynum=0; |
|
491 handlernum=0; |
|
492 |
|
493 for (i = 0; i < n_threads; i++) |
|
494 { |
|
495 GThread *thread; |
|
496 |
|
497 thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL); |
|
498 g_array_append_val (test_threads, thread); |
|
499 |
|
500 thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL); |
|
501 g_array_append_val (test_threads, thread); |
|
502 } |
|
503 g_usleep (5000000); |
|
504 |
|
505 stopping = TRUE; |
|
506 |
|
507 #ifdef VERBOSE |
|
508 g_print ("\nstopping\n"); |
|
509 #endif |
|
510 /* join all threads */ |
|
511 for (i = 0; i < 2 * n_threads; i++) |
|
512 { |
|
513 GThread *thread; |
|
514 |
|
515 thread = g_array_index (test_threads, GThread *, i); |
|
516 g_thread_join (thread); |
|
517 } |
|
518 |
|
519 g_assert(notifynum != 0); |
|
520 g_assert(handlernum == 0); |
|
521 |
|
522 g_array_free (test_threads, TRUE); |
|
523 |
|
524 #ifdef VERBOSE |
|
525 g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM); |
|
526 #endif |
|
527 |
|
528 #else /* ! MULTITHREAD*/ |
|
529 |
|
530 |
|
531 TESTNUM=1; |
|
532 #ifdef VERBOSE |
|
533 g_print ("\nStarting with TESTNUM=%d\n",TESTNUM); |
|
534 #endif |
|
535 |
|
536 notifynum=0; |
|
537 handlernum=0; |
|
538 run_thread(test1); |
|
539 g_assert(notifynum == LOOP +1); |
|
540 g_assert(handlernum ==0); |
|
541 |
|
542 notifynum=0; |
|
543 handlernum=0; |
|
544 run_thread(test2); |
|
545 g_assert(notifynum == 0); |
|
546 g_assert(handlernum == 0); |
|
547 |
|
548 TESTNUM=2; |
|
549 #ifdef VERBOSE |
|
550 g_print ("\nStarting with TESTNUM=%d\n",TESTNUM); |
|
551 #endif |
|
552 |
|
553 notifynum=0; |
|
554 handlernum=0; |
|
555 run_thread(test1); |
|
556 g_assert(notifynum == LOOP+1); |
|
557 g_assert(handlernum == LOOP+1); |
|
558 |
|
559 notifynum=0; |
|
560 handlernum=0; |
|
561 run_thread(test2); |
|
562 g_assert(notifynum == 0); |
|
563 g_assert(handlernum == LOOP+1); |
|
564 |
|
565 TESTNUM=3; |
|
566 #ifdef VERBOSE |
|
567 g_print ("\nStarting with TESTNUM=%d\n",TESTNUM); |
|
568 #endif |
|
569 |
|
570 notifynum=0; |
|
571 handlernum=0; |
|
572 run_thread(test1); |
|
573 g_assert(notifynum == LOOP +1); |
|
574 g_assert(handlernum ==0); |
|
575 |
|
576 notifynum=0; |
|
577 handlernum=0; |
|
578 run_thread(test2); |
|
579 g_assert(notifynum == 0); |
|
580 g_assert(handlernum == 0); |
|
581 |
|
582 g_assert(g_signal_has_handler_pending(G_OBJECT(test1),g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,TRUE)==TRUE); |
|
583 g_assert(g_signal_has_handler_pending(G_OBJECT(test2),g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,TRUE)==FALSE); |
|
584 |
|
585 g_assert(g_signal_handler_is_connected(G_OBJECT(test1),g_signal_lookup("test-signal1",G_TYPE_TEST))==TRUE); |
|
586 g_assert(g_signal_handler_is_connected(G_OBJECT(test2),g_signal_lookup("test-signal2",G_TYPE_TEST))==FALSE); |
|
587 |
|
588 handlernum=g_signal_lookup("test-signal1",G_TYPE_TEST); |
|
589 #ifdef VERBOSE |
|
590 g_print("Signal id: %d\n",handlernum); |
|
591 #endif |
|
592 |
|
593 g_signal_connect (test2, "test-signal1", G_CALLBACK (notify), NULL); |
|
594 |
|
595 hookid=g_signal_add_emission_hook(handlernum,NULL,(GSignalEmissionHook) hook_function,NULL,NULL); |
|
596 |
|
597 #ifdef VERBOSE |
|
598 g_print("Hookid: %d\n",hookid); |
|
599 #endif |
|
600 /********************/ |
|
601 |
|
602 #ifdef TEST_STOP_EMISSION |
|
603 /* |
|
604 notifynum=0; |
|
605 handlernum=0; |
|
606 g_print("The following call stops signal emission\n"); |
|
607 g_signal_stop_emission(G_OBJECT(test1),g_signal_lookup("test-signal1",G_TYPE_TEST),0); |
|
608 |
|
609 g_print("The following call should abort and it is normal\n"); |
|
610 run_thread(test1); |
|
611 printf("Notifynum: %d and Handlernum: %d\n",notifynum,handlernum); |
|
612 |
|
613 */ |
|
614 notifynum=0; |
|
615 handlernum=0; |
|
616 g_signal_stop_emission_by_name(G_OBJECT(test1),"test-signal1"); |
|
617 //run_thread(test1); |
|
618 g_print("Notifynum: %d and Handlernum: %d\n",notifynum,handlernum); |
|
619 |
|
620 |
|
621 #endif /*TEST_STOP_EMISSION*/ |
|
622 |
|
623 /*******************/ |
|
624 |
|
625 |
|
626 handlernum=0; |
|
627 g_signal_emit(G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0); |
|
628 g_signal_emit(G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0); |
|
629 g_assert(handlernum==2); |
|
630 |
|
631 |
|
632 g_signal_remove_emission_hook(g_signal_lookup("test-signal1",G_TYPE_TEST),hookid); |
|
633 |
|
634 #ifdef VERBOSE |
|
635 g_print("Emitting signal again after removing emission hook\n"); |
|
636 #endif |
|
637 |
|
638 handlernum=0; |
|
639 g_signal_emit (G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0); |
|
640 g_signal_emit (G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0); |
|
641 g_assert(handlernum==0); |
|
642 |
|
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); |
|
645 |
|
646 |
|
647 memset(&gv,0,sizeof(gv)); |
|
648 g_value_init(&gv,G_TYPE_OBJECT); |
|
649 g_value_set_object(&gv,test1); |
|
650 |
|
651 gi=0; |
|
652 g_signal_list_ids(G_OBJECT_TYPE(test1),&gi); |
|
653 g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gi); |
|
654 |
|
655 notifynum=0; |
|
656 g_signal_emitv (&gv, g_test_signals[TEST_SIGNAL1], 0, &gv); |
|
657 g_assert(notifynum==1); |
|
658 |
|
659 g_signal_query(g_signal_lookup("test-signal1",G_TYPE_TEST),&gq); |
|
660 g_assert(strcmp("test-signal1",gq.signal_name)==0); |
|
661 g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gq.signal_id); |
|
662 |
|
663 |
|
664 g_assert(g_signal_handler_find(G_OBJECT(test1), G_SIGNAL_RUN_LAST,g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,NULL,NULL,NULL)==2); |
|
665 |
|
666 |
|
667 notifynum=g_signal_handlers_block_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); |
|
670 |
|
671 #endif /*MULTITHREAD*/ |
|
672 |
|
673 |
|
674 #ifdef VERBOSE |
|
675 g_printf ("\nsignals-multithread.c: Completed all tests\n"); |
|
676 #endif |
|
677 |
|
678 #endif /*SYMBIAN*/ |
|
679 |
|
680 |
|
681 |
|
682 #if SYMBIAN |
|
683 testResultXml("signals-singlethread"); |
|
684 #endif /* EMULATOR */ |
|
685 |
|
686 return 0; |
|
687 } |