]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use newm for profileloop
authorAustin Clements <austin@google.com>
Tue, 13 Apr 2021 12:32:21 +0000 (08:32 -0400)
committerAustin Clements <austin@google.com>
Tue, 13 Apr 2021 21:13:11 +0000 (21:13 +0000)
This replaces the externalthreadhandler-based implementation of
profileloop with one that uses newm to start a new thread. This is a
step toward eliminating externalthreadhandler.

For #45530.

Change-Id: Id8e5540423fe2d2004024b649afec6998f77b092
Reviewed-on: https://go-review.googlesource.com/c/go/+/309633
Trust: Austin Clements <austin@google.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/runtime/os_windows.go
src/runtime/sys_windows_386.s
src/runtime/sys_windows_amd64.s
src/runtime/sys_windows_arm.s
src/runtime/sys_windows_arm64.s

index 77ad075be10c2ad448000ea171e5ee2479e19c00..5bff4b6646eef9b574766ba7971f52c96d34e43e 100644 (file)
@@ -1198,9 +1198,6 @@ func ctrlHandler(_type uint32) uintptr {
        return 0
 }
 
-// in sys_windows_386.s and sys_windows_amd64.s
-func profileloop()
-
 // called from zcallback_windows_*.s to sys_windows_*.s
 func callbackasm1()
 
@@ -1233,13 +1230,18 @@ func gFromSP(mp *m, sp uintptr) *g {
        return nil
 }
 
-func profileloop1(param uintptr) uint32 {
+func profileLoop() {
        stdcall2(_SetThreadPriority, currentThread, _THREAD_PRIORITY_HIGHEST)
 
        for {
                stdcall2(_WaitForSingleObject, profiletimer, _INFINITE)
                first := (*m)(atomic.Loadp(unsafe.Pointer(&allm)))
                for mp := first; mp != nil; mp = mp.alllink {
+                       if mp == getg().m {
+                               // Don't profile ourselves.
+                               continue
+                       }
+
                        lock(&mp.threadLock)
                        // Do not profile threads blocked on Notes,
                        // this includes idle worker threads,
@@ -1251,8 +1253,8 @@ func profileloop1(param uintptr) uint32 {
                        // Acquire our own handle to the thread.
                        var thread uintptr
                        if stdcall7(_DuplicateHandle, currentProcess, mp.thread, currentProcess, uintptr(unsafe.Pointer(&thread)), 0, 0, _DUPLICATE_SAME_ACCESS) == 0 {
-                               print("runtime.profileloop1: duplicatehandle failed; errno=", getlasterror(), "\n")
-                               throw("runtime.profileloop1: duplicatehandle failed")
+                               print("runtime: duplicatehandle failed; errno=", getlasterror(), "\n")
+                               throw("duplicatehandle failed")
                        }
                        unlock(&mp.threadLock)
 
@@ -1280,9 +1282,7 @@ func setProcessCPUProfiler(hz int32) {
        if profiletimer == 0 {
                timer := stdcall3(_CreateWaitableTimerA, 0, 0, 0)
                atomic.Storeuintptr(&profiletimer, timer)
-               thread := stdcall6(_CreateThread, 0, 0, funcPC(profileloop), 0, 0, 0)
-               stdcall2(_SetThreadPriority, thread, _THREAD_PRIORITY_HIGHEST)
-               stdcall1(_CloseHandle, thread)
+               newm(profileLoop, nil, -1)
        }
 }
 
index b1c27c40d96b8a9f2e4e1f1f866182f3f5d4202f..c8839b99768be154d6e7cedd2b0e80277cbcbe9d 100644 (file)
@@ -156,15 +156,6 @@ TEXT runtime·lastcontinuetramp<ABIInternal>(SB),NOSPLIT,$0-0
        MOVL    $runtime·lastcontinuehandler(SB), AX
        JMP     sigtramp<>(SB)
 
-// Called by OS using stdcall ABI: uint32 profileloop(void*).
-TEXT runtime·profileloop<ABIInternal>(SB),NOSPLIT,$0
-       PUSHL   $runtime·profileloop1(SB)
-       NOP     SP      // tell vet SP changed - stop checking offsets
-       CALL    runtime·externalthreadhandler(SB)
-       MOVL    4(SP), CX
-       ADDL    $12, SP
-       JMP     CX
-
 TEXT runtime·externalthreadhandler<ABIInternal>(SB),NOSPLIT|TOPFRAME,$0
        PUSHL   BP
        MOVL    SP, BP
index e9428c36db9c33dfab44904c790fa17fc067c7e1..df1462b8779d3e26f74859b5b2c9772d39d635e1 100644 (file)
@@ -202,12 +202,6 @@ TEXT runtime·lastcontinuetramp<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-0
        MOVQ    $runtime·lastcontinuehandler(SB), AX
        JMP     sigtramp<>(SB)
 
-TEXT runtime·profileloop<ABIInternal>(SB),NOSPLIT|NOFRAME,$8
-       MOVQ    $runtime·profileloop1(SB), CX
-       MOVQ    CX, 0(SP)
-       CALL    runtime·externalthreadhandler<ABIInternal>(SB)
-       RET
-
 TEXT runtime·externalthreadhandler<ABIInternal>(SB),NOSPLIT|NOFRAME|TOPFRAME,$0
        PUSHQ   BP
        MOVQ    SP, BP
index 304bba22e04d87936b950b2687118453ec318684..8914a2688faa75162bd5ca35185a11f7083c0ba9 100644 (file)
@@ -233,10 +233,6 @@ TEXT runtime·lastcontinuetramp<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
        MOVW    $runtime·lastcontinuehandler(SB), R1
        B       sigtramp<>(SB)
 
-TEXT runtime·profileloop<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
-       MOVW    $runtime·profileloop1(SB), R1
-       B       runtime·externalthreadhandler<ABIInternal>(SB)
-
 // int32 externalthreadhandler(uint32 arg, int (*func)(uint32))
 // stack layout:
 //   +----------------+
index 4512fbc8b09e9e7e2d0195940dfc33856a93a178..70f628c27d84457800e087e123053743116b0601 100644 (file)
@@ -299,10 +299,6 @@ TEXT runtime·lastcontinuetramp(SB),NOSPLIT|NOFRAME,$0
        MOVD    $runtime·lastcontinuehandler<ABIInternal>(SB), R1
        B       sigtramp<>(SB)
 
-TEXT runtime·profileloop<ABIInternal>(SB),NOSPLIT|NOFRAME,$0
-       MOVD    $runtime·profileloop1(SB), R1
-       B       runtime·externalthreadhandler<ABIInternal>(SB)
-
 // externalthreadhander called with R0 = uint32 arg, R1 = Go function f.
 // Need to call f(arg), which returns a uint32, and return it in R0.
 TEXT runtime·externalthreadhandler<ABIInternal>(SB),NOSPLIT|TOPFRAME,$96-0