os/ossrv/glib/tsrc/BC/tests/refcount/signals-multithread.c
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/* Portion Copyright © 2008-09 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.*/
sl@0
     2
sl@0
     3
sl@0
     4
sl@0
     5
sl@0
     6
#include <unistd.h>
sl@0
     7
#include <glib.h>
sl@0
     8
#include <glib-object.h>
sl@0
     9
sl@0
    10
#ifdef SYMBIAN
sl@0
    11
#include "glib_global.h"
sl@0
    12
#include "mrt2_glib2_test.h"
sl@0
    13
#define MULTITHREAD
sl@0
    14
//#define TEST_STOP_EMISSION
sl@0
    15
//#define VERBOSE
sl@0
    16
#define LOOP 3 
sl@0
    17
int TESTNUM;
sl@0
    18
int notifynum;
sl@0
    19
int handlernum;
sl@0
    20
gulong  hookid;
sl@0
    21
GValue gv ;
sl@0
    22
GSignalQuery gq;
sl@0
    23
guint gi;
sl@0
    24
#endif /*SYMBIAN*/
sl@0
    25
sl@0
    26
sl@0
    27
#define G_TYPE_TEST               (g_test_get_type ())
sl@0
    28
#define G_TEST(test)              (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
sl@0
    29
#define G_IS_TEST(test)           (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
sl@0
    30
#define G_TEST_CLASS(tclass)      (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
sl@0
    31
#define G_IS_TEST_CLASS(tclass)   (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
sl@0
    32
#define G_TEST_GET_CLASS(test)    (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
sl@0
    33
sl@0
    34
static GRand *grand;
sl@0
    35
sl@0
    36
typedef struct _GTest GTest;
sl@0
    37
typedef struct _GTestClass GTestClass;
sl@0
    38
sl@0
    39
struct _GTest
sl@0
    40
{
sl@0
    41
  GObject object;
sl@0
    42
sl@0
    43
  gint value;
sl@0
    44
};
sl@0
    45
sl@0
    46
struct _GTestClass
sl@0
    47
{
sl@0
    48
  GObjectClass parent_class;
sl@0
    49
sl@0
    50
  void (*test_signal1) (GTest * test, gint an_int);
sl@0
    51
  void (*test_signal2) (GTest * test, gint an_int);
sl@0
    52
};
sl@0
    53
sl@0
    54
static GType g_test_get_type (void);
sl@0
    55
static volatile gboolean stopping;
sl@0
    56
sl@0
    57
/* Element signals and args */
sl@0
    58
enum
sl@0
    59
{
sl@0
    60
  TEST_SIGNAL1,
sl@0
    61
  TEST_SIGNAL2,
sl@0
    62
  /* add more above */
sl@0
    63
  LAST_SIGNAL
sl@0
    64
};
sl@0
    65
sl@0
    66
enum
sl@0
    67
{
sl@0
    68
  ARG_0,
sl@0
    69
  ARG_TEST_PROP
sl@0
    70
};
sl@0
    71
sl@0
    72
static void g_test_class_init (GTestClass * klass);
sl@0
    73
static void g_test_init (GTest * test);
sl@0
    74
static void g_test_dispose (GObject * object);
sl@0
    75
sl@0
    76
static void signal2_handler (GTest * test, gint anint);
sl@0
    77
sl@0
    78
static void g_test_set_property (GObject * object, guint prop_id,
sl@0
    79
    const GValue * value, GParamSpec * pspec);
sl@0
    80
static void g_test_get_property (GObject * object, guint prop_id,
sl@0
    81
    GValue * value, GParamSpec * pspec);
sl@0
    82
sl@0
    83
static GObjectClass *parent_class = NULL;
sl@0
    84
sl@0
    85
static guint g_test_signals[LAST_SIGNAL] = { 0 };
sl@0
    86
sl@0
    87
static GType
sl@0
    88
g_test_get_type (void)
sl@0
    89
{
sl@0
    90
  static GType test_type = 0;
sl@0
    91
sl@0
    92
  if (!test_type) {
sl@0
    93
    static const GTypeInfo test_info = {
sl@0
    94
      sizeof (GTestClass),
sl@0
    95
      NULL,
sl@0
    96
      NULL,
sl@0
    97
      (GClassInitFunc) g_test_class_init,
sl@0
    98
      NULL,
sl@0
    99
      NULL,
sl@0
   100
      sizeof (GTest),
sl@0
   101
      0,
sl@0
   102
      (GInstanceInitFunc) g_test_init,
sl@0
   103
      NULL
sl@0
   104
    };
sl@0
   105
sl@0
   106
    grand = g_rand_new();
sl@0
   107
sl@0
   108
    test_type = g_type_register_static (G_TYPE_OBJECT, "GTest",
sl@0
   109
        &test_info, 0);
sl@0
   110
  }
sl@0
   111
  return test_type;
sl@0
   112
}
sl@0
   113
