diff options
| author | Michael Pratt <mpratt@google.com> | 2022-03-04 13:24:04 -0500 |
|---|---|---|
| committer | Michael Pratt <mpratt@google.com> | 2022-04-28 16:50:31 +0000 |
| commit | 29bbca5c2c1ad41b2a9747890d183b6dd3a4ace4 (patch) | |
| tree | 74ea0c8d0bed2673984f9c0767c40ace72fc0bb2 /src/runtime/map_faststr.go | |
| parent | 4bb45f7549548add8222aa4f3040d0e2120691a9 (diff) | |
| download | go-29bbca5c2c1ad41b2a9747890d183b6dd3a4ace4.tar.xz | |
runtime: differentiate "user" and "system" throws
"User" throws are throws due to some invariant broken by the application.
"System" throws are due to some invariant broken by the runtime,
environment, etc (i.e., not the fault of the application).
This CL sends "user" throws through the new fatal. Currently this
function is identical to throw, but with a different name to clearly
differentiate the throw type in the stack trace, and hopefully be a bit
more clear to users what it means.
This CL changes a few categories of throw to fatal:
1. Concurrent map read/write.
2. Deadlock detection.
3. Unlock of unlocked sync.Mutex.
4. Inconsistent results from syscall.AllThreadsSyscall.
"Thread exhaustion" and "out of memory" (usually address space full)
throws are additional throws that are arguably the fault of user code,
but I've left off for now because there is no specific invariant that
they have broken to get into these states.
For #51485
Change-Id: I713276a6c290fd34a6563e6e9ef378669d74ae32
Reviewed-on: https://go-review.googlesource.com/c/go/+/390420
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Run-TryBot: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/runtime/map_faststr.go')
| -rw-r--r-- | src/runtime/map_faststr.go | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/src/runtime/map_faststr.go b/src/runtime/map_faststr.go index 4dca882c63..006c24cee2 100644 --- a/src/runtime/map_faststr.go +++ b/src/runtime/map_faststr.go @@ -19,7 +19,7 @@ func mapaccess1_faststr(t *maptype, h *hmap, ky string) unsafe.Pointer { return unsafe.Pointer(&zeroVal[0]) } if h.flags&hashWriting != 0 { - throw("concurrent map read and map write") + fatal("concurrent map read and map write") } key := stringStructOf(&ky) if h.B == 0 { @@ -114,7 +114,7 @@ func mapaccess2_faststr(t *maptype, h *hmap, ky string) (unsafe.Pointer, bool) { return unsafe.Pointer(&zeroVal[0]), false } if h.flags&hashWriting != 0 { - throw("concurrent map read and map write") + fatal("concurrent map read and map write") } key := stringStructOf(&ky) if h.B == 0 { @@ -209,7 +209,7 @@ func mapassign_faststr(t *maptype, h *hmap, s string) unsafe.Pointer { racewritepc(unsafe.Pointer(h), callerpc, abi.FuncPCABIInternal(mapassign_faststr)) } if h.flags&hashWriting != 0 { - throw("concurrent map writes") + fatal("concurrent map writes") } key := stringStructOf(&s) hash := t.hasher(noescape(unsafe.Pointer(&s)), uintptr(h.hash0)) @@ -292,7 +292,7 @@ bucketloop: done: elem := add(unsafe.Pointer(insertb), dataOffset+bucketCnt*2*goarch.PtrSize+inserti*uintptr(t.elemsize)) if h.flags&hashWriting == 0 { - throw("concurrent map writes") + fatal("concurrent map writes") } h.flags &^= hashWriting return elem @@ -307,7 +307,7 @@ func mapdelete_faststr(t *maptype, h *hmap, ky string) { return } if h.flags&hashWriting != 0 { - throw("concurrent map writes") + fatal("concurrent map writes") } key := stringStructOf(&ky) @@ -383,7 +383,7 @@ search: } if h.flags&hashWriting == 0 { - throw("concurrent map writes") + fatal("concurrent map writes") } h.flags &^= hashWriting } |
