| 
									
										
											  
											
												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 <glib.h>
 | 
					
						
							|  |  |  | #include <glib-object.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-05 16:08:45 +08:00
										 |  |  | #ifdef G_OS_UNIX
 | 
					
						
							|  |  |  | #include <unistd.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | typedef struct _GTest GTest; | 
					
						
							|  |  |  | typedef struct _GTestClass GTestClass; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _GTest | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObject object; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct _GTestClass | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   GObjectClass parent_class; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | static GType 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
											  
											
												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) { | 
					
						
							| 
									
										
										
										
											2011-11-29 22:02:00 -05:00
										 |  |  |     const GTypeInfo test_info = { | 
					
						
							| 
									
										
											  
											
												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
										 |  |  |       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 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     test_type = g_type_register_static (G_TYPE_OBJECT, "GTest", | 
					
						
							|  |  |  |         &test_info, 0); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   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; | 
					
						
							| 
									
										
											  
											
												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_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
										 |  |  | { | 
					
						
							|  |  |  |   g_print ("init %p\n", test); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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
										 |  |  | { | 
					
						
							|  |  |  |   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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-02 11:45:52 -04:00
										 |  |  |   g_print ("dispose %p!\n", 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
										 |  |  | 
 | 
					
						
							|  |  |  |   G_OBJECT_CLASS (parent_class)->dispose (object); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  | my_test_do_refcount (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 i = 1; | 
					
						
							|  |  |  |   if (i++ % 100000 == 0) | 
					
						
							|  |  |  |     g_print ("."); | 
					
						
							| 
									
										
											  
											
												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_ref (test);  | 
					
						
							|  |  |  |   g_object_unref (test);  | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int | 
					
						
							|  |  |  | main (int argc, char **argv) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   gint i; | 
					
						
							|  |  |  |   GTest *test; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  |   test = g_object_new (G_TYPE_TEST, NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   for (i=0; i<100000000; i++) { | 
					
						
							| 
									
										
										
										
											2007-11-20 15:00:20 +00:00
										 |  |  |     my_test_do_refcount (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
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-02 07:59:55 -04:00
										 |  |  |   g_object_unref (test); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-08-01 21:47:15 +00:00
										 |  |  |   g_print ("\n"); | 
					
						
							| 
									
										
										
										
											2012-04-02 07:59:23 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												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 0; | 
					
						
							|  |  |  | } |