os/ossrv/glib/tsrc/BC/tests/gobject/references.c
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
/* GObject - GLib Type, Object, Parameter and Signal Library
sl@0
     2
 * Copyright (C) 2005 Red Hat, Inc.
sl@0
     3
 * Portion Copyright © 2008 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
sl@0
     4
 * This library is free software; you can redistribute it and/or
sl@0
     5
 * modify it under the terms of the GNU Lesser General Public
sl@0
     6
 * License as published by the Free Software Foundation; either
sl@0
     7
 * version 2 of the License, or (at your option) any later version.
sl@0
     8
 *
sl@0
     9
 * This library is distributed in the hope that it will be useful,
sl@0
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
sl@0
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
sl@0
    12
 * Lesser General Public License for more details.
sl@0
    13
 *
sl@0
    14
 * You should have received a copy of the GNU Lesser General
sl@0
    15
 * Public License along with this library; if not, write to the
sl@0
    16
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
sl@0
    17
 * Boston, MA 02111-1307, USA.
sl@0
    18
 */
sl@0
    19
sl@0
    20
#undef	G_LOG_DOMAIN
sl@0
    21
#define	G_LOG_DOMAIN "TestReferences"
sl@0
    22
sl@0
    23
#undef G_DISABLE_ASSERT
sl@0
    24
#undef G_DISABLE_CHECKS
sl@0
    25
#undef G_DISABLE_CAST_CHECKS
sl@0
    26
sl@0
    27
  
sl@0
    28
#include	<glib-object.h>
sl@0
    29
sl@0
    30
#ifdef SYMBIAN
sl@0
    31
  #include "mrt2_glib2_test.h"
sl@0
    32
  #endif /*SYMBIAN*/
sl@0
    33
sl@0
    34
/* This test tests weak and toggle references
sl@0
    35
 */
sl@0
    36
static GObject *global_object;
sl@0
    37
sl@0
    38
static gboolean object_destroyed;
sl@0
    39
static gboolean weak_ref1_notified;
sl@0
    40
static gboolean weak_ref2_notified;
sl@0
    41
static gboolean toggle_ref1_weakened;
sl@0
    42
static gboolean toggle_ref1_strengthened;
sl@0
    43
static gboolean toggle_ref2_weakened;
sl@0
    44
static gboolean toggle_ref2_strengthened;
sl@0
    45
static gboolean toggle_ref3_weakened;
sl@0
    46
static gboolean toggle_ref3_strengthened;
sl@0
    47
sl@0
    48
/*
sl@0
    49
 * TestObject, a parent class for TestObject
sl@0
    50
 */
sl@0
    51
#define TEST_TYPE_OBJECT          (test_object_get_type ())
sl@0
    52
typedef struct _TestObject        TestObject;
sl@0
    53
typedef struct _TestObjectClass   TestObjectClass;
sl@0
    54
sl@0
    55
struct _TestObject
sl@0
    56
{
sl@0
    57
  GObject parent_instance;
sl@0
    58
};
sl@0
    59
struct _TestObjectClass
sl@0
    60
{
sl@0
    61
  GObjectClass parent_class;
sl@0
    62
};
sl@0
    63
sl@0
    64
G_DEFINE_TYPE (TestObject, test_object, G_TYPE_OBJECT);
sl@0
    65
sl@0
    66
static void
sl@0
    67
test_object_finalize (GObject *object)
sl@0
    68
{
sl@0
    69
  object_destroyed = TRUE;
sl@0
    70
  
sl@0
    71
  G_OBJECT_CLASS (test_object_parent_class)->finalize (object);
sl@0
    72
}
sl@0
    73
sl@0
    74
static void
sl@0
    75
test_object_class_init (TestObjectClass *class)
sl@0
    76
{
sl@0
    77
  GObjectClass *object_class = G_OBJECT_CLASS (class);
sl@0
    78
sl@0
    79
  object_class->finalize = test_object_finalize;
sl@0
    80
}
sl@0
    81
sl@0
    82
static void
sl@0
    83
test_object_init (TestObject *test_object)
sl@0
    84
{
sl@0
    85
}
sl@0
    86
sl@0
    87
static void
sl@0
    88
clear_flags (void)
sl@0
    89
{
sl@0
    90
  object_destroyed = FALSE;
sl@0
    91
  weak_ref1_notified = FALSE;
sl@0
    92
  weak_ref2_notified = FALSE;
sl@0
    93
  toggle_ref1_weakened = FALSE;
sl@0
    94
  toggle_ref1_strengthened = FALSE;
sl@0
    95
  toggle_ref2_weakened = FALSE;
sl@0
    96
  toggle_ref2_strengthened = FALSE;
sl@0
    97
  toggle_ref3_weakened = FALSE;
sl@0
    98
  toggle_ref3_strengthened = FALSE;
sl@0
    99
}
sl@0
   100