sl@0
   114
static void
sl@0
   115
g_test_class_init (GTestClass * klass)
sl@0
   116
{
sl@0
   117
  GObjectClass *gobject_class;
sl@0
   118
sl@0
   119
  gobject_class = (GObjectClass *) klass;
sl@0
   120
sl@0
   121
  parent_class = g_type_class_ref (G_TYPE_OBJECT);
sl@0
   122
#ifndef SYMBIAN
sl@0
   123
  if (!g_thread_supported ())
sl@0
   124
    g_thread_init (NULL);
sl@0
   125
#else
sl@0
   126
sl@0
   127
#ifdef MULTITHREAD  
sl@0
   128
  if (!g_thread_supported ())
sl@0
   129
    g_thread_init (NULL);
sl@0
   130
#endif /*MULTITHREAD*/
sl@0
   131
sl@0
   132
#endif /*SYMBAIN*/
sl@0
   133
sl@0
   134
  gobject_class->dispose = g_test_dispose;
sl@0
   135
  gobject_class->set_property = g_test_set_property;
sl@0
   136
  gobject_class->get_property = g_test_get_property;
sl@0
   137
sl@0
   138
  g_test_signals[TEST_SIGNAL1] =
sl@0
   139
      g_signal_new ("test-signal1", G_TYPE_FROM_CLASS (klass),
sl@0
   140
      G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal1), NULL,
sl@0
   141
      NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
sl@0
   142
  g_test_signals[TEST_SIGNAL2] =
sl@0
   143
      g_signal_new ("test-signal2", G_TYPE_FROM_CLASS (klass),
sl@0
   144
      G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (GTestClass, test_signal2), NULL,
sl@0
   145
      NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
sl@0
   146
sl@0
   147
  g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TEST_PROP,
sl@0
   148
      g_param_spec_int ("test-prop", "Test Prop", "Test property",
sl@0
   149
          0, 1, 0, G_PARAM_READWRITE));
sl@0
   150
sl@0
   151
  klass->test_signal2 = signal2_handler;
sl@0
   152
}
sl@0
   153
sl@0
   154
static void
sl@0
   155
g_test_init (GTest * test)
sl@0
   156
{
sl@0
   157
  #ifndef SYMBIAN
sl@0
   158
  g_print ("init %p\n", test);
sl@0
   159
  #else
sl@0
   160
  
sl@0
   161
  #ifdef VERBOSE
sl@0
   162
  g_print ("init %p\n", test);
sl@0
   163
  #endif
sl@0
   164
  
sl@0
   165
  #endif /*SYMBIAN*/  
sl@0
   166
sl@0
   167
  test->value = 0;
sl@0
   168
}
sl@0
   169
sl@0
   170
static void
sl@0
   171
g_test_dispose (GObject * object)
sl@0
   172
{
sl@0
   173
  GTest *test;
sl@0
   174
sl@0
   175
  test = G_TEST (object);
sl@0
   176
sl@0
   177
  g_print ("dispose %p!\n", object);
sl@0
   178
sl@0
   179
  G_OBJECT_CLASS (parent_class)->dispose (object);
sl@0
   180
}
sl@0
   181
sl@0
   182
static void
sl@0
   183
g_test_set_property (GObject * object, guint prop_id,
sl@0
   184
    const GValue * value, GParamSpec * pspec)
sl@0
   185
{
sl@0
   186
  GTest *test;
sl@0
   187
sl@0
   188
  test = G_TEST (object);
sl@0
   189
sl@0
   190
  switch (prop_id) {
sl@0
   191
    case ARG_TEST_PROP:
sl@0
   192
      test->value = g_value_get_int (value);
sl@0
   193
      break;
sl@0
   194
    default:
sl@0
   195
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
sl@0
   196
      break;
sl@0
   197
  }
sl@0
   198
}
sl@0
   199
sl@0
   200
static void
sl@0
   201
