Skip to content

Commit 69e74b0

Browse files
mknyszekgopherbot
authored andcommitted
runtime: deduplicate pMask resize code
Change-Id: I04a9a69904710a488c685cb9eee9c3313ed8e97b Reviewed-on: https://go-review.googlesource.com/c/go/+/701896 Reviewed-by: Michael Pratt <[email protected]> Auto-Submit: Michael Knyszek <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]>
1 parent fde10c4 commit 69e74b0

File tree

1 file changed

+20
-17
lines changed

1 file changed

+20
-17
lines changed

src/runtime/proc.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5873,8 +5873,6 @@ func procresize(nprocs int32) *p {
58735873
}
58745874
sched.procresizetime = now
58755875

5876-
maskWords := (nprocs + 31) / 32
5877-
58785876
// Grow allp if necessary.
58795877
if nprocs > int32(len(allp)) {
58805878
// Synchronize with retake, which could be running
@@ -5890,19 +5888,8 @@ func procresize(nprocs int32) *p {
58905888
allp = nallp
58915889
}
58925890

5893-
if maskWords <= int32(cap(idlepMask)) {
5894-
idlepMask = idlepMask[:maskWords]
5895-
timerpMask = timerpMask[:maskWords]
5896-
} else {
5897-
nidlepMask := make([]uint32, maskWords)
5898-
// No need to copy beyond len, old Ps are irrelevant.
5899-
copy(nidlepMask, idlepMask)
5900-
idlepMask = nidlepMask
5901-
5902-
ntimerpMask := make([]uint32, maskWords)
5903-
copy(ntimerpMask, timerpMask)
5904-
timerpMask = ntimerpMask
5905-
}
5891+
idlepMask = idlepMask.resize(nprocs)
5892+
timerpMask = timerpMask.resize(nprocs)
59065893
unlock(&allpLock)
59075894
}
59085895

@@ -5965,8 +5952,8 @@ func procresize(nprocs int32) *p {
59655952
if int32(len(allp)) != nprocs {
59665953
lock(&allpLock)
59675954
allp = allp[:nprocs]
5968-
idlepMask = idlepMask[:maskWords]
5969-
timerpMask = timerpMask[:maskWords]
5955+
idlepMask = idlepMask.resize(nprocs)
5956+
timerpMask = timerpMask.resize(nprocs)
59705957
unlock(&allpLock)
59715958
}
59725959

@@ -6905,6 +6892,22 @@ func (p pMask) clear(id int32) {
69056892
atomic.And(&p[word], ^mask)
69066893
}
69076894

6895+
// resize resizes the pMask and returns a new one.
6896+
//
6897+
// The result may alias p, so callers are encouraged to
6898+
// discard p. Not safe for concurrent use.
6899+
func (p pMask) resize(nprocs int32) pMask {
6900+
maskWords := (nprocs + 31) / 32
6901+
6902+
if maskWords <= int32(cap(p)) {
6903+
return p[:maskWords]
6904+
}
6905+
newMask := make([]uint32, maskWords)
6906+
// No need to copy beyond len, old Ps are irrelevant.
6907+
copy(newMask, p)
6908+
return newMask
6909+
}
6910+
69086911
// pidleput puts p on the _Pidle list. now must be a relatively recent call
69096912
// to nanotime or zero. Returns now or the current time if now was zero.
69106913
//

0 commit comments

Comments
 (0)