]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix timediv calls on NetBSD, OpenBSD
authorRuss Cox <rsc@golang.org>
Mon, 29 Jul 2013 20:31:42 +0000 (16:31 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 29 Jul 2013 20:31:42 +0000 (16:31 -0400)
Document endian-ness assumption.

R=dvyukov
CC=golang-dev
https://golang.org/cl/12056044

src/pkg/runtime/os_freebsd.c
src/pkg/runtime/os_linux.c
src/pkg/runtime/os_netbsd.c
src/pkg/runtime/os_openbsd.c

index 98de6dc3460bc40d87dc3b9ab50f8de91e48adfa..386b4002c2a4c81a4ba95b378c954afbad5458bf 100644 (file)
@@ -54,6 +54,7 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns)
                        return;
                goto fail;
        }
+       // NOTE: tv_nsec is int64 on amd64, so this assumes a little-endian system.
        ts.tv_nsec = 0;
        ts.tv_sec = runtime·timediv(ns, 1000000000, (int32*)&ts.tv_nsec);
        ret = runtime·sys_umtx_op(addr, UMTX_OP_WAIT_UINT, val, nil, &ts);
index 038208b60c556ab8aac704e644bb30f47a660ae0..d940c9765bf8e3cb6f4fe82801175696b4f20770 100644 (file)
@@ -48,6 +48,7 @@ runtime·futexsleep(uint32 *addr, uint32 val, int64 ns)
                runtime·futex(addr, FUTEX_WAIT, val, nil, nil, 0);
                return;
        }
+       // NOTE: tv_nsec is int64 on amd64, so this assumes a little-endian system.
        ts.tv_nsec = 0;
        ts.tv_sec = runtime·timediv(ns, 1000000000LL, (int32*)&ts.tv_nsec);
        runtime·futex(addr, FUTEX_WAIT, val, &ts, nil, 0);
index d6e573c3d550c2325348d13b5d1b3604d366628c..9c0511d4c00e91fa2617612dc6d5893b7685c451 100644 (file)
@@ -95,8 +95,9 @@ runtime·semasleep(int64 ns)
                                runtime·lwp_park(nil, 0, &m->waitsemacount, nil);
                        } else {
                                ns += runtime·nanotime();
+                               // NOTE: tv_nsec is int64 on amd64, so this assumes a little-endian system.
                                ts.tv_nsec = 0;
-                               ts.tv_sec = runtime·timediv(ns, 1000000000, (int32*)ts.tv_nsec);
+                               ts.tv_sec = runtime·timediv(ns, 1000000000, (int32*)&ts.tv_nsec);
                                // TODO(jsing) - potential deadlock!
                                // See above for details.
                                runtime·atomicstore(&m->waitsemalock, 0);
index 7468d013801c49988420f09d62e48d9c37eb0b55..bbb33a7f4875429108e201a33efd2f1691f955b5 100644 (file)
@@ -78,8 +78,9 @@ runtime·semasleep(int64 ns)
                                runtime·thrsleep(&m->waitsemacount, 0, nil, &m->waitsemalock, nil);
                        else {
                                ns += runtime·nanotime();
+                               // NOTE: tv_nsec is int64 on amd64, so this assumes a little-endian system.
                                ts.tv_nsec = 0;
-                               ts.tv_sec = runtime·timediv(ns, 1000000000, (int32*)ts.tv_nsec);
+                               ts.tv_sec = runtime·timediv(ns, 1000000000, (int32*)&ts.tv_nsec);
                                runtime·thrsleep(&m->waitsemacount, CLOCK_REALTIME, &ts, &m->waitsemalock, nil);
                        }
                        // reacquire lock