g_test_get_property (GObject * object, guint prop_id,
sl@0
   202
    GValue * value, GParamSpec * pspec)
sl@0
   203
{
sl@0
   204
  GTest *test;
sl@0
   205
sl@0
   206
  test = G_TEST (object);
sl@0
   207
sl@0
   208
  switch (prop_id) {
sl@0
   209
    case ARG_TEST_PROP:
sl@0
   210
      g_value_set_int (value, test->value);
sl@0
   211
      break;
sl@0
   212
    default:
sl@0
   213
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
sl@0
   214
      break;
sl@0
   215
  }
sl@0
   216
}
sl@0
   217
sl@0
   218
static void
sl@0
   219
g_test_do_signal1 (GTest * test)
sl@0
   220
{
sl@0
   221
  g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL1], 0, 0);
sl@0
   222
}
sl@0
   223
sl@0
   224
static void
sl@0
   225
signal2_handler (GTest * test, gint anint)
sl@0
   226
{
sl@0
   227
	#ifdef VERBOSE
sl@0
   228
	g_print ("Function: signal2_handler called\n");
sl@0
   229
	#endif
sl@0
   230
	
sl@0
   231
	handlernum++;
sl@0
   232
}
sl@0
   233
sl@0
   234
static void
sl@0
   235
g_test_do_signal2 (GTest * test)
sl@0
   236
{
sl@0
   237
  g_signal_emit (G_OBJECT (test), g_test_signals[TEST_SIGNAL2], 0, 0);
sl@0
   238
}
sl@0
   239
sl@0
   240
static void
sl@0
   241
g_test_do_prop (GTest * test)
sl@0
   242
{
sl@0
   243
  test->value = g_rand_int (grand);
sl@0
   244
  g_object_notify (G_OBJECT (test), "test-prop");
sl@0
   245
}
sl@0
   246
sl@0
   247
static gpointer
sl@0
   248
run_thread (GTest * test)
sl@0
   249
{
sl@0
   250
  gint i = 1;
sl@0
   251
sl@0
   252
#ifndef SYMBIAN
sl@0
   253
  while (!stopping)
sl@0
   254
   {
sl@0
   255
    if (TESTNUM == 1)
sl@0
   256
      g_test_do_signal1 (test);    
sl@0
   257
    if (TESTNUM == 2)
sl@0
   258
      g_test_do_signal2 (test);
sl@0
   259
    if (TESTNUM == 3)
sl@0
   260
      g_test_do_prop (test);
sl@0
   261
    if ((i++ % 10000) == 0) {
sl@0
   262
      g_print (".");
sl@0
   263
     g_thread_yield();  /*force context switch */
sl@0
   264
    }
sl@0
   265
   }
sl@0
   266
#else
sl@0
   267
sl@0
   268
#ifdef MULTITHREAD
sl@0
   269
  while (!stopping)
sl@0
   270
   {
sl@0
   271
    if (TESTNUM == 1)
sl@0
   272
      g_test_do_signal1 (test);
sl@0
   273
    if (TESTNUM == 2)
sl@0
   274
      g_test_do_signal2 (test);
sl@0
   275
    if (TESTNUM == 3)
sl@0
   276
      g_test_do_prop (test);
sl@0
   277
    if ((i++ % 10/*000*/) == 0) 
sl@0
   278
    {
sl@0
   279
    #ifdef VERBOSE
sl@0
   280
      g_print (".");
sl@0
   281
    #endif  /*VERBOSE*/
sl@0
   282
     g_thread_yield(); /* force context switch */
sl@0
   283
    }
sl@0
   284
   }
sl@0
   285
#else
sl@0
   286
  for(i=0;i <= LOOP;i++)    
sl@0
   287
  {
sl@0
   288
    if (TESTNUM == 1)
sl@0
   289
      g_test_do_signal1 (test);
sl@0
   290
    if (TESTNUM == 2)
sl@0
   291
      g_test_do_signal2 (test);
sl@0
   292
    if (TESTNUM == 3)
sl@0
   293
      g_test_do_prop (test);  
sl@0
   294
    
sl@0
   295
    #ifdef 	VERBOSE
sl@0
   296
    g_print(".");
sl@0
   297
    #endif
sl@0
   298
  }
sl@0
   299
#endif /*MULTITHREAD*/
sl@0
   300
sl@0
   301
#endif /*SYMBIAN*/ 
sl@0
   302
sl@0
   303
  return NULL;
sl@0
   304
}
sl@0
   305