sl@0
   101
static void
sl@0
   102
weak_ref1 (gpointer data,
sl@0
   103
	   GObject *object)
sl@0
   104
{
sl@0
   105
  g_assert (object == global_object);
sl@0
   106
  g_assert (data == GUINT_TO_POINTER (42));
sl@0
   107
sl@0
   108
  weak_ref1_notified = TRUE;
sl@0
   109
}
sl@0
   110
sl@0
   111
static void
sl@0
   112
weak_ref2 (gpointer data,
sl@0
   113
	   GObject *object)
sl@0
   114
{
sl@0
   115
  g_assert (object == global_object);
sl@0
   116
  g_assert (data == GUINT_TO_POINTER (24));
sl@0
   117
sl@0
   118
  weak_ref2_notified = TRUE;
sl@0
   119
}
sl@0
   120
sl@0
   121
static void
sl@0
   122
toggle_ref1 (gpointer data,
sl@0
   123
	     GObject *object,
sl@0
   124
	     gboolean is_last_ref)
sl@0
   125
{
sl@0
   126
  g_assert (object == global_object);
sl@0
   127
  g_assert (data == GUINT_TO_POINTER (42));
sl@0
   128
sl@0
   129
  if (is_last_ref)
sl@0
   130
    toggle_ref1_weakened = TRUE;
sl@0
   131
  else
sl@0
   132
    toggle_ref1_strengthened = TRUE;
sl@0
   133
}
sl@0
   134
sl@0
   135
static void
sl@0
   136
toggle_ref2 (gpointer data,
sl@0
   137
	     GObject *object,
sl@0
   138
	     gboolean is_last_ref)
sl@0
   139
{
sl@0
   140
  g_assert (object == global_object);
sl@0
   141
  g_assert (data == GUINT_TO_POINTER (24));
sl@0
   142
sl@0
   143
  if (is_last_ref)
sl@0
   144
    toggle_ref2_weakened = TRUE;
sl@0
   145
  else
sl@0
   146
    toggle_ref2_strengthened = TRUE;
sl@0
   147
}
sl@0
   148
sl@0
   149
static void
sl@0
   150
toggle_ref3 (gpointer data,
sl@0
   151
	     GObject *object,
sl@0
   152
	     gboolean is_last_ref)
sl@0
   153
{
sl@0
   154
  g_assert (object == global_object);
sl@0
   155
  g_assert (data == GUINT_TO_POINTER (34));
sl@0
   156
sl@0
   157
  if (is_last_ref)
sl@0
   158
    {
sl@0
   159
      toggle_ref3_weakened = TRUE;
sl@0
   160
      g_object_remove_toggle_ref (object, toggle_ref3, GUINT_TO_POINTER (34));
sl@0
   161
    }
sl@0
   162
  else
sl@0
   163
    toggle_ref3_strengthened = TRUE;
sl@0
   164
}
sl@0
   165
sl@0
   166
int
sl@0
   167
main (int   argc,
sl@0
   168
      char *argv[])
sl@0
   169
{
sl@0
   170
  GObject *object;
sl@0
   171
	
sl@0
   172
  g_log_set_always_fatal (g_log_set_always_fatal (G_LOG_FATAL_MASK) |
sl@0
   173
			  G_LOG_LEVEL_WARNING |
sl@0
   174
			  G_LOG_LEVEL_CRITICAL);
sl@0
   175
  g_type_init ();
sl@0
   176
sl@0
   177
sl@0
   178
  #ifdef SYMBIAN
sl@0
   179
  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
   180
  #endif /*SYMBIAN*/
sl@0
   181
  /* Test basic weak reference operation
sl@0
   182
   */
sl@0
   183
  global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
sl@0
   184
  
sl@0
   185
  g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42));
sl@0
   186
sl@0
   187
  clear_flags ();
sl@0
   188
  g_object_unref (object);
sl@0
   189
  g_assert (weak_ref1_notified == TRUE);
sl@0
   190
  g_assert (object_destroyed == TRUE);
sl@0
   191
sl@0
   192
  /* Test two weak references at once
sl@0
   193
   */
sl@0
   194
  global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
sl@0
   195
  
sl@0
   196
  g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42));
sl@0
   197
  g_object_weak_ref (object, weak_ref2, GUINT_TO_POINTER (24));
sl@0
   198
sl@0
   199
  clear_flags ();
sl@0
   200
  g_object_unref (object);
sl@0
   201
  g_assert (weak_ref1_notified == TRUE);
sl@0
   202
  g_assert (weak_ref2_notified == TRUE);
sl@0
   203
  g_assert (object_destroyed == TRUE);
sl@0
   204
sl@0
   205
  /* Test remove weak references
sl@0
   206
   */
sl@0
   207
  global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
sl@0
   208
  
sl@0
   209
  g_object_weak_ref (object, weak_ref1, GUINT_TO_POINTER (42));
