1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/glib/tsrc/BC/tests/refcount/signals-singlethread.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,687 @@
1.4 +/* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
1.5 +#include <unistd.h>
1.6 +#include <glib.h>
1.7 +#include <glib-object.h>
1.8 +
1.9 +#ifdef SYMBIAN
1.10 +#include "glib_global.h"
1.11 +#include "mrt2_glib2_test.h"
1.12 +//#define MULTITHREAD
1.13 +//#define TEST_STOP_EMISSION
1.14 +//#define VERBOSE
1.15 +#define LOOP 3
1.16 +int TESTNUM;
1.17 +int notifynum;
1.18 +int handlernum;
1.19 +gulong hookid;
1.20 +GValue gv ;
1.21 +GSignalQuery gq;
1.22 +guint gi;
1.23 +#endif /*SYMBIAN*/
1.24 +
1.25 +/*
1.26 +Define NULL explictly here rather than expecting e32def.h to be included!
1.27 +*/
1.28 +#define NULL 0
1.29 +
1.30 +#define G_TYPE_TEST (g_test_get_type ())
1.31 +#define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
1.32 +#define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
1.33 +#define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
1.34 +#define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
1.35 +#define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
1.36 +
1.37 +static GRand *grand;
1.38 +
1.39 +typedef struct _GTest GTest;
1.40 +typedef struct _GTestClass GTestClass;
1.41 +
1.42 +struct _GTest
1.43 +{
1.44 + GObject object;
1.45 +
1.46 + gint value;
1.47 +};
1.48 +
1.49 +struct _GTestClass
1.50 +{
1.51 + GObjectClass parent_class;
1.52 +
1.53 + void (*test_signal1) (GTest * test, gint an_int);
1.54 + void (*test_signal2) (GTest * test, gint an_int);
1.55 +};
1.56 +
1.57 +static GType g_test_get_type (void);
1.58 +static volatile gboolean stopping;
1.59 +
1.60 +/* Element signals and args */
1.61 +enum
1.62 +{
1.63 + TEST_SIGNAL1,
1.64 + TEST_SIGNAL2,
1.65 + /* add more above */
1.66 + LAST_SIGNAL
1.67 +};
1.68 +
1.69 +enum
1.70 +{
1.71 + ARG_0,
1.72 + ARG_TEST_PROP
1.73 +};
1.74 +
1.75 +static void g_test_class_init (GTestClass * klass);
1.76 +static void g_test_init (GTest * test);
1.77 +static void g_test_dispose (GObject * object);
1.78 +
1.79 +static void signal2_handler (GTest * test, gint anint);
1.80 +
1.81 +static void g_test_set_property (GObject * object, guint prop_id,
1.82 + const GValue * value, GParamSpec * pspec);
1.83 +static void g_test_get_property (GObject * object, guint prop_id,
1.84 + GValue * value, GParamSpec * pspec);
1.85 +
1.86 +static GObjectClass *parent_class = NULL;
1.87 +
1.88 +static guint g_test_signals[LAST_SIGNAL] = { 0 };
1.89 +
1.90 +static GType
1.91 +g_test_get_type (void)
1.92 +{
1.93 + static GType test_type = 0;
1.94 +
1.95 + if (!test_type) {
1.96 + static const GTypeInfo test_info = {
1.97 + sizeof (GTestClass),
1.98 + NULL,
1.99 + NULL,
1.100 + (GClassInitFunc) g_test_class_init,
1.101 + NULL,
1.102 + NULL,
1.103 + sizeof (GTest),
1.104 + 0,
1.105 + (GInstanceInitFunc) g_test_init,
1.106 + NULL
1.107 + };
1.108 +
1.109 + grand = g_rand_new();
1.110 +
1.111 + test_type = g_type_register_static (G_TYPE_OBJECT, "GTest",
1.112 + &test_info, 0);
1.113 + }
1.114 + return test_type;
1.115 +}
1.116 +
1.117 +static void
1.118 +g_test_class_init (GTestClass * klass)
1.119 +{
1.120 + GObjectClass *gobject_class;
1.121 +
1.122 + gobject_class = (GObjectClass *) klass;
1.123 +
1.124 + parent_class = g_type_class_ref (G_TYPE_OBJECT);
1.125 +#ifndef SYMBIAN
1.126 + if (!g_thread_supported ())
1.127 + g_thread_init (NULL);
1.128 +#else
1.129 +
1.130 +#ifdef MULTITHREAD
1.131 + if (!g_thread_supported ())
1.132 + g_thread_init (NULL);
1.133 +#endif /*MULTITHREAD*/
1.134 +
1.135 +#endif /*SYMBAIN*/
1.136 +
1.137 + gobject_class->dispose = g_test_dispose;
1.138 + gobject_class->set_property = g_test_set_property;
1.139 + gobject_class->get_property = g_test_get_property;
1.140 +
1.141 + g_test_signals[TEST_SIGNAL1] =
1.142 + g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass),
1.143 + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal1), NULL,
1.144 + NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
1.145 + g_test_signals[TEST_SIGNAL2] =
1.146 + g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass),
1.147 + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal2), NULL,
1.148 + NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
1.149 +
1.150 + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP,
1.151 + g_param_spec_int ("test-prop", "Test Prop", "Test property",
1.152 + 0, 1, 0, G_PARAM_READWRITE));
1.153 +
1.154 + klass->test_signal2 = signal2_handler;
1.155 +}
1.156 +
1.157 +static void
1.158 +g_test_init (GTest * test)
1.159 +{
1.160 + #ifndef SYMBIAN
1.161 + g_print ("init %p\n", test);
1.162 + #else
1.163 +
1.164 + #ifdef VERBOSE
1.165 + g_print ("init %p\n", test);
1.166 + #endif
1.167 +
1.168 + #endif /*SYMBIAN*/
1.169 +
1.170 + test->value = 0;
1.171 +}
1.172 +
1.173 +static void
1.174 +g_test_dispose (GObject * object)
1.175 +{
1.176 + GTest *test;
1.177 +
1.178 + test = G_TEST (object);
1.179 +
1.180 + g_print ("dispose %p!\n", object);
1.181 +
1.182 + G_OBJECT_CLASS (parent_class)->dispose (object);
1.183 +}
1.184 +
1.185 +static void
1.186 +g_test_set_property (GObject * object, guint prop_id,
1.187 + const GValue * value, GParamSpec * pspec)
1.188 +{
1.189 + GTest *test;
1.190 +
1.191 + test = G_TEST (object);
1.192 +
1.193 + switch (prop_id) {
1.194 + case ARG_TEST_PROP:
1.195 + test->value = g_value_get_int (value);
1.196 + break;
1.197 + default:
1.198 + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1.199 + break;
1.200 + }
1.201 +}
1.202 +
1.203 +static void
1.204 +g_test_get_property (GObject * object, guint prop_id,
1.205 + GValue * value, GParamSpec * pspec)
1.206 +{
1.207 + GTest *test;
1.208 +
1.209 + test = G_TEST (object);
1.210 +
1.211 + switch (prop_id) {
1.212 + case ARG_TEST_PROP:
1.213 + g_value_set_int (value, test->value);
1.214 + break;
1.215 + default:
1.216 + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1.217 + break;
1.218 + }
1.219 +}
1.220 +
1.221 +static void
1.222 +g_test_do_signal1 (GTest * test)
1.223 +{
1.224 + g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL1], 0, 0);
1.225 +}
1.226 +
1.227 +static void
1.228 +signal2_handler (GTest * test, gint anint)
1.229 +{
1.230 + #ifdef VERBOSE
1.231 + g_print ("Function: signal2_handler called\n");
1.232 + #endif
1.233 +
1.234 + handlernum++;
1.235 +}
1.236 +
1.237 +static void
1.238 +g_test_do_signal2 (GTest * test)
1.239 +{
1.240 + g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL2], 0, 0);
1.241 +}
1.242 +
1.243 +static void
1.244 +g_test_do_prop (GTest * test)
1.245 +{
1.246 + test->value = g_rand_int (grand);
1.247 + g_object_notify (G_OBJECT (test), "test-prop");
1.248 +}
1.249 +
1.250 +static gpointer
1.251 +run_thread (GTest * test)
1.252 +{
1.253 + gint i = 1;
1.254 +
1.255 +#ifndef SYMBIAN
1.256 + while (!stopping)
1.257 + {
1.258 + if (TESTNUM == 1)
1.259 + g_test_do_signal1 (test);
1.260 + if (TESTNUM == 2)
1.261 + g_test_do_signal2 (test);
1.262 + if (TESTNUM == 3)
1.263 + g_test_do_prop (test);
1.264 + if ((i++ % 10000) == 0) {
1.265 + g_print (".");
1.266 + g_thread_yield(); /*force context switch */
1.267 + }
1.268 + }
1.269 +#else
1.270 +
1.271 +#ifdef MULTITHREAD
1.272 + while (!stopping)
1.273 + {
1.274 + if (TESTNUM == 1)
1.275 + g_test_do_signal1 (test);
1.276 + if (TESTNUM == 2)
1.277 + g_test_do_signal2 (test);
1.278 + if (TESTNUM == 3)
1.279 + g_test_do_prop (test);
1.280 + if ((i++ % 10/*000*/) == 0)
1.281 + {
1.282 + #ifdef VERBOSE
1.283 + g_print (".");
1.284 + #endif /*VERBOSE*/
1.285 + g_thread_yield(); /* force context switch */
1.286 + }
1.287 + }
1.288 +#else
1.289 + for(i=0;i <= LOOP;i++)
1.290 + {
1.291 + if (TESTNUM == 1)
1.292 + g_test_do_signal1 (test);
1.293 + if (TESTNUM == 2)
1.294 + g_test_do_signal2 (test);
1.295 + if (TESTNUM == 3)
1.296 + g_test_do_prop (test);
1.297 +
1.298 + #ifdef VERBOSE
1.299 + g_print(".");
1.300 + #endif
1.301 + }
1.302 +#endif /*MULTITHREAD*/
1.303 +
1.304 +#endif /*SYMBIAN*/
1.305 +
1.306 + return NULL;
1.307 +}
1.308 +
1.309 +
1.310 +
1.311 +
1.312 +static void
1.313 +notify (GObject *object, GParamSpec *spec, gpointer user_data)
1.314 +{
1.315 + gint value;
1.316 +
1.317 + notifynum++;
1.318 + #ifdef VERBOSE
1.319 + g_print ("Function: notify called\n");
1.320 + #endif
1.321 +
1.322 + g_object_get (object, "test-prop", &value, NULL);
1.323 + //g_print ("+ %d", value);
1.324 +}
1.325 +
1.326 +#ifdef SYMBIAN
1.327 +void hook_function()
1.328 +{
1.329 + #ifdef VERBOSE
1.330 + g_print ("Function: hook_function called\n");
1.331 + #endif
1.332 + handlernum++;
1.333 +}
1.334 +#endif
1.335 +
1.336 +int
1.337 +main (int argc, char **argv)
1.338 +{
1.339 + gint i;
1.340 + GTest *test1, *test2;
1.341 + GArray *test_threads;
1.342 + const gint n_threads = 1;
1.343 +
1.344 + #ifdef SYMBIAN
1.345 + 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);
1.346 + g_set_print_handler(mrtPrintHandler);
1.347 + #endif /*SYMBIAN*/
1.348 +
1.349 + g_thread_init (NULL);
1.350 +
1.351 + #ifndef SYMBIAN
1.352 + g_print ("START: %s\n", argv[0]);
1.353 + #else
1.354 +
1.355 + #ifdef VERBOSE
1.356 + g_print ("START: %s\n", argv[0]);
1.357 + #endif
1.358 +
1.359 + #endif /*SYMBIAN*/
1.360 + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
1.361 + g_type_init ();
1.362 +
1.363 + test1 = g_object_new (G_TYPE_TEST, NULL);
1.364 + test2 = g_object_new (G_TYPE_TEST, NULL);
1.365 +
1.366 + g_signal_connect (test1, "notify::test-prop", G_CALLBACK (notify), NULL);
1.367 + g_signal_connect (test1, "test-signal1", G_CALLBACK (notify), NULL);
1.368 + g_signal_connect (test1, "test-signal2", G_CALLBACK (notify), NULL);
1.369 +
1.370 +
1.371 +
1.372 +
1.373 +#ifndef SYMBIAN
1.374 + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
1.375 +
1.376 + stopping = FALSE;
1.377 +
1.378 + for (i = 0; i < n_threads; i++) {
1.379 + GThread *thread;
1.380 +
1.381 + thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
1.382 + g_array_append_val (test_threads, thread);
1.383 +
1.384 + thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
1.385 + g_array_append_val (test_threads, thread);
1.386 + }
1.387 + g_usleep (500000);
1.388 +
1.389 + stopping = TRUE;
1.390 +
1.391 + g_print ("\nstopping\n");
1.392 +
1.393 + /* join all threads */
1.394 + for (i = 0; i < 2 * n_threads; i++) {
1.395 + GThread *thread;
1.396 +
1.397 + thread = g_array_index (test_threads, GThread *, i);
1.398 + g_thread_join (thread);
1.399 + }
1.400 +
1.401 + g_print ("stopped:%d\n",TESTNUM);
1.402 +#else
1.403 +
1.404 +#ifdef MULTITHREAD
1.405 +
1.406 + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
1.407 + stopping = FALSE;
1.408 + TESTNUM=1;
1.409 + notifynum=0;
1.410 + handlernum=0;
1.411 + for (i = 0; i < n_threads; i++)
1.412 + {
1.413 + GThread *thread;
1.414 +
1.415 + thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
1.416 + g_array_append_val (test_threads, thread);
1.417 +
1.418 + thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
1.419 + g_array_append_val (test_threads, thread);
1.420 + }
1.421 + g_usleep (500000);
1.422 +
1.423 + stopping = TRUE;
1.424 +
1.425 + #ifdef VERBOSE
1.426 + g_print ("\nstopping\n");
1.427 + #endif
1.428 + /* join all threads */
1.429 + for (i = 0; i < 2 * n_threads; i++)
1.430 + {
1.431 + GThread *thread;
1.432 +
1.433 + thread = g_array_index (test_threads, GThread *, i);
1.434 + g_thread_join (thread);
1.435 + }
1.436 +
1.437 + g_assert(notifynum != 0);
1.438 + g_assert(handlernum == 0);
1.439 +
1.440 + g_array_free (test_threads, TRUE);
1.441 +
1.442 + #ifdef VERBOSE
1.443 + g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
1.444 + #endif
1.445 +
1.446 +
1.447 +
1.448 + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
1.449 + stopping = FALSE;
1.450 + TESTNUM=2;
1.451 + notifynum=0;
1.452 + handlernum=0;
1.453 +
1.454 + for (i = 0; i < n_threads; i++)
1.455 + {
1.456 + GThread *thread;
1.457 +
1.458 + thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
1.459 + g_array_append_val (test_threads, thread);
1.460 +
1.461 + thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
1.462 + g_array_append_val (test_threads, thread);
1.463 + }
1.464 + g_usleep (500000);
1.465 +
1.466 + stopping = TRUE;
1.467 +
1.468 + #ifdef VERBOSE
1.469 + g_print ("\nstopping\n");
1.470 + #endif
1.471 + /* join all threads */
1.472 + for (i = 0; i < 2 * n_threads; i++)
1.473 + {
1.474 + GThread *thread;
1.475 +
1.476 + thread = g_array_index (test_threads, GThread *, i);
1.477 + g_thread_join (thread);
1.478 + }
1.479 +
1.480 + g_assert(notifynum != 0);
1.481 + g_assert(handlernum != 0);
1.482 +
1.483 + g_array_free (test_threads, TRUE);
1.484 +
1.485 + #ifdef VERBOSE
1.486 + g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
1.487 + #endif
1.488 +
1.489 +
1.490 + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
1.491 + stopping = FALSE;
1.492 + TESTNUM=3;
1.493 + notifynum=0;
1.494 + handlernum=0;
1.495 +
1.496 + for (i = 0; i < n_threads; i++)
1.497 + {
1.498 + GThread *thread;
1.499 +
1.500 + thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
1.501 + g_array_append_val (test_threads, thread);
1.502 +
1.503 + thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
1.504 + g_array_append_val (test_threads, thread);
1.505 + }
1.506 + g_usleep (5000000);
1.507 +
1.508 + stopping = TRUE;
1.509 +
1.510 + #ifdef VERBOSE
1.511 + g_print ("\nstopping\n");
1.512 + #endif
1.513 + /* join all threads */
1.514 + for (i = 0; i < 2 * n_threads; i++)
1.515 + {
1.516 + GThread *thread;
1.517 +
1.518 + thread = g_array_index (test_threads, GThread *, i);
1.519 + g_thread_join (thread);
1.520 + }
1.521 +
1.522 + g_assert(notifynum != 0);
1.523 + g_assert(handlernum == 0);
1.524 +
1.525 + g_array_free (test_threads, TRUE);
1.526 +
1.527 + #ifdef VERBOSE
1.528 + g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
1.529 + #endif
1.530 +
1.531 +#else /* ! MULTITHREAD*/
1.532 +
1.533 +
1.534 +TESTNUM=1;
1.535 +#ifdef VERBOSE
1.536 +g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
1.537 +#endif
1.538 +
1.539 +notifynum=0;
1.540 +handlernum=0;
1.541 +run_thread(test1);
1.542 +g_assert(notifynum == LOOP +1);
1.543 +g_assert(handlernum ==0);
1.544 +
1.545 +notifynum=0;
1.546 +handlernum=0;
1.547 +run_thread(test2);
1.548 +g_assert(notifynum == 0);
1.549 +g_assert(handlernum == 0);
1.550 +
1.551 +TESTNUM=2;
1.552 +#ifdef VERBOSE
1.553 +g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
1.554 +#endif
1.555 +
1.556 +notifynum=0;
1.557 +handlernum=0;
1.558 +run_thread(test1);
1.559 +g_assert(notifynum == LOOP+1);
1.560 +g_assert(handlernum == LOOP+1);
1.561 +
1.562 +notifynum=0;
1.563 +handlernum=0;
1.564 +run_thread(test2);
1.565 +g_assert(notifynum == 0);
1.566 +g_assert(handlernum == LOOP+1);
1.567 +
1.568 +TESTNUM=3;
1.569 +#ifdef VERBOSE
1.570 +g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
1.571 +#endif
1.572 +
1.573 +notifynum=0;
1.574 +handlernum=0;
1.575 +run_thread(test1);
1.576 +g_assert(notifynum == LOOP +1);
1.577 +g_assert(handlernum ==0);
1.578 +
1.579 +notifynum=0;
1.580 +handlernum=0;
1.581 +run_thread(test2);
1.582 +g_assert(notifynum == 0);
1.583 +g_assert(handlernum == 0);
1.584 +
1.585 +g_assert(g_signal_has_handler_pending(G_OBJECT(test1),g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,TRUE)==TRUE);
1.586 +g_assert(g_signal_has_handler_pending(G_OBJECT(test2),g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,TRUE)==FALSE);
1.587 +
1.588 +g_assert(g_signal_handler_is_connected(G_OBJECT(test1),g_signal_lookup("test-signal1",G_TYPE_TEST))==TRUE);
1.589 +g_assert(g_signal_handler_is_connected(G_OBJECT(test2),g_signal_lookup("test-signal2",G_TYPE_TEST))==FALSE);
1.590 +
1.591 +handlernum=g_signal_lookup("test-signal1",G_TYPE_TEST);
1.592 +#ifdef VERBOSE
1.593 +g_print("Signal id: %d\n",handlernum);
1.594 +#endif
1.595 +
1.596 +g_signal_connect (test2, "test-signal1", G_CALLBACK (notify), NULL);
1.597 +
1.598 +hookid=g_signal_add_emission_hook(handlernum,NULL,(GSignalEmissionHook) hook_function,NULL,NULL);
1.599 +
1.600 +#ifdef VERBOSE
1.601 +g_print("Hookid: %d\n",hookid);
1.602 +#endif
1.603 +/********************/
1.604 +
1.605 +#ifdef TEST_STOP_EMISSION
1.606 +/*
1.607 +notifynum=0;
1.608 +handlernum=0;
1.609 +g_print("The following call stops signal emission\n");
1.610 +g_signal_stop_emission(G_OBJECT(test1),g_signal_lookup("test-signal1",G_TYPE_TEST),0);
1.611 +
1.612 +g_print("The following call should abort and it is normal\n");
1.613 +run_thread(test1);
1.614 +printf("Notifynum: %d and Handlernum: %d\n",notifynum,handlernum);
1.615 +
1.616 +*/
1.617 +notifynum=0;
1.618 +handlernum=0;
1.619 +g_signal_stop_emission_by_name(G_OBJECT(test1),"test-signal1");
1.620 +//run_thread(test1);
1.621 +g_print("Notifynum: %d and Handlernum: %d\n",notifynum,handlernum);
1.622 +
1.623 +
1.624 +#endif /*TEST_STOP_EMISSION*/
1.625 +
1.626 +/*******************/
1.627 +
1.628 +
1.629 +handlernum=0;
1.630 +g_signal_emit(G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0);
1.631 +g_signal_emit(G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0);
1.632 +g_assert(handlernum==2);
1.633 +
1.634 +
1.635 +g_signal_remove_emission_hook(g_signal_lookup("test-signal1",G_TYPE_TEST),hookid);
1.636 +
1.637 +#ifdef VERBOSE
1.638 +g_print("Emitting signal again after removing emission hook\n");
1.639 +#endif
1.640 +
1.641 +handlernum=0;
1.642 +g_signal_emit (G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0);
1.643 +g_signal_emit (G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0);
1.644 +g_assert(handlernum==0);
1.645 +
1.646 +g_assert (strcmp ("test-signal1", g_signal_name (g_signal_lookup("test-signal1",G_TYPE_TEST))) == 0);
1.647 +g_assert (strcmp ("test-signal2", g_signal_name (g_signal_lookup("test-signal2",G_TYPE_TEST))) == 0);
1.648 +
1.649 +
1.650 +memset(&gv,0,sizeof(gv));
1.651 +g_value_init(&gv,G_TYPE_OBJECT);
1.652 +g_value_set_object(&gv,test1);
1.653 +
1.654 +gi=0;
1.655 +g_signal_list_ids(G_OBJECT_TYPE(test1),&gi);
1.656 +g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gi);
1.657 +
1.658 +notifynum=0;
1.659 +g_signal_emitv (&gv, g_test_signals[TEST_SIGNAL1], 0, &gv);
1.660 +g_assert(notifynum==1);
1.661 +
1.662 +g_signal_query(g_signal_lookup("test-signal1",G_TYPE_TEST),&gq);
1.663 +g_assert(strcmp("test-signal1",gq.signal_name)==0);
1.664 +g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gq.signal_id);
1.665 +
1.666 +
1.667 +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);
1.668 +
1.669 +
1.670 +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);
1.671 +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);
1.672 +g_assert(notifynum==handlernum);
1.673 +
1.674 +#endif /*MULTITHREAD*/
1.675 +
1.676 +
1.677 +#ifdef VERBOSE
1.678 +g_printf ("\nsignals-multithread.c: Completed all tests\n");
1.679 +#endif
1.680 +
1.681 +#endif /*SYMBIAN*/
1.682 +
1.683 +
1.684 +
1.685 + #if SYMBIAN
1.686 + testResultXml("signals-singlethread");
1.687 + #endif /* EMULATOR */
1.688 +
1.689 + return 0;
1.690 +}