sl@0
   306
sl@0
   307
sl@0
   308
sl@0
   309
static void
sl@0
   310
notify (GObject *object, GParamSpec *spec, gpointer user_data)
sl@0
   311
{
sl@0
   312
  gint value;
sl@0
   313
  
sl@0
   314
  notifynum++;
sl@0
   315
	#ifdef VERBOSE
sl@0
   316
	g_print ("Function: notify called\n");
sl@0
   317
	#endif
sl@0
   318
sl@0
   319
  g_object_get (object, "test-prop", &value, NULL);
sl@0
   320
  //g_print ("+ %d", value);
sl@0
   321
}
sl@0
   322
sl@0
   323
#ifdef SYMBIAN
sl@0
   324
void hook_function()
sl@0
   325
{
sl@0
   326
	#ifdef VERBOSE
sl@0
   327
	g_print ("Function: hook_function called\n");
sl@0
   328
	#endif
sl@0
   329
	handlernum++;
sl@0
   330
}
sl@0
   331
#endif
sl@0
   332
sl@0
   333
int
sl@0
   334
main (int argc, char **argv)
sl@0
   335
{
sl@0
   336
  gint i;
sl@0
   337
  GTest *test1, *test2;
sl@0
   338
  GArray *test_threads;
sl@0
   339
  const gint n_threads = 1;
sl@0
   340
sl@0
   341
  #ifdef SYMBIAN
sl@0
   342
  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);
sl@0
   343
  g_set_print_handler(mrtPrintHandler);
sl@0
   344
  #endif /*SYMBIAN*/
sl@0
   345
sl@0
   346
  g_thread_init (NULL);
sl@0
   347
  
sl@0
   348
  #ifndef SYMBIAN
sl@0
   349
  g_print ("START: %s\n", argv[0]);
sl@0
   350
  #else
sl@0
   351
  
sl@0
   352
  #ifdef VERBOSE
sl@0
   353
  g_print ("START: %s\n", argv[0]);
sl@0
   354
  #endif
sl@0
   355
  
sl@0
   356
  #endif /*SYMBIAN*/  
sl@0
   357
  g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK));
sl@0
   358
  g_type_init ();
sl@0
   359
sl@0
   360
  test1 = g_object_new (G_TYPE_TEST, NULL);
sl@0
   361
  test2 = g_object_new (G_TYPE_TEST, NULL);
sl@0
   362
sl@0
   363
  g_signal_connect (test1, "notify::test-prop", G_CALLBACK (notify), NULL);
sl@0
   364
  g_signal_connect (test1, "test-signal1", G_CALLBACK (notify), NULL);
sl@0
   365
  g_signal_connect (test1, "test-signal2", G_CALLBACK (notify), NULL);
sl@0
   366
sl@0
   367
sl@0
   368
sl@0
   369
sl@0
   370
#ifndef SYMBIAN
sl@0
   371
  test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
sl@0
   372
sl@0
   373
  stopping = FALSE;
sl@0
   374
sl@0
   375
  for (i = 0; i < n_threads; i++) {
sl@0
   376
    GThread *thread;
sl@0
   377
sl@0
   378
    thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
sl@0
   379
    g_array_append_val (test_threads, thread);
sl@0
   380
sl@0
   381
    thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
sl@0
   382
    g_array_append_val (test_threads, thread);
sl@0
   383
  }
sl@0
   384
  g_usleep (500000);
sl@0
   385
sl@0
   386
  stopping = TRUE;
sl@0
   387
sl@0
   388
  g_print ("\nstopping\n");
sl@0
   389
sl@0
   390
  /* join all threads */
sl@0
   391
  for (i = 0; i < 2 * n_threads; i++) {
sl@0
   392
    GThread *thread;
sl@0
   393
sl@0
   394
    thread = g_array_index (test_threads, GThread *, i);
sl@0
   395
    g_thread_join (thread);
sl@0
   396
  }
sl@0
   397
sl@0
   398
  g_print ("stopped:%d\n",TESTNUM);
sl@0
   399
#else
sl@0
   400
sl@0
   401
#ifdef MULTITHREAD
sl@0
   402
sl@0
   403
  test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
sl@0
   404
  stopping = FALSE;
sl@0
   405
  TESTNUM=1;
sl@0
   406
  notifynum=0;
sl@0
   407
  handlernum=0;
sl@0
   408
  for (i = 0; i < n_threads; i++) 
