@@ -5873,8 +5873,6 @@ func procresize(nprocs int32) *p {
5873
5873
}
5874
5874
sched .procresizetime = now
5875
5875
5876
- maskWords := (nprocs + 31 ) / 32
5877
-
5878
5876
// Grow allp if necessary.
5879
5877
if nprocs > int32 (len (allp )) {
5880
5878
// Synchronize with retake, which could be running
@@ -5890,19 +5888,8 @@ func procresize(nprocs int32) *p {
5890
5888
allp = nallp
5891
5889
}
5892
5890
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 )
5906
5893
unlock (& allpLock )
5907
5894
}
5908
5895
@@ -5965,8 +5952,8 @@ func procresize(nprocs int32) *p {
5965
5952
if int32 (len (allp )) != nprocs {
5966
5953
lock (& allpLock )
5967
5954
allp = allp [:nprocs ]
5968
- idlepMask = idlepMask [: maskWords ]
5969
- timerpMask = timerpMask [: maskWords ]
5955
+ idlepMask = idlepMask . resize ( nprocs )
5956
+ timerpMask = timerpMask . resize ( nprocs )
5970
5957
unlock (& allpLock )
5971
5958
}
5972
5959
@@ -6905,6 +6892,22 @@ func (p pMask) clear(id int32) {
6905
6892
atomic .And (& p [word ], ^ mask )
6906
6893
}
6907
6894
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
+
6908
6911
// pidleput puts p on the _Pidle list. now must be a relatively recent call
6909
6912
// to nanotime or zero. Returns now or the current time if now was zero.
6910
6913
//
0 commit comments