summaryrefslogtreecommitdiff
path: root/devel/glib2/patches
diff options
context:
space:
mode:
authorpho <pho@pkgsrc.org>2015-01-25 06:54:28 +0000
committerpho <pho@pkgsrc.org>2015-01-25 06:54:28 +0000
commit94db7c4d2e438b65ead87831e3ba5882b54c1d70 (patch)
treed002ef0ce1ae603467adfebf3100e1f33e97f195 /devel/glib2/patches
parent4975faf2e275285a59cdc02f64f648b0ff3eff5f (diff)
downloadpkgsrc-94db7c4d2e438b65ead87831e3ba5882b54c1d70.tar.gz
patches/patch-glib_gmain.c: Imported patch from the upstream Bugzilla
Bug 728123 - glib2 @2.40.0 issues a "Got weird mach timebase info" error (Macports, PPC) https://bugzilla.gnome.org/show_bug.cgi?id=728123 Tested on powerpc-apple-darwin9.
Diffstat (limited to 'devel/glib2/patches')
-rw-r--r--devel/glib2/patches/patch-glib_gmain.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/devel/glib2/patches/patch-glib_gmain.c b/devel/glib2/patches/patch-glib_gmain.c
new file mode 100644
index 00000000000..e87a1ab7caf
--- /dev/null
+++ b/devel/glib2/patches/patch-glib_gmain.c
@@ -0,0 +1,81 @@
+$NetBSD: patch-glib_gmain.c,v 1.1 2015/01/25 06:54:28 pho Exp $
+
+Imported patch from the upstream Bugzilla:
+
+ Bug 728123 - glib2 @2.40.0 issues a "Got weird mach timebase info" error (Macports, PPC)
+ https://bugzilla.gnome.org/show_bug.cgi?id=728123
+
+Tested on powerpc-apple-darwin9.
+
+--- glib/gmain.c.orig 2014-11-09 21:54:26.000000000 +0000
++++ glib/gmain.c
+@@ -2694,47 +2694,31 @@ g_get_monotonic_time (void)
+ gint64
+ g_get_monotonic_time (void)
+ {
+- static mach_timebase_info_data_t timebase_info;
++ mach_timebase_info_data_t timebase_info;
++ guint64 val;
+
+- if (timebase_info.denom == 0)
+- {
+- /* This is a fraction that we must use to scale
+- * mach_absolute_time() by in order to reach nanoseconds.
+- *
+- * We've only ever observed this to be 1/1, but maybe it could be
+- * 1000/1 if mach time is microseconds already, or 1/1000 if
+- * picoseconds. Try to deal nicely with that.
+- */
+- mach_timebase_info (&timebase_info);
+-
+- /* We actually want microseconds... */
+- if (timebase_info.numer % 1000 == 0)
+- timebase_info.numer /= 1000;
+- else
+- timebase_info.denom *= 1000;
+-
+- /* We want to make the numer 1 to avoid having to multiply... */
+- if (timebase_info.denom % timebase_info.numer == 0)
+- {
+- timebase_info.denom /= timebase_info.numer;
+- timebase_info.numer = 1;
+- }
+- else
+- {
+- /* We could just multiply by timebase_info.numer below, but why
+- * bother for a case that may never actually exist...
+- *
+- * Plus -- performing the multiplication would risk integer
+- * overflow. If we ever actually end up in this situation, we
+- * should more carefully evaluate the correct course of action.
+- */
+- mach_timebase_info (&timebase_info); /* Get a fresh copy for a better message */
+- g_error ("Got weird mach timebase info of %d/%d. Please file a bug against GLib.",
+- timebase_info.numer, timebase_info.denom);
+- }
++ /* we get nanoseconds from mach_absolute_time() using timebase_info */
++ mach_timebase_info (&timebase_info);
++ val = mach_absolute_time();
++
++ if (timebase_info.numer != timebase_info.denom)
++ {
++ guint64 t_high, t_low;
++ guint64 result_high, result_low;
++
++ /* 64 bit x 32 bit / 32 bit with 96-bit intermediate
++ * algorithm lifted from qemu */
++ t_low = (val & 0xffffffffLL) * (guint64)timebase_info.numer;
++ t_high = (val >> 32) * (guint64)timebase_info.numer;
++ t_high += (t_low >> 32);
++ result_high = t_high / (guint64)timebase_info.denom;
++ result_low = (((t_high % (guint64)timebase_info.denom) << 32) +
++ (t_low & 0xffffffff)) / (guint64)timebase_info.denom;
++ val = ((result_high << 32) | result_low);
+ }
+
+- return mach_absolute_time () / timebase_info.denom;
++ /* nanoseconds to microseconds */
++ return val / 1000;
+ }
+ #else
+ gint64