sl@0
   409
  {
sl@0
   410
    GThread *thread;
sl@0
   411
sl@0
   412
    thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
sl@0
   413
    g_array_append_val (test_threads, thread);
sl@0
   414
sl@0
   415
    thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
sl@0
   416
    g_array_append_val (test_threads, thread);
sl@0
   417
  }
sl@0
   418
  g_usleep (500000);
sl@0
   419
sl@0
   420
  stopping = TRUE;
sl@0
   421
  
sl@0
   422
  #ifdef VERBOSE	
sl@0
   423
  g_print ("\nstopping\n");
sl@0
   424
  #endif
sl@0
   425
  /* join all threads */
sl@0
   426
  for (i = 0; i < 2 * n_threads; i++) 
sl@0
   427
  {
sl@0
   428
    GThread *thread;
sl@0
   429
sl@0
   430
    thread = g_array_index (test_threads, GThread *, i);
sl@0
   431
    g_thread_join (thread);
sl@0
   432
  }    
sl@0
   433
  
sl@0
   434
  g_assert(notifynum != 0);
sl@0
   435
  g_assert(handlernum == 0);
sl@0
   436
  
sl@0
   437
  g_array_free (test_threads, TRUE);
sl@0
   438
  
sl@0
   439
  #ifdef VERBOSE
sl@0
   440
  g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
sl@0
   441
  #endif
sl@0
   442
sl@0
   443
sl@0
   444
  
sl@0
   445
  test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
sl@0
   446
  stopping = FALSE;
sl@0
   447
  TESTNUM=2;
sl@0
   448
  notifynum=0;
sl@0
   449
  handlernum=0;
sl@0
   450
  
sl@0
   451
  for (i = 0; i < n_threads; i++) 
sl@0
   452
  {
sl@0
   453
    GThread *thread;
sl@0
   454
sl@0
   455
    thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
sl@0
   456
    g_array_append_val (test_threads, thread);
sl@0
   457
sl@0
   458
    thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
sl@0
   459
    g_array_append_val (test_threads, thread);
sl@0
   460
  }
sl@0
   461
  g_usleep (500000);
sl@0
   462
sl@0
   463
  stopping = TRUE;
sl@0
   464
  
sl@0
   465
  #ifdef VERBOSE	
sl@0
   466
  g_print ("\nstopping\n");
sl@0
   467
  #endif
sl@0
   468
  /* join all threads */
sl@0
   469
  for (i = 0; i < 2 * n_threads; i++) 
sl@0
   470
  {
sl@0
   471
    GThread *thread;
sl@0
   472
sl@0
   473
    thread = g_array_index (test_threads, GThread *, i);
sl@0
   474
    g_thread_join (thread);
sl@0
   475
  }
sl@0
   476
  
sl@0
   477
  g_assert(notifynum != 0);
sl@0
   478
  g_assert(handlernum != 0);
sl@0
   479
sl@0
   480
  g_array_free (test_threads, TRUE);
sl@0
   481
sl@0
   482
  #ifdef VERBOSE
sl@0
   483
  g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
sl@0
   484
  #endif  
sl@0
   485
sl@0
   486
sl@0
   487
  test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *));
sl@0
   488
  stopping = FALSE;
sl@0
   489
  TESTNUM=3;
sl@0
   490
  notifynum=0;
sl@0
   491
  handlernum=0;
sl@0
   492
  
sl@0
   493
  for (i = 0; i < n_threads; i++) 
sl@0
   494
  {
sl@0
   495
    GThread *thread;
sl@0
   496
sl@0
   497
    thread = g_thread_create ((GThreadFunc) run_thread, test1, TRUE, NULL);
sl@0
   498
    g_array_append_val (test_threads, thread);
sl@0
   499
sl@0
   500
    thread = g_thread_create ((GThreadFunc) run_thread, test2, TRUE, NULL);
sl@0
   501
    g_array_append_val (test_threads, thread);
sl@0
   502
  }
sl@0
   503
  g_usleep (5000000);
sl@0
   504
sl@0
   505
  stopping = TRUE;
sl@0
   506
  
sl@0
   507
  #ifdef VERBOSE	
sl@0
   508
  g_print ("\nstopping\n");
sl@0
   509
  #endif
sl@0
   510
  /* join all threads */
sl@0
   511
  for (i = 0; i < 2 * n_threads; i++) 
