| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #include <glib.h>
 | 
					
						
							|  |  |  | #include <glib-object.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | #define G_TYPE_TEST               (my_test_get_type ())
 | 
					
						
							|  |  |  | #define MY_TEST(test)              (G_TYPE_CHECK_INSTANCE_CAST ((test), G_TYPE_TEST, GTest))
 | 
					
						
							|  |  |  | #define MY_IS_TEST(test)           (G_TYPE_CHECK_INSTANCE_TYPE ((test), G_TYPE_TEST))
 | 
					
						
							|  |  |  | #define MY_TEST_CLASS(tclass)      (G_TYPE_CHECK_CLASS_CAST ((tclass), G_TYPE_TEST, GTestClass))
 | 
					
						
							|  |  |  | #define MY_IS_TEST_CLASS(tclass)   (G_TYPE_CHECK_CLASS_TYPE ((tclass), G_TYPE_TEST))
 | 
					
						
							|  |  |  | #define MY_TEST_GET_CLASS(test)    (G_TYPE_INSTANCE_GET_CLASS ((test), G_TYPE_TEST, GTestClass))
 | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  |   PROP_0, | 
					
						
							|  |  |  |   PROP_DUMMY | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct _GTest GTest; | 
					
						
							|  |  |  | typedef struct _GTestClass GTestClass; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _GTest | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObject object; | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   gint id; | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |   gint dummy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   gint count; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _GTestClass | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObjectClass parent_class; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | static GType my_test_get_type (void); | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  | static volatile gboolean stopping; | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | static void my_test_class_init (GTestClass * klass); | 
					
						
							|  |  |  | static void my_test_init (GTest * test); | 
					
						
							|  |  |  | static void my_test_dispose (GObject * object); | 
					
						
							|  |  |  | static void my_test_get_property (GObject    *object, | 
					
						
							|  |  |  |                                   guint       prop_id, | 
					
						
							|  |  |  |                                   GValue     *value, | 
					
						
							|  |  |  |                                   GParamSpec *pspec); | 
					
						
							|  |  |  | static void my_test_set_property (GObject      *object, | 
					
						
							|  |  |  |                                   guint         prop_id, | 
					
						
							|  |  |  |                                   const GValue *value, | 
					
						
							|  |  |  |                                   GParamSpec   *pspec); | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static GObjectClass *parent_class = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static GType | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | my_test_get_type (void) | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   static GType test_type = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!test_type) { | 
					
						
							|  |  |  |     static const GTypeInfo test_info = { | 
					
						
							|  |  |  |       sizeof (GTestClass), | 
					
						
							|  |  |  |       NULL, | 
					
						
							|  |  |  |       NULL, | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  |       (GClassInitFunc) my_test_class_init, | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |       NULL, | 
					
						
							|  |  |  |       NULL, | 
					
						
							|  |  |  |       sizeof (GTest), | 
					
						
							|  |  |  |       0, | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  |       (GInstanceInitFunc) my_test_init, | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |       NULL | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |     test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", &test_info, 0); | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   return test_type; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | my_test_class_init (GTestClass * klass) | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GObjectClass *gobject_class; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   gobject_class = (GObjectClass *) klass; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   parent_class = g_type_class_ref (G_TYPE_OBJECT); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  |   gobject_class->dispose = my_test_dispose; | 
					
						
							|  |  |  |   gobject_class->get_property = my_test_get_property; | 
					
						
							|  |  |  |   gobject_class->set_property = my_test_set_property; | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   g_object_class_install_property (gobject_class, | 
					
						
							|  |  |  | 				   PROP_DUMMY, | 
					
						
							|  |  |  | 				   g_param_spec_int ("dummy", | 
					
						
							|  |  |  | 						     NULL,  | 
					
						
							|  |  |  | 						     NULL, | 
					
						
							|  |  |  | 						     0, G_MAXINT, 0, | 
					
						
							|  |  |  | 						     G_PARAM_READWRITE)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | my_test_init (GTest * test) | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   static guint static_id = 1; | 
					
						
							|  |  |  |   test->id = static_id++; | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | my_test_dispose (GObject * object) | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   G_OBJECT_CLASS (parent_class)->dispose (object); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | my_test_get_property (GObject    *object, | 
					
						
							|  |  |  |                       guint       prop_id, | 
					
						
							|  |  |  |                       GValue     *value, | 
					
						
							|  |  |  |                       GParamSpec *pspec) | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GTest *test; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  |   test = MY_TEST (object); | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   switch (prop_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case PROP_DUMMY: | 
					
						
							|  |  |  |       g_value_set_int (value, test->dummy); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void  | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | my_test_set_property (GObject      *object, | 
					
						
							|  |  |  |                       guint         prop_id, | 
					
						
							|  |  |  |                       const GValue *value, | 
					
						
							|  |  |  |                       GParamSpec   *pspec) | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   GTest *test; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  |   test = MY_TEST (object); | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   switch (prop_id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |     case PROP_DUMMY: | 
					
						
							|  |  |  |       test->dummy = g_value_get_int (value); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     default: | 
					
						
							|  |  |  |       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | 
					
						
							|  |  |  |       break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							|  |  |  | dummy_notify (GObject    *object, | 
					
						
							|  |  |  |               GParamSpec *pspec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GTest *test; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  |   test = MY_TEST (object); | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   test->count++;   | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | my_test_do_property (GTest * test) | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   gint dummy; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_object_get (test, "dummy", &dummy, NULL); | 
					
						
							|  |  |  |   g_object_set (test, "dummy", dummy + 1, NULL); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static gpointer | 
					
						
							|  |  |  | run_thread (GTest * test) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   gint i = 1; | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |   while (!stopping) { | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  |     my_test_do_property (test); | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |     if ((i++ % 10000) == 0) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         g_print (".%c", 'a' + test->id); | 
					
						
							|  |  |  |         g_thread_yield(); /* force context switch */ | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return NULL; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | main (int argc, char **argv) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   gint i; | 
					
						
							|  |  |  |   GArray *test_objects; | 
					
						
							|  |  |  |   GArray *test_threads; | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   const gint n_threads = 5; | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   g_thread_init (NULL); | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   g_print ("START: %s\n", argv[0]); | 
					
						
							|  |  |  |   g_log_set_always_fatal (G_LOG_LEVEL_WARNING | G_LOG_LEVEL_CRITICAL | g_log_set_always_fatal (G_LOG_FATAL_MASK)); | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |   g_type_init (); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   test_objects = g_array_new (FALSE, FALSE, sizeof (GTest *)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   for (i = 0; i < n_threads; i++) { | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |     GTest *test; | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     test = g_object_new (G_TYPE_TEST, NULL); | 
					
						
							|  |  |  |     g_array_append_val (test_objects, test); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     g_assert (test->count == test->dummy); | 
					
						
							|  |  |  |     g_signal_connect (test, "notify::dummy", G_CALLBACK (dummy_notify), NULL); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |   test_threads = g_array_new (FALSE, FALSE, sizeof (GThread *)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   stopping = FALSE; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   for (i = 0; i < n_threads; i++) { | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |     GThread *thread; | 
					
						
							|  |  |  |     GTest *test; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test = g_array_index (test_objects, GTest *, i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     thread = g_thread_create ((GThreadFunc) run_thread, test, TRUE, NULL); | 
					
						
							|  |  |  |     g_array_append_val (test_threads, thread); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2005-08-02 06:55:38 +00:00
										 |  |  |   g_usleep (3000000); | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   stopping = TRUE; | 
					
						
							|  |  |  |   g_print ("\nstopping\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* join all threads */ | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   for (i = 0; i < n_threads; i++) { | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |     GThread *thread; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     thread = g_array_index (test_threads, GThread *, i); | 
					
						
							|  |  |  |     g_thread_join (thread); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   g_print ("stopped\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   for (i = 0; i < n_threads; i++) { | 
					
						
							| 
									
										
											  
											
												Make refcounting threadsafe by using atomic operations. (#166020, Wim
2005-07-15  Matthias Clasen  <mclasen@redhat.com>
	Make refcounting threadsafe by using atomic
	operations.  (#166020, Wim Taymans)
	* gobject.c: Use a recursive lock to protect the
	notify queue.
	(g_object_unref): Get rid of g_object_last_unref and
	do the last unref handling in g_object_unref.
	(g_object_ref, g_object_unref): Use atomic operations.
	* gsignal.c (struct _HandlerMatch): Use a full integer
	for the ref_count field.
	(handler_ref, handler_unref_R): Use atomic operations.
	* gparam.c (g_param_spec_ref, g_param_spec_unref):
	Use atomic operations instead of a lock to make the
	refcounting threadsafe.
	* gclosure.c (g_closure_ref, g_closure_unref): Use atomic
	operations. This is more complicated here, since the
	refcount is stored in a bitfield, so we also have
	to access all other bitfield members atomically.
	* gsignal.c (handlers_find): Read the meta_marshal flag
	of the closure atomically.
	* tests/Makefile.am (SUBDIRS): Add tests/refcount
	* configure.in: Add tests/refcount
	* tests/refcount/properties.c: Test property changes
	from multiple threads.
	* tests/refcount/signals.c: Test signal emission from
	multiple threads.
	* tests/refcount/objects.c: Test refcounting from
	multiple threads.
	* tests/refcount/objects2.c:
	* tests/refcount/properties2.c: Tests to measure the
	overhead of threadsafe refcounting.
	* glib/giochannel.c (g_io_channel_ref, g_io_channel_unref):
	Use atomic operations to make refcounting
	threadsafe.  (#166020, Wim Taymans)
											
										 
											2005-07-15 16:51:10 +00:00
										 |  |  |     GTest *test; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test = g_array_index (test_objects, GTest *, i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     g_assert (test->count == test->dummy); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return 0; | 
					
						
							|  |  |  | } |