1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/glib/tsrc/BC/tests/refcount/properties.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,280 @@
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 +#include <stdio.h>
1.10 +
1.11 +#ifdef SYMBIAN
1.12 +#include <glib_global.h>
1.13 +#include "mrt2_glib2_test.h"
1.14 +#endif /*SYMBIAN*/
1.15 +
1.16 +
1.17 +
1.18 +#define G_TYPE_TEST (g_test_get_type ())
1.19 +#define G_TEST(test) (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
1.20 +#define G_IS_TEST(test) (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
1.21 +#define G_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
1.22 +#define G_IS_TEST_CLASS(tclass) (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
1.23 +#define G_TEST_GET_CLASS(test) (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
1.24 +
1.25 +enum {
1.26 + PROP_0,
1.27 + PROP_DUMMY
1.28 +};
1.29 +
1.30 +typedef struct _GTest GTest;
1.31 +typedef struct _GTestClass GTestClass;
1.32 +
1.33 +struct _GTest
1.34 +{
1.35 + GObject object;
1.36 + gint id;
1.37 + gint dummy;
1.38 +
1.39 + gint count;
1.40 +};
1.41 +
1.42 +struct _GTestClass
1.43 +{
1.44 + GObjectClass parent_class;
1.45 +};
1.46 +
1.47 +static GType g_test_get_type (void);
1.48 +static volatile gboolean stopping;
1.49 +
1.50 +static void g_test_class_init (GTestClass * klass);
1.51 +static void g_test_init (GTest * test);
1.52 +static void g_test_dispose (GObject * object);
1.53 +static void g_test_get_property (GObject *object,
1.54 + guint prop_id,
1.55 + GValue *value,
1.56 + GParamSpec *pspec);
1.57 +static void g_test_set_property (GObject *object,
1.58 + guint prop_id,
1.59 + const GValue *value,
1.60 + GParamSpec *pspec);
1.61 +
1.62 +static GObjectClass *parent_class = NULL;
1.63 +
1.64 +static GType
1.65 +g_test_get_type (void)
1.66 +{
1.67 + static GType test_type = 0;
1.68 +
1.69 + if (!test_type) {
1.70 + static const GTypeInfo test_info = {
1.71 + sizeof (GTestClass),
1.72 + NULL,
1.73 + NULL,
1.74 + (GClassInitFunc) g_test_class_init,
1.75 + NULL,
1.76 + NULL,
1.77 + sizeof (GTest),
1.78 + 0,
1.79 + (GInstanceInitFunc) g_test_init,
1.80 + NULL
1.81 + };
1.82 +
1.83 + test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", &test_info, 0);
1.84 + }
1.85 + return test_type;
1.86 +}
1.87 +
1.88 +static void
1.89 +g_test_class_init (GTestClass * klass)
1.90 +{
1.91 + GObjectClass *gobject_class;
1.92 +
1.93 + gobject_class = (GObjectClass *) klass;
1.94 +
1.95 + parent_class = g_type_class_ref (G_TYPE_OBJECT);
1.96 +
1.97 + gobject_class->dispose = g_test_dispose;
1.98 + gobject_class->get_property = g_test_get_property;
1.99 + gobject_class->set_property = g_test_set_property;
1.100 +
1.101 + g_object_class_install_property (gobject_class,
1.102 + PROP_DUMMY,
1.103 + g_param_spec_int ("dummy",
1.104 + NULL,
1.105 + NULL,
1.106 + 0, G_MAXINT, 0,
1.107 + G_PARAM_READWRITE));
1.108 +}
1.109 +
1.110 +static void
1.111 +g_test_init (GTest * test)
1.112 +{
1.113 + static guint static_id = 1;
1.114 + test->id = static_id++;
1.115 +}
1.116 +
1.117 +static void
1.118 +g_test_dispose (GObject * object)
1.119 +{
1.120 + GTest *test;
1.121 +
1.122 + test = G_TEST (object);
1.123 +
1.124 + G_OBJECT_CLASS (parent_class)->dispose (object);
1.125 +}
1.126 +
1.127 +static void
1.128 +g_test_get_property (GObject *object,
1.129 + guint prop_id,
1.130 + GValue *value,
1.131 + GParamSpec *pspec)
1.132 +{
1.133 + GTest *test;
1.134 +
1.135 + test = G_TEST (object);
1.136 +
1.137 + switch (prop_id)
1.138 + {
1.139 + case PROP_DUMMY:
1.140 + g_value_set_int (value, test->dummy);
1.141 + break;
1.142 + default:
1.143 + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1.144 + break;
1.145 + }
1.146 +}
1.147 +
1.148 +static void
1.149 +g_test_set_property (GObject *object,
1.150 + guint prop_id,
1.151 + const GValue *value,
1.152 + GParamSpec *pspec)
1.153 +{
1.154 + GTest *test;
1.155 +
1.156 + test = G_TEST (object);
1.157 +
1.158 + switch (prop_id)
1.159 + {
1.160 + case PROP_DUMMY:
1.161 + test->dummy = g_value_get_int (value);
1.162 + break;
1.163 + default:
1.164 + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1.165 + break;
1.166 + }
1.167 +}
1.168 +
1.169 +static void
1.170 +dummy_notify (GObject *object,
1.171 + GParamSpec *pspec)
1.172 +{
1.173 + GTest *test;
1.174 +
1.175 + test = G_TEST (object);
1.176 +
1.177 + test->count++;
1.178 +}
1.179 +
1.180 +static void
1.181 +g_test_do_property (GTest * test)
1.182 +{
1.183 + gint dummy;
1.184 +
1.185 + g_object_get (test, "dummy", &dummy, NULL);
1.186 + g_object_set (test, "dummy", dummy + 1, NULL);
1.187 +}
1.188 +
1.189 +static gpointer
1.190 +run_thread (GTest * test)
1.191 +{
1.192 + gint i = 1;
1.193 +
1.194 + while (!stopping) {
1.195 + g_test_do_property (test);
1.196 + if ((i++ % 10000) == 0)
1.197 + {
1.198 + g_print (".%c", 'a' + test->id);
1.199 + g_thread_yield(); /* force context switch */
1.200 + }
1.201 + }
1.202 +
1.203 + return NULL;
1.204 +}
1.205 +
1.206 +int
1.207 +main (int argc, char **argv)
1.208 +{
1.209 + gint i;
1.210 + GArray *test_objects;
1.211 + GArray *test_threads;
1.212 + const gint n_threads = 5;
1.213 +
1.214 + #ifdef SYMBIAN
1.215 +
1.216 + 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.217 + g_set_print_handler(mrtPrintHandler);
1.218 + #endif /*SYMBIAN*/
1.219 +
1.220 +
1.221 + g_thread_init (NULL);
1.222 + //g_print ("START: %s\n", argv[0]);
1.223 + g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
1.224 + g_type_init ();
1.225 +
1.226 + test_objects = g_array_new (FALSE, FALSE, sizeof (GTest *));
1.227 +
1.228 + for (i = 0; i < n_threads; i++) {
1.229 + GTest *test;
1.230 +
1.231 + test = g_object_new (G_TYPE_TEST, NULL);
1.232 + if(test == NULL)
1.233 + {
1.234 + g_print("g_object_new is failed to get the new object, line # %d",__LINE__);
1.235 + g_assert(FALSE && "properties");
1.236 + return;
1.237 + }
1.238 + g_array_append_val (test_objects, test);
1.239 +
1.240 + g_assert (test->count == test->dummy);
1.241 + g_signal_connect (test, "notify::dummy", G_CALLBACK (dummy_notify), NULL);
1.242 + }
1.243 +
1.244 + test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
1.245 +
1.246 + stopping = FALSE;
1.247 +
1.248 + for (i = 0; i < n_threads; i++) {
1.249 + GThread *thread;
1.250 + GTest *test;
1.251 +
1.252 + test = g_array_index (test_objects, GTest *, i);
1.253 +
1.254 + thread = g_thread_create ((GThreadFunc) run_thread, test, TRUE, NULL);
1.255 + g_array_append_val (test_threads, thread);
1.256 + }
1.257 + g_usleep (3000000);
1.258 +
1.259 + stopping = TRUE;
1.260 + //g_print ("\nstopping\n");
1.261 +
1.262 + /* join all threads */
1.263 + for (i = 0; i < n_threads; i++) {
1.264 + GThread *thread;
1.265 +
1.266 + thread = g_array_index (test_threads, GThread *, i);
1.267 + g_thread_join (thread);
1.268 + }
1.269 +
1.270 + //g_print ("stopped\n");
1.271 +
1.272 + for (i = 0; i < n_threads; i++) {
1.273 + GTest *test;
1.274 +
1.275 + test = g_array_index (test_objects, GTest *, i);
1.276 +
1.277 + g_assert (test->count == test->dummy);
1.278 + }
1.279 +#ifdef SYMBIAN
1.280 + testResultXml("properties");
1.281 +#endif /* EMULATOR */
1.282 + return 0;
1.283 +}