sl@0
   512
  {
sl@0
   513
    GThread *thread;
sl@0
   514
sl@0
   515
    thread = g_array_index (test_threads, GThread *, i);
sl@0
   516
    g_thread_join (thread);
sl@0
   517
  }
sl@0
   518
  
sl@0
   519
  g_assert(notifynum != 0);
sl@0
   520
  g_assert(handlernum == 0);
sl@0
   521
sl@0
   522
  g_array_free (test_threads, TRUE);
sl@0
   523
sl@0
   524
  #ifdef VERBOSE
sl@0
   525
  g_print ("Signals.c: completed for TESTNUM = %d\n",TESTNUM);
sl@0
   526
  #endif  
sl@0
   527
sl@0
   528
#else	/* ! MULTITHREAD*/
sl@0
   529
sl@0
   530
sl@0
   531
TESTNUM=1;
sl@0
   532
#ifdef VERBOSE	
sl@0
   533
g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
sl@0
   534
#endif
sl@0
   535
sl@0
   536
notifynum=0;
sl@0
   537
handlernum=0;
sl@0
   538
run_thread(test1);
sl@0
   539
g_assert(notifynum == LOOP +1);
sl@0
   540
g_assert(handlernum ==0);
sl@0
   541
sl@0
   542
notifynum=0;
sl@0
   543
handlernum=0;
sl@0
   544
run_thread(test2);
sl@0
   545
g_assert(notifynum == 0);
sl@0
   546
g_assert(handlernum == 0);
sl@0
   547
sl@0
   548
TESTNUM=2;
sl@0
   549
#ifdef VERBOSE	
sl@0
   550
g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
sl@0
   551
#endif
sl@0
   552
sl@0
   553
notifynum=0;
sl@0
   554
handlernum=0;
sl@0
   555
run_thread(test1);
sl@0
   556
g_assert(notifynum == LOOP+1);
sl@0
   557
g_assert(handlernum == LOOP+1);
sl@0
   558
sl@0
   559
notifynum=0;
sl@0
   560
handlernum=0;
sl@0
   561
run_thread(test2);
sl@0
   562
g_assert(notifynum == 0);
sl@0
   563
g_assert(handlernum == LOOP+1);
sl@0
   564
sl@0
   565
TESTNUM=3;
sl@0
   566
#ifdef VERBOSE	
sl@0
   567
g_print ("\nStarting with TESTNUM=%d\n",TESTNUM);
sl@0
   568
#endif
sl@0
   569
sl@0
   570
notifynum=0;
sl@0
   571
handlernum=0;
sl@0
   572
run_thread(test1);
sl@0
   573
g_assert(notifynum == LOOP +1);
sl@0
   574
g_assert(handlernum ==0);
sl@0
   575
sl@0
   576
notifynum=0;
sl@0
   577
handlernum=0;
sl@0
   578
run_thread(test2);
sl@0
   579
g_assert(notifynum == 0);
sl@0
   580
g_assert(handlernum == 0);
sl@0
   581
sl@0
   582
g_assert(g_signal_has_handler_pending(G_OBJECT(test1),g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,TRUE)==TRUE);
sl@0
   583
g_assert(g_signal_has_handler_pending(G_OBJECT(test2),g_signal_lookup("test-signal2",G_TYPE_TEST),NULL,TRUE)==FALSE);
sl@0
   584
sl@0
   585
g_assert(g_signal_handler_is_connected(G_OBJECT(test1),g_signal_lookup("test-signal1",G_TYPE_TEST))==TRUE);
sl@0
   586
g_assert(g_signal_handler_is_connected(G_OBJECT(test2),g_signal_lookup("test-signal2",G_TYPE_TEST))==FALSE);
sl@0
   587
sl@0
   588
handlernum=g_signal_lookup("test-signal1",G_TYPE_TEST);
sl@0
   589
#ifdef VERBOSE
sl@0
   590
g_print("Signal id: %d\n",handlernum);
sl@0
   591
#endif
sl@0
   592
sl@0
   593
g_signal_connect (test2, "test-signal1", G_CALLBACK (notify), NULL);
sl@0
   594
sl@0
   595
hookid=g_signal_add_emission_hook(handlernum,NULL,(GSignalEmissionHook) hook_function,NULL,NULL);
sl@0
   596
sl@0
   597
#ifdef VERBOSE
sl@0
   598
g_print("Hookid: %d\n",hookid);
sl@0
   599
#endif
sl@0
   600
