mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 03:16:17 +01:00
empty G_ATOMIC_MEMORY_BARRIER() definition for !G_THREADS_ENABLED
2004-02-26 Sebastian Wilhelmi <seppi@seppi.de> * glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for !G_THREADS_ENABLED * glib/gthread.h: Define g_once and g_static_mutex_get_mutex_impl_shortcut in terms of G_MEMORY_BARRIER, if defined and if we can inline. * configure.in: Remove double checked locking feature check.
This commit is contained in:
parent
76c213543a
commit
ea9d13892e
@ -1,5 +1,14 @@
|
||||
2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
|
||||
|
||||
* glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for
|
||||
!G_THREADS_ENABLED
|
||||
|
||||
* glib/gthread.h: Define g_once and
|
||||
g_static_mutex_get_mutex_impl_shortcut in terms of
|
||||
G_MEMORY_BARRIER, if defined and if we can inline.
|
||||
|
||||
* configure.in: Remove double checked locking feature check.
|
||||
|
||||
* 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.
|
||||
|
@ -1,5 +1,14 @@
|
||||
2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
|
||||
|
||||
* glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for
|
||||
!G_THREADS_ENABLED
|
||||
|
||||
* glib/gthread.h: Define g_once and
|
||||
g_static_mutex_get_mutex_impl_shortcut in terms of
|
||||
G_MEMORY_BARRIER, if defined and if we can inline.
|
||||
|
||||
* configure.in: Remove double checked locking feature check.
|
||||
|
||||
* 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.
|
||||
|
@ -1,5 +1,14 @@
|
||||
2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
|
||||
|
||||
* glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for
|
||||
!G_THREADS_ENABLED
|
||||
|
||||
* glib/gthread.h: Define g_once and
|
||||
g_static_mutex_get_mutex_impl_shortcut in terms of
|
||||
G_MEMORY_BARRIER, if defined and if we can inline.
|
||||
|
||||
* configure.in: Remove double checked locking feature check.
|
||||
|
||||
* 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.
|
||||
|
@ -1,5 +1,14 @@
|
||||
2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
|
||||
|
||||
* glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for
|
||||
!G_THREADS_ENABLED
|
||||
|
||||
* glib/gthread.h: Define g_once and
|
||||
g_static_mutex_get_mutex_impl_shortcut in terms of
|
||||
G_MEMORY_BARRIER, if defined and if we can inline.
|
||||
|
||||
* configure.in: Remove double checked locking feature check.
|
||||
|
||||
* 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.
|
||||
|
@ -1,5 +1,14 @@
|
||||
2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
|
||||
|
||||
* glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for
|
||||
!G_THREADS_ENABLED
|
||||
|
||||
* glib/gthread.h: Define g_once and
|
||||
g_static_mutex_get_mutex_impl_shortcut in terms of
|
||||
G_MEMORY_BARRIER, if defined and if we can inline.
|
||||
|
||||
* configure.in: Remove double checked locking feature check.
|
||||
|
||||
* 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.
|
||||
|
@ -1,5 +1,14 @@
|
||||
2004-02-26 Sebastian Wilhelmi <seppi@seppi.de>
|
||||
|
||||
* glib/gatomic.h: empty G_ATOMIC_MEMORY_BARRIER() definition for
|
||||
!G_THREADS_ENABLED
|
||||
|
||||
* glib/gthread.h: Define g_once and
|
||||
g_static_mutex_get_mutex_impl_shortcut in terms of
|
||||
G_MEMORY_BARRIER, if defined and if we can inline.
|
||||
|
||||
* configure.in: Remove double checked locking feature check.
|
||||
|
||||
* 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.
|
||||
|
40
configure.in
40
configure.in
@ -1188,27 +1188,6 @@ esac
|
||||
AC_MSG_RESULT($GIO)
|
||||
AC_SUBST(GIO)
|
||||
|
||||
dnl check for cpu to enable double checked locking when possible
|
||||
dnl ************************************************************
|
||||
|
||||
if test x"$have_threads" != xno; then
|
||||
AC_MSG_CHECKING(whether double checked locking is safe)
|
||||
# According to glibc/linuxthreads the following platforms do
|
||||
# not have the notion of a read or write memory barrier and
|
||||
# therefore the double checked locking should be safe. Have a
|
||||
# look at pthread_once in glibc/linuxthreads/mutex.c to see,
|
||||
# what this means.
|
||||
case $host_cpu in
|
||||
arm|hppa|i386|i686|ia64|m68k|sh|cris|x86_64)
|
||||
g_use_double_checked_locking=yes
|
||||
;;
|
||||
*)
|
||||
g_use_double_checked_locking=no
|
||||
;;
|
||||
esac
|
||||
AC_MSG_RESULT($g_use_double_checked_locking)
|
||||
fi
|
||||
|
||||
dnl ****************************************
|
||||
dnl *** platform dependent source checks ***
|
||||
dnl ****************************************
|
||||
@ -2233,24 +2212,6 @@ typedef struct _GMutex* GStaticMutex;
|
||||
_______EOF
|
||||
fi
|
||||
|
||||
if test x$g_use_double_checked_locking = xyes; then
|
||||
cat >>$outfile <<_______EOF
|
||||
/* double checked locking can be used on this platform */
|
||||
#define g_once(once, func, arg) \\
|
||||
((once)->status == G_ONCE_STATUS_READY ? (once)->retval : \\
|
||||
g_once_impl (once, func, arg))
|
||||
#define g_static_mutex_get_mutex_impl_shortcut(mutex) \\
|
||||
(*(mutex) ? *(mutex) : g_static_mutex_get_mutex_impl (mutex))
|
||||
_______EOF
|
||||
else
|
||||
cat >>$outfile <<_______EOF
|
||||
/* double checked locking is unsafe to use on this platform, do full locking */
|
||||
#define g_once(once, func, arg) (g_once_impl(once, func, arg))
|
||||
#define g_static_mutex_get_mutex_impl_shortcut(mutex) \\
|
||||
(g_static_mutex_get_mutex_impl (mutex))
|
||||
_______EOF
|
||||
fi
|
||||
|
||||
cat >>$outfile <<_______EOF
|
||||
/* This represents a system thread as used by the implementation. An
|
||||
* alien implementaion, as loaded by g_thread_init can only count on
|
||||
@ -2565,7 +2526,6 @@ xno) g_enable_threads_def="#undef";;
|
||||
esac
|
||||
|
||||
g_threads_impl_def=$g_threads_impl
|
||||
g_use_double_checked_locking=$g_use_double_checked_locking
|
||||
|
||||
g_mutex_has_default="$mutex_has_default"
|
||||
g_mutex_sizeof="$glib_cv_sizeof_gmutex"
|
||||
|
@ -341,7 +341,7 @@ g_atomic_pointer_compare_and_exchange (gpointer *atomic,
|
||||
return result == oldval;
|
||||
}
|
||||
|
||||
# define G_ATOMIC_MEMORY_BARRIER() /* Not needed */
|
||||
# define G_ATOMIC_MEMORY_BARRIER() /* Not needed */
|
||||
|
||||
# elif defined(G_ATOMIC_INLINED_IMPLEMENTATION_POWERPC)
|
||||
/* Adapted from CVS version 1.12 of glibc's sysdeps/powerpc/bits/atomic.h
|
||||
@ -450,7 +450,7 @@ g_atomic_pointer_compare_and_exchange (gpointer *atomic,
|
||||
# error "Your system has an unsupported pointer size"
|
||||
# endif /* GLIB_SIZEOF_VOID_P */
|
||||
|
||||
# define G_ATOMIC_MEMORY_BARRIER() __asm ("sync" : : : "memory")
|
||||
# define G_ATOMIC_MEMORY_BARRIER() __asm ("sync" : : : "memory")
|
||||
|
||||
# elif defined(G_ATOMIC_INLINED_IMPLEMENTATION_IA64)
|
||||
/* Adapted from CVS version 1.8 of glibc's sysdeps/ia64/bits/atomic.h
|
||||
@ -486,7 +486,7 @@ g_atomic_pointer_compare_and_exchange (gpointer *atomic,
|
||||
(long)oldval, (long)newval);
|
||||
}
|
||||
|
||||
# define G_ATOMIC_MEMORY_BARRIER() __sync_synchronize ()
|
||||
# define G_ATOMIC_MEMORY_BARRIER() __sync_synchronize ()
|
||||
|
||||
# else /* !G_ATOMIC_INLINED_IMPLEMENTATION_... */
|
||||
# define G_ATOMIC_USE_FALLBACK_IMPLEMENTATION
|
||||
@ -503,6 +503,7 @@ gint32 g_atomic_int_exchange_and_add (gint32 *atomic, gint32 val);
|
||||
(*(atomic) == (oldval) ? (*(atomic) = (newval), TRUE) : FALSE)
|
||||
# define g_atomic_int_get(atomic) (*(atomic))
|
||||
# define g_atomic_pointer_get(atomic) (*(atomic))
|
||||
# define G_ATOMIC_MEMORY_BARRIER() /* Not needed */
|
||||
#endif /* G_THREADS_ENABLED */
|
||||
|
||||
#ifdef G_ATOMIC_USE_FALLBACK_IMPLEMENTATION
|
||||
|
@ -29,6 +29,8 @@
|
||||
|
||||
#include <glib/gerror.h>
|
||||
#include <glib/gtypes.h>
|
||||
#include <glib/gutils.h> /* for G_CAN_INLINE */
|
||||
#include <glib/gatomic.h> /* for G_ATOMIC_MEMORY_BARRIER */
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@ -302,6 +304,30 @@ struct _GOnce
|
||||
|
||||
gpointer g_once_impl (GOnce *once, GThreadFunc func, gpointer arg);
|
||||
|
||||
#if defined (G_CAN_INLINE) && defined (G_ATOMIC_MEMORY_BARRIER)
|
||||
static inline gpointer
|
||||
g_once (GOnce *once, GThreadFunc func, gpointer arg)
|
||||
{
|
||||
if (once->status != G_ONCE_STATUS_READY)
|
||||
return g_once_impl (once, func, arg);
|
||||
|
||||
G_ATOMIC_MEMORY_BARRIER ();
|
||||
return once->retval;
|
||||
}
|
||||
static inline GMutex*
|
||||
g_static_mutex_get_mutex_impl_shortcut (GMutex **mutex)
|
||||
{
|
||||
if (! *mutex)
|
||||
return g_static_mutex_get_mutex_impl (mutex);
|
||||
|
||||
G_ATOMIC_MEMORY_BARRIER ();
|
||||
return *mutex;
|
||||
}
|
||||
#else /* !G_CAN_INLINE || !G_ATOMIC_MEMORY_BARRIER */
|
||||
# define g_once g_once_impl
|
||||
# define g_static_mutex_get_mutex_impl_shortcut g_static_mutex_get_mutex_impl
|
||||
#endif /* G_CAN_INLINE && G_ATOMIC_MEMORY_BARRIER*/
|
||||
|
||||
/* these are some convenience macros that expand to nothing if GLib
|
||||
* was configured with --disable-threads. for using StaticMutexes,
|
||||
* you define them with G_LOCK_DEFINE_STATIC (name) or G_LOCK_DEFINE (name)
|
||||
|
Loading…
Reference in New Issue
Block a user