logsink_fatal.go 861 B

1234567891011121314151617181920212223242526272829303132333435
  1. package logsink
  2. import (
  3. "sync/atomic"
  4. "unsafe"
  5. )
  6. func fatalMessageStore(e savedEntry) {
  7. // Only put a new one in if we haven't assigned before.
  8. atomic.CompareAndSwapPointer(&fatalMessage, nil, unsafe.Pointer(&e))
  9. }
  10. var fatalMessage unsafe.Pointer // savedEntry stored with CompareAndSwapPointer
  11. // FatalMessage returns the Meta and message contents of the first message
  12. // logged with Fatal severity, or false if none has occurred.
  13. func FatalMessage() (*Meta, []byte, bool) {
  14. e := (*savedEntry)(atomic.LoadPointer(&fatalMessage))
  15. if e == nil {
  16. return nil, nil, false
  17. }
  18. return e.meta, e.msg, true
  19. }
  20. // DoNotUseRacyFatalMessage is FatalMessage, but worse.
  21. //
  22. //go:norace
  23. //go:nosplit
  24. func DoNotUseRacyFatalMessage() (*Meta, []byte, bool) {
  25. e := (*savedEntry)(fatalMessage)
  26. if e == nil {
  27. return nil, nil, false
  28. }
  29. return e.meta, e.msg, true
  30. }