Mon Aug 1 23:33:47 2005 Tim Janik <timj@imendio.com>
* tests/refcount/closures.c: test high contention on closure
reference counts to trigger and catch non-atomic updates.
* tests/refcount/objects.c:
* tests/refcount/objects2.c:
* tests/refcount/properties.c:
* tests/refcount/properties2.c:
* tests/refcount/signals.c:
fixed up test and threading fundamentals. variables accessed from all
threads need to be volatile. context switches are enforced by using
g_thread_yield(), not g_usleep(1) which may result in busy waits on
some platforms. for testcode, always consider all warnings and
critical messages fatal. issue the currently running program on
stdout. improved progress indicators.
* tests/refcount/properties.c:
* tests/refcount/objects.c:
don't overdo the number of testing threads to keep the testing machine
usable, 2 threads can produce as much contention as 20 if executing the
same code.
* tests/refcount/signals.c: only start 1 thread per object. GObject
doesn't provide mutually exclusive object access, but only mutually
exclusive reference count modification.
* tests/Makefile.am: added closures test.
Mon Aug 1 23:00:42 2005 Tim Janik <timj@imendio.com>
* gclosure.c: turned all modifications to the first 32 integer bits in a
closure into atomic accesses. wrapped write accesses into special macros
to keep the atomic modification logic in a single place. comment cleanups.
* gclosure.h: made all atomicly accessed closure fields volatile.
* gobject.h: made ref_count field volatile.
2005-08-01 Tor Lillqvist <tml@novell.com>
* tests/uri-test.c: Make it pass on Win32.
(from_uri_tests[]): Take into consideration that on Win32 we don't
return "localhost" hostnames.
(safe_strcmp_filename): New function that considers slash and
backslash equal on Win32.
(run_roundtrip_tests): Use safe_strcmp_filename().
Sun Jul 31 01:50:20 2005 Tim Janik <timj@gtk.org>
* glib/gdataset.c:
moved G_DATALIST_*_POINTER() macros here, because proper use requires
the global g_dataset_global mutex to be acquired.
g_datalist_id_get_data():
g_datalist_unset_flags():
g_datalist_set_flags(): properly acquire and release dataset mutex.
* glib/gdatasetprivate.h: implement G_DATALIST_GET_FLAGS() via atomic
pointer access to account for memory barriers. moved all other macros.
Sun Jul 31 02:04:23 2005 Tim Janik <timj@gtk.org>
* gobject.c: use g_datalist_set_flags() and g_datalist_unset_flags() to
allow proper locking around &qdata modifications.
Sat Jul 30 21:10:26 2005 Tim Janik <timj@gtk.org>
* gobject.c: reverted notify_mutex introduction, since this prevents
parallelized setting of object properties on different objects, and
serves no apparent purpose (to me at least).
g_object_real_dispose(): removed non-atomic reference count
modifications.
g_object_unref(): make sure the closures array is destroyed when
destroying signal handlers.
* gparam.c: cosmetic changes.
* gsignal.c: comment fixup. allow 16bit blocking count.
* gsignal.c: reverted GClosure related changes.
* gclosure.c: reverted premature commit of atomic reference
counting attempt.
2005-07-26 Matthias Clasen <mclasen@redhat.com>
* configure.in: Try -mt as compiler flag for threads, needed
for the HP C compiler on HP-UX. (#163051, Paul Cornett)
2005-07-20 Matthias Clasen <mclasen@redhat.com>
* glib/gthreadpool.c (g_thread_pool_free): Don't get
stuck in here if immediate is TRUE. (#310954,
Hong Jen Yee)
* tests/threadpool-test.c (main): Test immediate == TRUE.
2005-07-20 Tor Lillqvist <tml@novell.com>
* glib/gutils.h (g_win32_get_system_data_dirs): Make this an
inline function. Define it only if G_CAN_INLINE and not
C++. (#173098)
2005-07-19 Matthias Clasen <mclasen@redhat.com>
* glib/gstring.c (g_string_chunk_insert_len): Avoid
an unnecessary strlen if len is -1. (#169692,
Benoit Dejean)
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)