Switch 'self' 'join' and 'create' from using the vtable to being called
via normal g_system_thread_* internal API (implemented in each of
gthread-{posix,win32}.c).
Again, we can put NULL in the vtable since these were never used from
gthread.h.
Thread priorities were already documented as not working on Solaris, and
they are meaningless on Linux unless the process separately requests
realtime scheduling (and even then, it appears only to work as root).
We can safely put a NULL into the vtable for set_priority since nothing
outside of gthread.c ever calls this (and that call is gone).
We remove the macros while at the same time switching all libglib users
from g_private_new() to g_private_init(). We deal with the strange
expectations of the libglib code that g_private_* should work before the
GPrivate has been initialised with a temporary shim.
Now that nothing inside of GLib is using g_cond_new(), we can implement
it using GSlice. Since the implementations for POSIX and Windows are
now the same, move it to gthread.c.
Now that nothing inside of GLib is using g_mutex_new, we can implement
it using GSlice. Since the implementations for POSIX and Windows are
now the same, move it to gthread.c.
Remove the explicit thread initialisation functions for g_get_charset(),
g_get_filename_charsets() and g_get_language_names().
Add a lock around one remaining case of access to libcharset (the other
2 cases already have the lock).
Do a proper g_once_init_enter() style initialisation for the GLib
gettext functions.
https://bugzilla.gnome.org/show_bug.cgi?id=658683
g_thread_gettime() is an undocumented public function pointer that
points to a function that returns the monotonic time in nanoseconds.
g_get_monotonic_time() does the same in microseconds, so it can be used
instead.
GLib had one internal user in GFileMonitor that only cared about
millisecond accuracy; it has been ported to g_get_monotonic_time().
G_THREADS_ENABLED still exists, but is always defined. It is still
possible to use libglib without threads, but gobject (and everything
above it) is now guaranteed to be using threads (as, in fact, it was
before, since it was accidentally impossible to compile with
--disable-threads).
https://bugzilla.gnome.org/show_bug.cgi?id=616754
When getting the mutex implementation of a static mutex, avoid taking the global
lock every time but only take the lock when there was no mutex and we need to
create one.
https://bugzilla.gnome.org/show_bug.cgi?id=599954
- remove all inline assembly versions
- implement the atomic operations using either GCC intrinsics, the
Windows interlocked API or a mutex-based fallback
- drop gatomic-gcc.c since these are now defined in the header file.
Adjust Makefile.am accordingly.
- expand the set of operations: support 'get', 'set', 'compare and
exchange', 'add', 'or', and 'xor' for both integers and pointers
- deprecate g_atomic_int_exchange_and_add since g_atomic_int_add (as
with all the new arithmetic operations) now returns the prior value
- unify the use of macros: all functions are now wrapped in macros that
perform the proper casts and checks
- remove G_GNUC_MAY_ALIAS use; it was never required for the integer
operations (since casting between pointers that only vary in
signedness of the target is explicitly permitted) and we avoid the
need for the pointer operations by using simple 'void *' instead of
'gpointer *' (which caused the 'type-punned pointer' warning)
- provide function implementations of g_atomic_int_inc and
g_atomic_int_dec_and_test: these were strictly macros before
- improve the documentation to make it very clear exactly which types
of pointers these operations may be used with
- remove a few uses of the now-deprecated g_atomic_int_exchange_and_add
- drop initialisation of gatomic from gthread (by using a GStaticMutex
instead of a GMutex)
- update glib.symbols and documentation sections files
Closes#650823 and #650935
* g_static_private_get: have a single entry and exit
* g_static_private_set: delay creation of GArray so the whole tail of
the function can be under the private_data lock without risking
deadlock with the g_thread lock; call the destructor last, after
we could have unlocked
* g_static_private_free: choose next thread in list before accessing
private_data, to keep all accesses together
* g_thread_cleanup: steal private_data first, then work exclusively with
the stolen array (which doesn't need to be under a lock any more)
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=642026
Bug-NB: NB#257512
Add support for a mutex lock that consumes only one bit of storage
inside of an integer on systems that support futexes. Futex is emulated
(at a higher cost) on systems that don't have it -- but only in the
contended case.
GLib users buildable with gcc 4.4. Patch by Jakub Jelinek.
* glib/gatomic.[hc]: Add G_GNUC_MAY_ALIAS to pointer arguments,
fix macro versions to only operate on objects of the same size.
* glib/gdataset.c:
* glib/gthread.[hc]:
* glib/gdatasetprivate.h: Remove unnecessary casts in
g_atomic_pointer_get calls.
svn path=/trunk/; revision=7875
Tue Aug 14 02:06:10 2007 Tim Janik <timj@imendio.com>
* glib/gthread.c (g_once_init_enter_impl): prevent race covered
by g_once_init_enter(), by checking for previous initializations
before entering initialisation branch.
* tests/onceinit.c: added multi-thread/multi-initializer stress test
using unoptimized g_once_init_enter_impl().
svn path=/trunk/; revision=5701
Mon Aug 13 14:18:22 2007 Tim Janik <timj@imendio.com>
* glib/gthread.c (g_thread_create_full): prevent linking a freed
GThread structure into global thread list in error cases.
svn path=/trunk/; revision=5697
Fri Jul 13 01:01:46 2007 Tim Janik <timj@imendio.com>
* glib/gthread.[hc]: more atomic ops pointer cast fixes. this time it'll
work with atomic op macros *and* atomic op functions.
svn path=/trunk/; revision=5638
Tue Jul 10 12:24:35 2007 Tim Janik <timj@imendio.com>
* glib/gthread.[hc]: implemented g_once_init_enter(),
g_once_init_enter_impl() and g_once_init_leave(), based on a patch by
Antoine Tremblay, fixes#65041.
adapted exported inline function mechanism from gutils.[hc] for inlining
g_once_init_enter_impl() in gthread.[hc].
svn path=/trunk/; revision=5616
2007-06-15 Sebastian Wilhelmi <wilhelmi@google.com>
* docs/reference/glib/tmpl/threads.sgml: Extended the comments on
those functions, that are NOOPs, before g_thread_init() has been
called. (#447583)
* glib/gthread.c (g_static_mutex_free): Clarified comment to
remind myself, tha calling g_static_mutex_free() before
g_thread_init() is safe.
svn path=/trunk/; revision=5567
2007-01-16 Matthias Clasen <mclasen@redhat.com>
* glib/gthread.h:
* glib/gthread.c:
* glib/glib.symbols: Revert an accidental ABI break by
moving gettime out of the GThreadFunctions struct and making
it a separate variable. (#397139, Joe Marcus Clarke)
* gthread/*.c: Adapt.
svn path=/trunk/; revision=5279
2007-01-16 Tor Lillqvist <tml@novell.com>
* glib/gthread.c (gettime)
* gthread-win32.c (g_gettime_win32_impl):
GetSystemTimeAsFileTime() returns 100s of nanoseconds since 1601,
so offset to Unix epoch (1970) and multiply by 100 to get
nanoseconds which is what we want.
svn path=/trunk/; revision=5277
2007-01-16 Tor Lillqvist <tml@novell.com>
* glib/gthread.c (gettime)
* gthread-win32.c (g_gettime_win32_impl):
GetSystemTimeAsFileTime() returns 100s of nanoseconds, so multiply
by 100 to get nanoseconds which is what we want.
svn path=/trunk/; revision=5276
2005-01-15 Matthias Clasen <mclasen@redhat.com>
* glib/gthread.c:
* gthread/gthread-posix.c: Correct the gettime calculations
once more. (#395203, Chris Wilson)
svn path=/trunk/; revision=5262
2007-01-12 Matthias Clasen <mclasen@redhat.com>
* gthread/gthread-posix.c:
* glib/gtimer.c:
* glib/gthread.c: Fix errors in the recently moved
time calculations. (#395203, Chris Wilson)
svn path=/trunk/; revision=5244
2007-01-07 Matthias Clasen <mclasen@redhat.com>
Don't link glib against libpthread. (#393812)
* configure.in: Link gthread against librt, not glib itself.
* glib/gthread.h:
* glib/gthread.c: Add a new thread function, gettime.
* glib/gtimer.c: Use gettime instead of directly working with
the various system interfaces.
* gthread/gthread-impl.c:
* gthread/gthread-posix.c:
* gthread/gthread-win32.c: Implement gettime.
svn path=/trunk/; revision=5227
2006-05-22 Sebastian Wilhelmi <wilhelmi@google.com>
* glib/gthread.c (g_thread_init_glib): Run _g_atomic_thread_init
as the first of the full fledged initializers to allow the later
to potentially use atomic ints (which they currently do
not). (#342563, Peter Kjellerstedt)
2006-05-10 Sebastian Wilhelmi <wilhelmi@google.com>
* glib/gthread.c: Use g_atomic_pointer_set instead of old
homegrown version now that we have it. (#335198, Chris Wilson)
2006-05-09 Sebastian Wilhelmi <wilhelmi@google.com>
* glib/gthreadinit.h: Renamed to glib/gthreadprivate.h and moved
system thread identifier comparision and assignment macros from
glib/gthread.c to glib/gthreadprivate.h.
* glib/Makefile.am, glib/gatomic.c, glib/gconvert.c, glib/gmain.c,
glib/gmem.c, glib/gmessages.c, glib/grand.c, glib/gslice.c,
glib/gthread.c, glib/gutils.c, gthread/gthread-impl.c: Use
glib/gthreadprivate.h instead of glib/gthreadinit.h.
* gthread/gthread-impl.c: Use GSystemThread instead of GThread for
owner determination. This fixes#311043 and is mostly modeled
after the patch from jylefort@FreeBSD.org.
Thu Dec 1 17:32:46 2005 Tim Janik <timj@imendio.com>
* glib/gslice.[hc]: new slice allocator implementation.
* tests/slice-test.c: added random slice allocation test.
* glib/gthread.[hc]: removed newly added private thread mem API.
* glib/gthreadinit.h:
* glib/gmessages.c:
* glib/gthread.c:
* glib/gmem.c: divided glib threading initialisation into three phases,
initialisation where private keys and messaging are not available (only
needed by gmem.c), initialisation without messaging but private keys
available (gslice.c, gmessage.c), and full fledged initialisers that
server the rest of glib. initialisation functions got renamed to reflect
the limitations of their corresponding phases.
* glib/gmem.c: removed memchunk code, defer allocations to
g_slice_* instead.
* glib/gmem.[hc]: removed g_slice_* skeletons.
* glib/glib.symbols: added g_slice_* symbols.
* configure.in: check for availability of posix_memalign(3), memalign(3)
and valloc(3).
* glib/Makefile.am: added gslice.[hc].
2005-11-17 Matthias Clasen <mclasen@redhat.com>
* glib/gbacktrace.c:
* glib/gdate.c:
* glib/gthread.c: const correctness fixes, found
by Arjan van de Ven and gcc.
Tue Nov 1 16:24:20 2005 Tim Janik <timj@imendio.com>
* glib/gmem.[hc]: prepared deprecation of GMemChunk and GAllocator.
added g_slice_*() API to allocate and cache small bits of memory.
an actuall allocator implementation for g_slice_*() is still pending.
* glib/gthread.[hc]: changes from a patch by Matthias Clasen.
changed GRealThread list to use in-structure *next; fields instead
of GSList, in order for thread iteration to not depenend on g_slice_*()
indirectly.
_g_thread_mem_private_get():
_g_thread_mem_private_set(): added accessors for private memory,
needed because the ordinary GPrivate implementation relies on GArray
and GSList and therefore indirectly on working g_slice_*() allocations.
* glib/gthread.[hc]:
g_thread_foreach(): new public API function to loop over all existing threads.
* glib/gdataset.c:
* glib/gstring.c:
* glib/gcache.c:
* glib/garray.c:
* glib/gqueue.c:
* glib/gslist.c:
* glib/glist.c:
* glib/ghash.c:
* glib/gtree.c:
* glib/ghook.c:
* glib/gmain.c:
* glib/gnode.c:
removed GAllocator and free list usages and accompanying locks.
use g_slice_*() API to allocate and cache small bits of memory.
* glib/ghook.h: removed GMemChunk field from public API.
* glib/gslist.h:
* glib/glist.h: deprecate allocator API, provide _free1() for consistency.
* glib/gnode.h: deprecate allocator API.
* glib/gmain.c: reordered GPollRec fields so g_slice_free_chain() can
be used for poll rec lists.
* glib/grel.c: removed mem chunk usage, and allocated tuples via g_slice_*().
g_relation_destroy(): free all tuples from the all_tuples hash table,
this effectively maintains the life time track keeping of tuples.
g_relation_delete_tuple(): free tuples which are removed from the
all_tuples hash table. this fixes a temporary leak that was present
in the memchunk code until the destruction of the relation.
2005-03-13 Matthias Clasen <mclasen@redhat.com>
Make PLT-reduction work with gcc4, and don't include
everything in galias.h:
* glib/glib.symbols: Group symbols by header and source file.
* glib/makegalias.pl: Protect definitions by the same
preprocessor symbols used to guard the headers. Move
the alias declarations to a separate file which is
produced when calling makegalias.pl -def
* glib/Makefile.am (galiasdef.c): Add a rule to generate this
file.
* glib/*.c: Include galias.h after the other GLib headers,
include galiasdef.c at the bottom.
2004-12-07 Matthias Clasen <mclasen@redhat.com>
* glib/gutils.c (g_get_language_names): Update the returned
value after locale changes. (#160271, Christian Persch)
(_g_utils_thread_init): Initialize the language name cache
before going threaded.
* glib/gthread.c (g_thread_init_glib): Call _g_utils_thread_init().
* glib/gthreadinit.h: Add _g_utils_thread_init().
2004-10-26 Matthias Clasen <mclasen@redhat.com>
* glib/gwin32.c (g_win32_get_windows_version): Make this
function thread-safe in the GLib style.
* glib/gthreadinit.h:
* glib/gwin32.c (_g_win32_thread_init): New function to
initialize the version.
* glib/gthread.c (g_thread_init_glib): Call
_g_win32_thread_init() from here.
2004-04-10 Tor Lillqvist <tml@iki.fi>
* glib/giowin32.c
* glib/gmain.c
* glib/gstrfuncs.c
* glib/gthread.c: Decorating variable definitions with
__declspec(dllexport) causes problems on Cygwin build, and isn't
really needed for a native Win32 build with mingw or MSVC, so
remove. (#138402, Roger Leigh)
* glib/libcharset/localcharset.c: Use Win32-specific code also on
Cygwin.
* tests/uri-test.c: Don't assume that local filenames are in UTF-8
on Cygwin, either. (#138412, Roger Leigh)
2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
* configure.in, config.h.win32.in, glib/gthread.c: Removed the PID
niceness surrogate for thread priorities as requested by Tim. It
does more harm than good.
* glib/tmpl/threads.sgml: Updated to reflect removal of the PID
niceness surrogate for thread priorities.
2004-02-25 Sebastian Wilhelmi <seppi@seppi.de>
* configure.in, glib/gthread.c: For the PID thread priorities
surrogate use gettid instead of getpid. This also works with nptl
(on linux-2.6), as well as with linuxthreads (on linux-2.4).
2003-07-09 Matthias Clasen <maclas@gmx.de>
Support for one-time initialization functions. (#69668, Sebastian Wilhelmi)
* configure.in: Check whether double checked locking is safe, define g_once() in
glibconfig.h accordingly.
* glib/gthread.h: Add GOnce, GOnceStatus, G_ONCE_INIT and g_once_impl.
* glib/gthread.c (g_once_impl): Fallback implementation using a mutex if double checked
locking is unsafe.
* tests/thread-test.c: Add tests for g_once().
2003-03-14 Sebastian Wilhelmi <seppi@seppi.de>
* glib/gthread.c: Do not define function g_thread_init_glib, if
not G_THREADS_ENABLED. It's not called bu g_thread_init() then,
but calls other, in that case undefined functions.
2003-02-14 Sebastian Wilhelmi <seppi@seppi.de>
Fixes for #101264 and #99372:
* glib/gconvert.h, glib/gmain.c, glib/gmem.c, glib/gmessages.c,
glib/grand.c: Include gthreadinit.h and rename the thread
initialization functions a bit and let them start with _, so that
later we can stop exporting them.
* glib/gmem.c, glib/gmessages.c: Move the g_private_new() calls to
new functions. They have to be called after setting
g_threads_got_initialized to TRUE (see #101264).
* glib/gthread.c: Include gthreadinit.h. Renamed g_mutex_init() to
g_thread_init_glib(). Call the thread initialization functions
(which are not allowed to call g_private_new), then set
g_threads_got_initialized to TRUE, then call the other thread
initialization functions (which must not call anything but
g_private_new()).
* glib/gthreadinit.h: New private header to cleanly declare all
thread initialization functions.
* gthread/gthread-impl.c: Include gthreadinit.h. In
g_thread_init() just call g_thread_init_glib(), which in turn calls the
other functions (see #99372).
* glib/Makefile.am: Added gthreadinit.h.
Sat Dec 14 21:10:57 2002 Owen Taylor <otaylor@redhat.com>
* glib/gthread.h: Mark the contents of the strucures
in this file /*< private >*/
* glib/gthread.[ch]: Rename the 'write' field of the
structure to 'have_writer' to avoid any possible
conflict with system headers. (#90549, Morten Welinder)
2002-08-06 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gthread.c: Set the normal PID surrogate priority according
to getpid() to avoid errors for niced processes. (#86116)
* gthread/gthread-impl.c, gthread/gthread-posix.c,
gthread/gthread-solaris.c: Do the same for the posix/dce
implementation. Solaris still needs to set priority of the main
thread, because all unbound threads will schedule according to
that value and it defaults to 0 (the minimal value).
2002-02-04 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gthread.c (g_thread_create_full): Delay allocation until
after all g_return_val_if_fail ().
* glib/gthread.h: Make depth member guint for cosmetic reasons.
* glib/gthread.c: (g_static_rec_mutex_unlock_full): depth should
be unsigned. All that spotted by Jörgen Viksell
<jorgen.viksell@telia.com>
2001-09-19 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gthread.h (GThreadFunctions): Add thread_equal function to
allow for platform defined function to compare two threads.
* glib/gthread.c: Use g_thread_functions_for_glib_use.thread_equal
when non-NULL instead of ==.
* gthread/gthread-posix.c: Add g_thread_equal_posix_impl and
add to the function vector g_thread_functions_for_glib_use_default.
* gthread/gthread-solaris.c, gthread/gthread-win32.c: Add NULL
as equal function, as on those two platforms you don't need an
equal function.
2001-08-30 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib/gthread.h, glib/gthread.c: Add 'want_to_read' to
GStaticRWLock to avoid calling g_cond_broadcast, when no one is
waiting.
Sat Jun 30 15:49:10 2001 Owen Taylor <otaylor@redhat.com>
* glib/gmain.[ch]: (Mostly patch from Sebastian Wilhemi)
Make some changes to the way that GMainContext works:
- a GMainContext is no longer associated with a single
thread, but any thread can acquire ownership
of thread and iterate.
- There is a facility g_main_context_wait() for
non-owner-threads to wait either for ownership
or for a condition to be broadcast.
- For efficiency, GMainLoop just piggybacks of
of the loops mutex / condition instead of
having a separate mutex/condition for each
GMainLoop.
* glib/gthread.[ch]: Remove hacks to store the thread's
GMainContext in the GThread structures, since we
no longer have the GMainContext <=> GThread correspondence.
* glib/gmain.[ch]: Make g_main_context_wakeup() public
so someone could completely duplicate GMainLoop
with the public API.
* tests/mainloop-test: Fix up to the new API. Decidedly
doesn't work at the moment, but that may be the IO
channel changes, or preexisting locking problems.
2001-05-22 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* glib.def: g_thread_create renamed to g_thread_create_full.
* gthread.c: memcpy is not necessary here. We can simply use
struct assignment.
* gmessages.c: Fix compilation error on win32. Added
GFileDescriptor, wich is gint on Unix and FILE* on win32.
2001-05-18 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed g_thread_create to
g_thread_create_full and added macro g_thread_create, which omits
'stack_size', 'bound' and 'priority' parameters. Also removed
'bound' from GThread struct.
* gthreadpool.h, gthreadpool.c: Adapted GThreadPool to the above
changes. GThreadPool lost the 'priority' and 'bound'
members. g_thread_pool_new the 'stack_size', 'bound' and
'priority' parameters.
* tests/mainloop-test.c, tests/thread-test.c,
tests/threadpool-test.c: Adapted to the above changes.
2001-05-09 Sebastian Wilhelmi <wilhelmi@ira.uka.de>
* gthread.c, gthread.h: Renamed 'value' and 'arg' to 'data' and
'thread_func' to 'func' to make it more consistent with the rest
of GLib.
* gthreadpool.c, gthreadpool.h: Moved 'stack_size' from the public
members of GThreadPool to the private ones. Renamed 'thread_func'
to 'func' as above. Moved up 'user_data' in g_thead_pool_new
argument list and in GThreadPool struct.