1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/glib/tests/refcount/signals.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,303 @@
1.4 +/*
1.5 +* Portions copyright (c) 2009 Nokia Corporation. All rights reserved.
1.6 +*/
1.7 +#include <unistd.h>
1.8 +#include <glib.h>
1.9 +#include <glib-object.h>
1.10 +#ifdef __SYMBIAN32__
1.11 +#include <glib_global.h>
1.12 +#include "mrt2_glib2_test.h"
1.13 +#endif /*__SYMBIAN32__*/
1.14 +
1.15 +#ifdef __SYMBIAN32__
1.16 +int TESTNUM;
1.17 +#endif//__SYMBIAN32__
1.18 +
1.19 +#define G_TYPE_TEST (my_test_get_type ())
1.20 +#define MY_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
1.21 +#define MY_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
1.22 +#define MY_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
1.23 +#define MY_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
1.24 +#define MY_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
1.25 +
1.26 +static GRand *rand;
1.27 +
1.28 +typedef struct _GTest GTest;
1.29 +typedef struct _GTestClass GTestClass;
1.30 +
1.31 +struct _GTest
1.32 +{
1.33 + GObject object;
1.34 +
1.35 + gint value;
1.36 +};
1.37 +
1.38 +struct _GTestClass
1.39 +{
1.40 + GObjectClass parent_class;
1.41 +
1.42 + void (*test_signal1) (GTest * test, gint an_int);
1.43 + void (*test_signal2) (GTest * test, gint an_int);
1.44 +};
1.45 +
1.46 +static GType my_test_get_type (void);
1.47 +static volatile gboolean stopping;
1.48 +
1.49 +/* Element signals and args */
1.50 +enum
1.51 +{
1.52 + TEST_SIGNAL1,
1.53 + TEST_SIGNAL2,
1.54 + /* add more above */
1.55 + LAST_SIGNAL
1.56 +};
1.57 +
1.58 +enum
1.59 +{
1.60 + ARG_0,
1.61 + ARG_TEST_PROP
1.62 +};
1.63 +
1.64 +static void my_test_class_init (GTestClass * klass);
1.65 +static void my_test_init (GTest * test);
1.66 +static void my_test_dispose (GObject * object);
1.67 +
1.68 +static void signal2_handler (GTest * test, gint anint);
1.69 +
1.70 +static void my_test_set_property (GObject * object, guint prop_id,
1.71 + const GValue * value, GParamSpec * pspec);
1.72 +static void my_test_get_property (GObject * object, guint prop_id,
1.73 + GValue * value, GParamSpec * pspec);
1.74 +
1.75 +static GObjectClass *parent_class = NULL;
1.76 +
1.77 +static guint my_test_signals[LAST_SIGNAL] = { 0 };
1.78 +
1.79 +static GType
1.80 +my_test_get_type (void)
1.81 +{
1.82 + static GType test_type = 0;
1.83 +
1.84 + if (!test_type) {
1.85 + static const GTypeInfo test_info = {
1.86 + sizeof (GTestClass),
1.87 + NULL,
1.88 + NULL,
1.89 + (GClassInitFunc) my_test_class_init,
1.90 + NULL,
1.91 + NULL,
1.92 + sizeof (GTest),
1.93 + 0,
1.94 + (GInstanceInitFunc) my_test_init,
1.95 + NULL
1.96 + };
1.97 +
1.98 + rand = g_rand_new();
1.99 +
1.100 + test_type = g_type_register_static (G_TYPE_OBJECT, "GTest",
1.101 + &test_info, 0);
1.102 + }
1.103 + return test_type;
1.104 +}
1.105 +
1.106 +static void
1.107 +my_test_class_init (GTestClass * klass)
1.108 +{
1.109 + GObjectClass *gobject_class;
1.110 +
1.111 + gobject_class = (GObjectClass *) klass;
1.112 +
1.113 + parent_class = g_type_class_ref (G_TYPE_OBJECT);
1.114 +
1.115 + if (!g_thread_supported ())
1.116 + g_thread_init (NULL);
1.117 +
1.118 + gobject_class->dispose = my_test_dispose;
1.119 + gobject_class->set_property = my_test_set_property;
1.120 + gobject_class->get_property = my_test_get_property;
1.121 +
1.122 + my_test_signals[TEST_SIGNAL1] =
1.123 + g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass),
1.124 + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal1), NULL,
1.125 + NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
1.126 + my_test_signals[TEST_SIGNAL2] =
1.127 + g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass),
1.128 + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal2), NULL,
1.129 + NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
1.130 +
1.131 + g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP,
1.132 + g_param_spec_int ("test-prop", "Test Prop", "Test property",
1.133 + 0, 1, 0, G_PARAM_READWRITE));
1.134 +
1.135 + klass->test_signal2 = signal2_handler;
1.136 +}
1.137 +
1.138 +static void
1.139 +my_test_init (GTest * test)
1.140 +{
1.141 + g_print ("init %p\n", test);
1.142 +
1.143 + test->value = 0;
1.144 +}
1.145 +
1.146 +static void
1.147 +my_test_dispose (GObject * object)
1.148 +{
1.149 + GTest *test;
1.150 +
1.151 + test = MY_TEST (object);
1.152 +
1.153 + g_print ("dispose %p!\n", object);
1.154 +
1.155 + G_OBJECT_CLASS (parent_class)->dispose (object);
1.156 +}
1.157 +
1.158 +static void
1.159 +my_test_set_property (GObject * object, guint prop_id,
1.160 + const GValue * value, GParamSpec * pspec)
1.161 +{
1.162 + GTest *test;
1.163 +
1.164 + test = MY_TEST (object);
1.165 +
1.166 + switch (prop_id) {
1.167 + case ARG_TEST_PROP:
1.168 + test->value = g_value_get_int (value);
1.169 + break;
1.170 + default:
1.171 + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1.172 + break;
1.173 + }
1.174 +}
1.175 +
1.176 +static void
1.177 +my_test_get_property (GObject * object, guint prop_id,
1.178 + GValue * value, GParamSpec * pspec)
1.179 +{
1.180 + GTest *test;
1.181 +
1.182 + test = MY_TEST (object);
1.183 +
1.184 + switch (prop_id) {
1.185 + case ARG_TEST_PROP:
1.186 + g_value_set_int (value, test->value);
1.187 + break;
1.188 + default:
1.189 + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1.190 + break;
1.191 + }
1.192 +}
1.193 +
1.194 +static void
1.195 +my_test_do_signal1 (GTest * test)
1.196 +{
1.197 + g_signal_emit (G_OBJECT (test), my_test_signals[TEST_SIGNAL1], 0, 0);
1.198 +}
1.199 +
1.200 +static void
1.201 +signal2_handler (GTest * test, gint anint)
1.202 +{
1.203 +}
1.204 +
1.205 +static void
1.206 +my_test_do_signal2 (GTest * test)
1.207 +{
1.208 + g_signal_emit (G_OBJECT (test), my_test_signals[TEST_SIGNAL2], 0, 0);
1.209 +}
1.210 +
1.211 +static void
1.212 +my_test_do_prop (GTest * test)
1.213 +{
1.214 + test->value = g_rand_int (rand);
1.215 + g_object_notify (G_OBJECT (test), "test-prop");
1.216 +}
1.217 +
1.218 +static gpointer
1.219 +run_thread (GTest * test)
1.220 +{
1.221 + gint i = 1;
1.222 +
1.223 + while (!stopping) {
1.224 + if (TESTNUM == 1)
1.225 + my_test_do_signal1 (test);
1.226 + if (TESTNUM == 2)
1.227 + my_test_do_signal2 (test);
1.228 + if (TESTNUM == 3)
1.229 + my_test_do_prop (test);
1.230 + if ((i++ % 10000) == 0) {
1.231 + g_print (".");
1.232 + g_thread_yield(); /* force context switch */
1.233 + }
1.234 + }
1.235 +
1.236 + return NULL;
1.237 +}
1.238 +
1.239 +static void
1.240 +notify (GObject *object, GParamSpec *spec, gpointer user_data)
1.241 +{
1.242 + gint value;
1.243 +
1.244 + g_object_get (object, "test-prop", &value, NULL);
1.245 + /*g_print ("+ %d", value);*/
1.246 +}
1.247 +
1.248 +int
1.249 +main (int argc, char **argv)
1.250 +{
1.251 + gint i;
1.252 + GTest *test1, *test2;
1.253 + GArray *test_threads;
1.254 + const gint n_threads = 1;
1.255 + #ifdef __SYMBIAN32__
1.256 +
1.257 + 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.258 + g_set_print_handler(mrtPrintHandler);
1.259 + #endif /*__SYMBIAN32__*/
1.260 +
1.261 + g_thread_init (NULL);
1.262 + g_print ("START: %s\n", argv[0]);
1.263 + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
1.264 + g_type_init ();
1.265 +
1.266 + test1 = g_object_new (G_TYPE_TEST, NULL);
1.267 + test2 = g_object_new (G_TYPE_TEST, NULL);
1.268 +
1.269 + g_signal_connect (test1, "notify::test-prop", G_CALLBACK (notify), NULL);
1.270 + g_signal_connect (test1, "test-signal1", G_CALLBACK (notify), NULL);
1.271 + g_signal_connect (test1, "test-signal2", G_CALLBACK (notify), NULL);
1.272 +
1.273 + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
1.274 +
1.275 + stopping = FALSE;
1.276 +
1.277 + for (i = 0; i < n_threads; i++) {
1.278 + GThread *thread;
1.279 +
1.280 + thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
1.281 + g_array_append_val (test_threads, thread);
1.282 +
1.283 + thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
1.284 + g_array_append_val (test_threads, thread);
1.285 + }
1.286 + g_usleep (5000000);
1.287 +
1.288 + stopping = TRUE;
1.289 +
1.290 + g_print ("\nstopping\n");
1.291 +
1.292 + /* join all threads */
1.293 + for (i = 0; i < 2 * n_threads; i++) {
1.294 + GThread *thread;
1.295 +
1.296 + thread = g_array_index (test_threads, GThread *, i);
1.297 + g_thread_join (thread);
1.298 + }
1.299 +
1.300 + g_print ("stopped\n");
1.301 +#ifdef __SYMBIAN32__
1.302 + testResultXml("signals");
1.303 +#endif /* EMULATOR */
1.304 +
1.305 + return 0;
1.306 +}