os/ossrv/glib/tsrc/BC/tests/refcount/properties.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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 #include <stdio.h>
     7 
     8 #ifdef SYMBIAN
     9 #include <glib_global.h>
    10 #include "mrt2_glib2_test.h"
    11 #endif /*SYMBIAN*/
    12 
    13 
    14 
    15 #define G_TYPE_TEST               (g_test_get_type ())
    16 #define G_TEST(test)              (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
    17 #define G_IS_TEST(test)           (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
    18 #define G_TEST_CLASS(tclass)      (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
    19 #define G_IS_TEST_CLASS(tclass)   (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
    20 #define G_TEST_GET_CLASS(test)    (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
    21 
    22 enum {
    23   PROP_0,
    24   PROP_DUMMY
    25 };
    26 
    27 typedef struct _GTest GTest;
    28 typedef struct _GTestClass GTestClass;
    29 
    30 struct _GTest
    31 {
    32   GObject object;
    33   gint id;
    34   gint dummy;
    35 
    36   gint count;
    37 };
    38 
    39 struct _GTestClass
    40 {
    41   GObjectClass parent_class;
    42 };
    43 
    44 static GType g_test_get_type (void);
    45 static volatile gboolean stopping;
    46 
    47 static void g_test_class_init (GTestClass * klass);
    48 static void g_test_init (GTest * test);
    49 static void g_test_dispose (GObject * object);
    50 static void g_test_get_property (GObject    *object,
    51 				 guint       prop_id,
    52 				 GValue     *value,
    53 				 GParamSpec *pspec);
    54 static void g_test_set_property (GObject      *object,
    55 				 guint         prop_id,
    56 				 const GValue *value,
    57 				 GParamSpec   *pspec);
    58 
    59 static GObjectClass *parent_class = NULL;
    60 
    61 static GType
    62 g_test_get_type (void)
    63 {
    64   static GType test_type = 0;
    65 
    66   if (!test_type) {
    67     static const GTypeInfo test_info = {
    68       sizeof (GTestClass),
    69       NULL,
    70       NULL,
    71       (GClassInitFunc) g_test_class_init,
    72       NULL,
    73       NULL,
    74       sizeof (GTest),
    75       0,
    76       (GInstanceInitFunc) g_test_init,
    77       NULL
    78     };
    79 
    80     test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", &test_info, 0);
    81   }
    82   return test_type;
    83 }
    84 
    85 static void
    86 g_test_class_init (GTestClass * klass)
    87 {
    88   GObjectClass *gobject_class;
    89 
    90   gobject_class = (GObjectClass *) klass;
    91 
    92   parent_class = g_type_class_ref (G_TYPE_OBJECT);
    93 
    94   gobject_class->dispose = g_test_dispose;
    95   gobject_class->get_property = g_test_get_property;
    96   gobject_class->set_property = g_test_set_property;
    97 
    98   g_object_class_install_property (gobject_class,
    99 				   PROP_DUMMY,
   100 				   g_param_spec_int ("dummy",
   101 						     NULL, 
   102 						     NULL,
   103 						     0, G_MAXINT, 0,
   104 						     G_PARAM_READWRITE));
   105 }
   106 
   107 static void
   108 g_test_init (GTest * test)
   109 {
   110   static guint static_id = 1;
   111   test->id = static_id++;
   112 }
   113 
   114 static void
   115 g_test_dispose (GObject * object)
   116 {
   117   GTest *test;
   118 
   119   test = G_TEST (object);
   120 
   121   G_OBJECT_CLASS (parent_class)->dispose (object);
   122 }
   123 
   124 static void 
   125 g_test_get_property (GObject    *object,
   126 		     guint       prop_id,
   127 		     GValue     *value,
   128 		     GParamSpec *pspec)
   129 {
   130   GTest *test;
   131 
   132   test = G_TEST (object);
   133 
   134   switch (prop_id)
   135     {
   136     case PROP_DUMMY:
   137       g_value_set_int (value, test->dummy);
   138       break;
   139     default:
   140       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   141       break;
   142     }
   143 }
   144 
   145 static void 
   146 g_test_set_property (GObject      *object,
   147 		     guint         prop_id,
   148 		     const GValue *value,
   149 		     GParamSpec   *pspec)
   150 {
   151   GTest *test;
   152 
   153   test = G_TEST (object);
   154 
   155   switch (prop_id)
   156     {
   157     case PROP_DUMMY:
   158       test->dummy = g_value_get_int (value);
   159       break;
   160     default:
   161       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   162       break;
   163     }
   164 }
   165 
   166 static void
   167 dummy_notify (GObject    *object,
   168               GParamSpec *pspec)
   169 {
   170   GTest *test;
   171 
   172   test = G_TEST (object);
   173 
   174   test->count++;  
   175 }
   176 
   177 static void
   178 g_test_do_property (GTest * test)
   179 {
   180   gint dummy;
   181 
   182   g_object_get (test, "dummy", &dummy, NULL);
   183   g_object_set (test, "dummy", dummy + 1, NULL);
   184 }
   185 
   186 static gpointer
   187 run_thread (GTest * test)
   188 {
   189   gint i = 1;
   190   
   191   while (!stopping) {
   192     g_test_do_property (test);
   193     if ((i++ % 10000) == 0)
   194       {
   195         g_print (".%c", 'a' + test->id);
   196         g_thread_yield(); /* force context switch */
   197       }
   198   }
   199 
   200   return NULL;
   201 }
   202 
   203 int
   204 main (int argc, char **argv)
   205 {
   206   gint i;
   207   GArray *test_objects;
   208   GArray *test_threads;
   209   const gint n_threads = 5;
   210 
   211   #ifdef SYMBIAN
   212   
   213   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);
   214   g_set_print_handler(mrtPrintHandler);
   215   #endif /*SYMBIAN*/
   216 	  
   217 
   218   g_thread_init (NULL);
   219   //g_print ("START: %s\n", argv[0]);
   220   g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
   221   g_type_init ();
   222 
   223   test_objects = g_array_new (FALSE, FALSE, sizeof (GTest *));
   224 
   225   for (i = 0; i < n_threads; i++) {
   226     GTest *test;
   227     
   228     test = g_object_new (G_TYPE_TEST, NULL);
   229     if(test == NULL)
   230     {
   231     	g_print("g_object_new is failed to get the new object, line # %d",__LINE__);
   232     	g_assert(FALSE && "properties");
   233     	return;
   234     }
   235     g_array_append_val (test_objects, test);
   236 
   237     g_assert (test->count == test->dummy);
   238     g_signal_connect (test, "notify::dummy", G_CALLBACK (dummy_notify), NULL);
   239   }
   240     
   241   test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
   242 
   243   stopping = FALSE;
   244 
   245   for (i = 0; i < n_threads; i++) {
   246     GThread *thread;
   247     GTest *test;
   248 
   249     test = g_array_index (test_objects, GTest *, i);
   250 
   251     thread = g_thread_create ((GThreadFunc) run_thread, test, TRUE, NULL);
   252     g_array_append_val (test_threads, thread);
   253   }
   254   g_usleep (3000000);
   255 
   256   stopping = TRUE;
   257   //g_print ("\nstopping\n");
   258 
   259   /* join all threads */
   260   for (i = 0; i < n_threads; i++) {
   261     GThread *thread;
   262 
   263     thread = g_array_index (test_threads, GThread *, i);
   264     g_thread_join (thread);
   265   }
   266 
   267   //g_print ("stopped\n");
   268 
   269   for (i = 0; i < n_threads; i++) {
   270     GTest *test;
   271 
   272     test = g_array_index (test_objects, GTest *, i);
   273 
   274     g_assert (test->count == test->dummy);
   275   }
   276 #ifdef SYMBIAN
   277   testResultXml("properties");
   278 #endif /* EMULATOR */
   279   return 0;
   280 }