glib/tsrc/BC/tests/refcount/properties.c
changeset 0 e4d67989cc36
child 72 403e7f6ed6c5
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     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 }