]> Cypherpunks.ru repositories - gostls13.git/blobdiff - src/runtime/malloc.go
[dev.typeparams] all: merge master (798ec73) into dev.typeparams
[gostls13.git] / src / runtime / malloc.go
index 8483ec99d88cd946b78d2755dd9618612ab7c699..f8d5d48a28d7c8f7c1e35ebc013f93a166bbb42b 100644 (file)
@@ -1126,13 +1126,21 @@ func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
                msanmalloc(x, size)
        }
 
+       if rate := MemProfileRate; rate > 0 {
+               // Note cache c only valid while m acquired; see #47302
+               if rate != 1 && size < c.nextSample {
+                       c.nextSample -= size
+               } else {
+                       profilealloc(mp, x, size)
+               }
+       }
        mp.mallocing = 0
        releasem(mp)
 
        // Pointerfree data can be zeroed late in a context where preemption can occur.
        // x will keep the memory alive.
        if !isZeroed && needzero {
-               memclrNoHeapPointersChunked(size, x)
+               memclrNoHeapPointersChunked(size, x) // This is a possible preemption point: see #47302
        }
 
        if debug.malloc {
@@ -1146,16 +1154,6 @@ func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {
                }
        }
 
-       if rate := MemProfileRate; rate > 0 {
-               if rate != 1 && size < c.nextSample {
-                       c.nextSample -= size
-               } else {
-                       mp := acquirem()
-                       profilealloc(mp, x, size)
-                       releasem(mp)
-               }
-       }
-
        if assistG != nil {
                // Account for internal fragmentation in the assist
                // debt now that we know it.