/********************/
sl@0
   601
sl@0
   602
#ifdef TEST_STOP_EMISSION
sl@0
   603
/*
sl@0
   604
notifynum=0;
sl@0
   605
handlernum=0;
sl@0
   606
g_print("The following call stops signal emission\n");
sl@0
   607
g_signal_stop_emission(G_OBJECT(test1),g_signal_lookup("test-signal1",G_TYPE_TEST),0);
sl@0
   608
sl@0
   609
g_print("The following call should abort and it is normal\n");
sl@0
   610
run_thread(test1);
sl@0
   611
printf("Notifynum: %d and Handlernum: %d\n",notifynum,handlernum);
sl@0
   612
sl@0
   613
*/
sl@0
   614
notifynum=0;
sl@0
   615
handlernum=0;
sl@0
   616
g_signal_stop_emission_by_name(G_OBJECT(test1),"test-signal1");
sl@0
   617
//run_thread(test1);
sl@0
   618
g_print("Notifynum: %d and Handlernum: %d\n",notifynum,handlernum);
sl@0
   619
sl@0
   620
sl@0
   621
#endif /*TEST_STOP_EMISSION*/
sl@0
   622
sl@0
   623
/*******************/
sl@0
   624
sl@0
   625
sl@0
   626
handlernum=0;
sl@0
   627
g_signal_emit(G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0);
sl@0
   628
g_signal_emit(G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0);
sl@0
   629
g_assert(handlernum==2);
sl@0
   630
sl@0
   631
sl@0
   632
g_signal_remove_emission_hook(g_signal_lookup("test-signal1",G_TYPE_TEST),hookid);
sl@0
   633
sl@0
   634
#ifdef VERBOSE
sl@0
   635
g_print("Emitting signal again after removing emission hook\n");
sl@0
   636
#endif
sl@0
   637
sl@0
   638
handlernum=0;
sl@0
   639
g_signal_emit (G_OBJECT (test1), g_test_signals[TEST_SIGNAL1], 0, 0);
sl@0
   640
g_signal_emit (G_OBJECT (test2), g_test_signals[TEST_SIGNAL1], 0, 0);
sl@0
   641
g_assert(handlernum==0);
sl@0
   642
sl@0
   643
g_assert (strcmp ("test-signal1", g_signal_name (g_signal_lookup("test-signal1",G_TYPE_TEST))) == 0);
sl@0
   644
g_assert (strcmp ("test-signal2", g_signal_name (g_signal_lookup("test-signal2",G_TYPE_TEST))) == 0);
sl@0
   645
sl@0
   646
sl@0
   647
memset(&gv,0,sizeof(gv));
sl@0
   648
g_value_init(&gv,G_TYPE_OBJECT);
sl@0
   649
g_value_set_object(&gv,test1);
sl@0
   650
sl@0
   651
gi=0;
sl@0
   652
g_signal_list_ids(G_OBJECT_TYPE(test1),&gi);
sl@0
   653
g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gi);
sl@0
   654
sl@0
   655
notifynum=0;
sl@0
   656
g_signal_emitv (&gv, g_test_signals[TEST_SIGNAL1], 0, &gv);
sl@0
   657
g_assert(notifynum==1);
sl@0
   658
sl@0
   659
g_signal_query(g_signal_lookup("test-signal1",G_TYPE_TEST),&gq);
sl@0
   660
g_assert(strcmp("test-signal1",gq.signal_name)==0);
sl@0
   661
g_assert(g_signal_lookup("test-signal1",G_TYPE_TEST)==gq.signal_id);
sl@0
   662
sl@0
   663
sl@0
   664
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);
sl@0
   665
sl@0
   666
sl@0
   667
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);
sl@0
   668
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);
sl@0
   669
g_assert(notifynum==handlernum);
sl@0
   670
sl@0
   671
#endif /*MULTITHREAD*/
sl@0
   672
sl@0
   673
#ifdef VERBOSE	
sl@0
   674
g_printf ("\nsignals.c: Completed all tests\n");
sl@0
   675
#endif
sl@0
   676
sl@0
   677
#endif /*SYMBIAN*/ 
sl@0
   678
sl@0
   679
sl@0
   680
sl@0
   681
  #if SYMBIAN
sl@0
   682
  testResultXml("signals-multithread");
sl@0
   683
  #endif /* EMULATOR */
sl@0
   684
sl@0
   685
  return 0;
sl@0
   686
}