Commit 428afae0 authored by Austin Clements's avatar Austin Clements

runtime: use func value for parfor body

Yet another leftover from C: parfor took a func value for the
callback, casted it to an unsafe.Pointer for storage, and then casted
it back to a func value to call it.  This is unnecessary, so just
store the body as a func value.  Beyond general cleanup, this also
eliminates the last use of unsafe in parfor.

Change-Id: Ia904af7c6c443ba75e2699835aee8e9a39b26dd8
Reviewed-on: https://go-review.googlesource.com/3396Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
Reviewed-by: 's avatarDmitry Vyukov <dvyukov@google.com>
parent ebbdf2a1
......@@ -36,7 +36,7 @@ func LFStackPop(head *uint64) *LFNode {
}
type ParFor struct {
body *byte
body func(*ParFor, uint32)
done uint32
Nthr uint32
thrseq uint32
......
......@@ -6,16 +6,14 @@
package runtime
import "unsafe"
// A parfor holds state for the parallel for operation.
type parfor struct {
body unsafe.Pointer // go func(*parfor, uint32), executed for each element
done uint32 // number of idle threads
nthr uint32 // total number of threads
thrseq uint32 // thread id sequencer
cnt uint32 // iteration space [0, cnt)
wait bool // if true, wait while all threads finish processing,
body func(*parfor, uint32) // executed for each element
done uint32 // number of idle threads
nthr uint32 // total number of threads
thrseq uint32 // thread id sequencer
cnt uint32 // iteration space [0, cnt)
wait bool // if true, wait while all threads finish processing,
// otherwise parfor may return while other threads are still working
thr []parforthread // thread descriptors
......@@ -63,7 +61,7 @@ func parforsetup(desc *parfor, nthr, n uint32, wait bool, body func(*parfor, uin
throw("parfor: invalid args")
}
desc.body = *(*unsafe.Pointer)(unsafe.Pointer(&body))
desc.body = body
desc.done = 0
desc.nthr = nthr
desc.thrseq = 0
......@@ -91,7 +89,7 @@ func parfordo(desc *parfor) {
}
// If single-threaded, just execute the for serially.
body := *(*func(*parfor, uint32))(unsafe.Pointer(&desc.body))
body := desc.body
if desc.nthr == 1 {
for i := uint32(0); i < desc.cnt; i++ {
body(desc, i)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment