ref: e3843e8fa26afff64728ffe93ef77f0b10a1f109
parent: 7b5b914cf702375f8f532c2fe43c04d6eacd1fd6
author: Ori Bernstein <ori@eigenstate.org>
date: Fri Jun 22 17:10:13 EDT 2018
Fix compilation and clean up code. Use "atomic" was needed in the non-OSX platforms, to fix the build. The repated 'extern' declarations were also deleted, turning the declarations in atomic.myr into extern declarations. Semaphores were also cleaned up on Plan 9.
--- a/lib/sys/sys+plan9-x64.myr
+++ b/lib/sys/sys+plan9-x64.myr
@@ -159,9 +159,9 @@
const exec : (bin : byte[:], args : byte[:][:] -> int64)
const brk_ : (endp : byte# -> int64)
const nsec : (-> uint64)
- const semacquire : (addr : uint32#, block : int -> int)
- const tsemacquire : (addr : uint32#, ms : uint32 -> int)
- const semrelease : (addr : uint32#, count : int32 -> int32)
+ const semacquire : (addr : int32#, block : int -> int)
+ const tsemacquire : (addr : int32#, ms : int32 -> int)
+ const semrelease : (addr : int32#, count : int32 -> int32)
const rendezvous : (tag : void#, val : void# -> void#)
--- a/lib/thread/atomic.myr
+++ b/lib/thread/atomic.myr
@@ -19,6 +19,26 @@
generic xsetptr : (p : @a##, v : std.option(@a#) -> void)
generic xcasptr : (p : @a##, old : std.option(@a#), new : std.option(@a#) -> std.option(@a#))
generic xchgptr : (p : @a##, new : std.option(@a#) -> std.option(@a#))
+
+ pkglocal extern const xget32 : (p : uint32# -> uint32)
+ pkglocal extern const xget64 : (p : uint64# -> uint64)
+ pkglocal extern const xgetp : (p : std.intptr# -> std.intptr)
+
+ pkglocal extern const xset32 : (p : uint32#, v : uint32 -> void)
+ pkglocal extern const xset64 : (p : uint64#, v : uint64 -> void)
+ pkglocal extern const xsetp : (p : std.intptr#, v : std.intptr -> void)
+
+ pkglocal extern const xadd32 : (p : uint32#, v : uint32 -> uint32)
+ pkglocal extern const xadd64 : (p : uint64#, v : uint64 -> uint64)
+ pkglocal extern const xaddp : (p : std.intptr#, v : std.intptr -> std.intptr)
+
+ pkglocal extern const xcas32 : (p : uint32#, old: uint32, new : uint32 -> uint32)
+ pkglocal extern const xcas64 : (p : uint64#, old: uint64, new : uint64 -> uint64)
+ pkglocal extern const xcasp : (p : std.intptr#, old: std.intptr, new : std.intptr -> std.intptr)
+
+ pkglocal extern const xchg32 : (p : uint32#, v : uint32 -> uint32)
+ pkglocal extern const xchg64 : (p : uint64#, v : uint64 -> uint64)
+ pkglocal extern const xchgp : (p : std.intptr#, v : std.intptr -> std.intptr)
;;
impl atomic int32 =
@@ -88,22 +108,3 @@
;;
}
-extern const xget32 : (p : uint32# -> uint32)
-extern const xget64 : (p : uint64# -> uint64)
-extern const xgetp : (p : std.intptr# -> std.intptr)
-
-extern const xset32 : (p : uint32#, v : uint32 -> void)
-extern const xset64 : (p : uint64#, v : uint64 -> void)
-extern const xsetp : (p : std.intptr#, v : std.intptr -> void)
-
-extern const xadd32 : (p : uint32#, v : uint32 -> uint32)
-extern const xadd64 : (p : uint64#, v : uint64 -> uint64)
-extern const xaddp : (p : std.intptr#, v : std.intptr -> std.intptr)
-
-extern const xcas32 : (p : uint32#, old: uint32, new : uint32 -> uint32)
-extern const xcas64 : (p : uint64#, old: uint64, new : uint64 -> uint64)
-extern const xcasp : (p : std.intptr#, old: std.intptr, new : std.intptr -> std.intptr)
-
-extern const xchg32 : (p : uint32#, v : uint32 -> uint32)
-extern const xchg64 : (p : uint64#, v : uint64 -> uint64)
-extern const xchgp : (p : std.intptr#, v : std.intptr -> std.intptr)
--- a/lib/thread/futex+freebsd.myr
+++ b/lib/thread/futex+freebsd.myr
@@ -1,5 +1,6 @@
use sys
+use "atomic"
use "common"
pkg thread =
@@ -23,7 +24,7 @@
-> sys.umtx_op((uaddr : void#),
sys.Umtxwaituintpriv,
(val : uint64),
- (sys.sizeof(sys._umtx_time) : void#),
+ (sizeof(sys._umtx_time) : void#),
(&ut : void#))
}
@@ -38,9 +39,3 @@
xcas = {p, old, new; -> (xcas32((p : uint32#), (old : uint32), (new : uint32)) : ftxtag)}
xchg = {p, v; -> (xchg32((p : uint32#), (v : uint32)) : ftxtag)}
;;
-
-extern const xget32 : (p : uint32# -> uint32)
-extern const xset32 : (p : uint32#, v : uint32 -> void)
-extern const xadd32 : (p : uint32#, v : uint32 -> uint32)
-extern const xcas32 : (p : uint32#, old: uint32, new : uint32 -> uint32)
-extern const xchg32 : (p : uint32#, v : uint32 -> uint32)
--- a/lib/thread/futex+linux.myr
+++ b/lib/thread/futex+linux.myr
@@ -1,5 +1,6 @@
use sys
+use "atomic"
use "common"
pkg thread =
@@ -30,9 +31,3 @@
xcas = {p, old, new; -> (xcas32((p : uint32#), (old : uint32), (new : uint32)) : ftxtag)}
xchg = {p, v; -> (xchg32((p : uint32#), (v : uint32)) : ftxtag)}
;;
-
-extern const xget32 : (p : uint32# -> uint32)
-extern const xset32 : (p : uint32#, v : uint32 -> void)
-extern const xadd32 : (p : uint32#, v : uint32 -> uint32)
-extern const xcas32 : (p : uint32#, old: uint32, new : uint32 -> uint32)
-extern const xchg32 : (p : uint32#, v : uint32 -> uint32)
--- a/lib/thread/futex+openbsd:6.2.myr
+++ b/lib/thread/futex+openbsd:6.2.myr
@@ -1,5 +1,6 @@
use sys
+use "atomic"
use "common"
pkg thread =
@@ -26,8 +27,3 @@
xchg = {p, v; -> (xchg32((p : uint32#), (v : uint32)) : ftxtag)}
;;
-extern const xget32 : (p : uint32# -> uint32)
-extern const xset32 : (p : uint32#, v : uint32 -> void)
-extern const xadd32 : (p : uint32#, v : uint32 -> uint32)
-extern const xcas32 : (p : uint32#, old: uint32, new : uint32 -> uint32)
-extern const xchg32 : (p : uint32#, v : uint32 -> uint32)
--- a/lib/thread/futex+osx.myr
+++ b/lib/thread/futex+osx.myr
@@ -55,9 +55,3 @@
xcas = {p, old, new; -> (xcas64((p : uint64#), (old : uint64), (new : uint64)) : ftxtag)}
xchg = {p, v; -> (xchg64((p : uint64#), (v : uint64)) : ftxtag)}
;;
-
-extern const xget64 : (p : uint64# -> uint64)
-extern const xset64 : (p : uint64#, v : uint64 -> void)
-extern const xadd64 : (p : uint64#, v : uint64 -> uint64)
-extern const xcas64 : (p : uint64#, old: uint64, new : uint64 -> uint64)
-extern const xchg64 : (p : uint64#, v : uint64 -> uint64)
--- a/lib/thread/mutex+plan9.myr
+++ b/lib/thread/mutex+plan9.myr
@@ -7,8 +7,8 @@
pkg thread =
type mutex = struct
- _state : uint32
- _sem : uint32
+ _state : int32
+ _sem : int32
;;
const mkmtx : (-> mutex)
--- a/lib/thread/sem+plan9.myr
+++ b/lib/thread/sem+plan9.myr
@@ -6,8 +6,8 @@
pkg thread =
type sem = struct
- _user : int32
- _kern : int32
+ _user : uint32
+ _kern : uint32
;;
const mksem : (v : uint32 -> sem)
@@ -17,16 +17,17 @@
;;
const mksem = {v
- -> [._user = v, ._kern = 0]
+ std.assert((v : int32) > 0, "semaphore overflowed")
+ -> [._user = (v : int32), ._kern = 0]
}
const semwait = {s
var u = xadd(&s._user, -1)
- std.assert(u != 0xffffffff, "error: semaphore underflowed\n")
+ std.assert(u != ~0, "error: semaphore underflowed\n")
/* When the userspace value is negative we fall back on the kernel semaphore */
if u <= 0
- while sys.semacquire((&s._kern : uint32), 1) < 0
+ while sys.semacquire(&s._kern , 1) < 0
/* Interrupted, retry */
;;
;;
@@ -49,6 +50,6 @@
var u = xadd(&s._user, 1)
std.assert(u != 0x7fffffff, "error: semaphore overflowed\n")
if u < 0
- sys.semrelease((&s._kern : uint32), 1)
+ sys.semrelease(&s._kern, 1)
;;
}