sl@0
   210
  g_object_weak_ref (object, weak_ref2, GUINT_TO_POINTER (24));
sl@0
   211
  g_object_weak_unref (object, weak_ref1, GUINT_TO_POINTER (42));
sl@0
   212
sl@0
   213
  clear_flags ();
sl@0
   214
  g_object_unref (object);
sl@0
   215
  g_assert (weak_ref1_notified == FALSE);
sl@0
   216
  g_assert (weak_ref2_notified == TRUE);
sl@0
   217
  g_assert (object_destroyed == TRUE);
sl@0
   218
sl@0
   219
  /* Test basic toggle reference operation
sl@0
   220
   */
sl@0
   221
  global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
sl@0
   222
  
sl@0
   223
  g_object_add_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42));
sl@0
   224
sl@0
   225
  clear_flags ();
sl@0
   226
  g_object_unref (object);
sl@0
   227
  g_assert (toggle_ref1_weakened == TRUE);
sl@0
   228
  g_assert (toggle_ref1_strengthened == FALSE);
sl@0
   229
  g_assert (object_destroyed == FALSE);
sl@0
   230
sl@0
   231
  clear_flags ();
sl@0
   232
  g_object_ref (object);
sl@0
   233
  g_assert (toggle_ref1_weakened == FALSE);
sl@0
   234
  g_assert (toggle_ref1_strengthened == TRUE);
sl@0
   235
  g_assert (object_destroyed == FALSE);
sl@0
   236
sl@0
   237
  g_object_unref (object);
sl@0
   238
sl@0
   239
  clear_flags ();
sl@0
   240
  g_object_remove_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42));
sl@0
   241
  g_assert (toggle_ref1_weakened == FALSE);
sl@0
   242
  g_assert (toggle_ref1_strengthened == FALSE);
sl@0
   243
  g_assert (object_destroyed == TRUE);
sl@0
   244
sl@0
   245
  global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
sl@0
   246
sl@0
   247
  /* Test two toggle references at once
sl@0
   248
   */
sl@0
   249
  g_object_add_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42));
sl@0
   250
  g_object_add_toggle_ref (object, toggle_ref2, GUINT_TO_POINTER (24));
sl@0
   251
sl@0
   252
  clear_flags ();
sl@0
   253
  g_object_unref (object);
sl@0
   254
  g_assert (toggle_ref1_weakened == FALSE);
sl@0
   255
  g_assert (toggle_ref1_strengthened == FALSE);
sl@0
   256
  g_assert (toggle_ref2_weakened == FALSE);
sl@0
   257
  g_assert (toggle_ref2_strengthened == FALSE);
sl@0
   258
  g_assert (object_destroyed == FALSE);
sl@0
   259
sl@0
   260
  clear_flags ();
sl@0
   261
  g_object_remove_toggle_ref (object, toggle_ref1, GUINT_TO_POINTER (42));
sl@0
   262
  g_assert (toggle_ref1_weakened == FALSE);
sl@0
   263
  g_assert (toggle_ref1_strengthened == FALSE);
sl@0
   264
  g_assert (toggle_ref2_weakened == TRUE);
sl@0
   265
  g_assert (toggle_ref2_strengthened == FALSE);
sl@0
   266
  g_assert (object_destroyed == FALSE);
sl@0
   267
sl@0
   268
  clear_flags ();
sl@0
   269
  g_object_remove_toggle_ref (object, toggle_ref2, GUINT_TO_POINTER (24));
sl@0
   270
  g_assert (toggle_ref1_weakened == FALSE);
sl@0
   271
  g_assert (toggle_ref1_strengthened == FALSE);
sl@0
   272
  g_assert (toggle_ref2_weakened == FALSE);
sl@0
   273
  g_assert (toggle_ref2_strengthened == FALSE);
sl@0
   274
  g_assert (object_destroyed == TRUE);
sl@0
   275
  
sl@0
   276
  /* Test a toggle reference that removes itself
sl@0
   277
   */
sl@0
   278
  global_object = object = g_object_new (TEST_TYPE_OBJECT, NULL);
sl@0
   279
  
sl@0
   280
  g_object_add_toggle_ref (object, toggle_ref3, GUINT_TO_POINTER (34));
sl@0
   281
sl@0
   282
  clear_flags ();
sl@0
   283
  g_object_unref (object);
sl@0
   284
  g_assert (toggle_ref3_weakened == TRUE);
sl@0
   285
  g_assert (toggle_ref3_strengthened == FALSE);
sl@0
   286
  g_assert (object_destroyed == TRUE);
sl@0
   287
sl@0
   288
  #ifdef SYMBIAN
sl@0
   289
  testResultXml("references");
sl@0
   290
  #endif /*SYMBIAN*/
sl@0
   291
  return 0;
sl@0
   292
}