In libgo we unconditionally set _FILE_OFFSET_BITS to 64 in
configure.ac, so we should unconditionally call the statfs64 and
fstatfs64 functions rather than statfs/fstatfs. These functions
should be available on all versions of GNU/Linux since 2.6. On 64-bit
systems they are aliased to statfs/fstatfs, and on 32-bit systems they
use the 64-bit data structures. This fixes
https://golang.org/issue/20922. Bootstrapped and ran Go testsuite on
x86_64-pc-linux-gnu. Committed to mainline.
Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE (revision 250436)
+++ gcc/go/gofrontend/MERGE (working copy)
@@ -1,4 +1,4 @@
-a9f1aeced86691de891fbf2a8c97e848faf1962e
+b712bacd939466e66972337744983e180849c535
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
Index: libgo/runtime/go-caller.c
===================================================================
--- libgo/runtime/go-caller.c (revision 250406)
+++ libgo/runtime/go-caller.c (working copy)
@@ -74,7 +74,7 @@ static void *back_state;
/* A lock to control creating back_state. */
-static Lock back_state_lock;
+static uint32 back_state_lock;
/* The program arguments. */
@@ -85,7 +85,15 @@ extern Slice runtime_get_args(void);
struct backtrace_state *
__go_get_backtrace_state ()
{
- runtime_lock (&back_state_lock);
+ uint32 set;
+
+ /* We may not have a g here, so we can't use runtime_lock. */
+ set = 0;
+ while (!__atomic_compare_exchange_n (&back_state_lock, &set, 1, false,
__ATOMIC_ACQUIRE, __ATOMIC_RELAXED))
+ {
+ runtime_osyield ();
+ set = 0;
+ }
if (back_state == NULL)
{
Slice args;
@@ -113,7 +121,7 @@ __go_get_backtrace_state ()
back_state = backtrace_create_state (filename, 1, error_callback, NULL);
}
- runtime_unlock (&back_state_lock);
+ __atomic_store_n (&back_state_lock, 0, __ATOMIC_RELEASE);
return back_state;
}