mirror of
https://github.com/golang/go
synced 2024-11-12 07:30:25 -07:00
runtime: fix misaligned 64-bit atomic
Fixes #4869. Fixes #5007. Update #5005. R=golang-dev, 0xe2.0x9a.0x9b, bradfitz CC=golang-dev https://golang.org/cl/7534044
This commit is contained in:
parent
8d51c33012
commit
433824d808
@ -1757,6 +1757,8 @@ runtime·gc(int32 force)
|
||||
// a problem in the past.
|
||||
if((((uintptr)&work.empty) & 7) != 0)
|
||||
runtime·throw("runtime: gc work buffer is misaligned");
|
||||
if((((uintptr)&work.full) & 7) != 0)
|
||||
runtime·throw("runtime: gc work buffer is misaligned");
|
||||
|
||||
// The gc is turned off (via enablegc) until
|
||||
// the bootstrap has completed.
|
||||
|
@ -46,6 +46,7 @@ void
|
||||
runtime·parforsetup(ParFor *desc, uint32 nthr, uint32 n, void *ctx, bool wait, void (*body)(ParFor*, uint32))
|
||||
{
|
||||
uint32 i, begin, end;
|
||||
uint64 *pos;
|
||||
|
||||
if(desc == nil || nthr == 0 || nthr > desc->nthrmax || body == nil) {
|
||||
runtime·printf("desc=%p nthr=%d count=%d body=%p\n", desc, nthr, n, body);
|
||||
@ -67,7 +68,10 @@ runtime·parforsetup(ParFor *desc, uint32 nthr, uint32 n, void *ctx, bool wait,
|
||||
for(i=0; i<nthr; i++) {
|
||||
begin = (uint64)n*i / nthr;
|
||||
end = (uint64)n*(i+1) / nthr;
|
||||
desc->thr[i].pos = (uint64)begin | (((uint64)end)<<32);
|
||||
pos = &desc->thr[i].pos;
|
||||
if(((uintptr)pos & 7) != 0)
|
||||
runtime·throw("parforsetup: pos is not aligned");
|
||||
*pos = (uint64)begin | (((uint64)end)<<32);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -483,6 +483,7 @@ struct ParFor
|
||||
bool wait; // if true, wait while all threads finish processing,
|
||||
// otherwise parfor may return while other threads are still working
|
||||
ParForThread *thr; // array of thread descriptors
|
||||
uint32 pad; // to align ParForThread.pos for 64-bit atomic operations
|
||||
// stats
|
||||
uint64 nsteal;
|
||||
uint64 nstealcnt;
|
||||
|
Loading…
Reference in New Issue
Block a user