diff --git a/internal/debug/loudpanic.go b/internal/debug/loudpanic.go
index a7296e7b3f..86e6bc88f8 100644
--- a/internal/debug/loudpanic.go
+++ b/internal/debug/loudpanic.go
@@ -14,6 +14,9 @@
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see .
+//go:build go1.6
+// +build go1.6
+
package debug
import "runtime/debug"
diff --git a/internal/debug/loudpanic_fallback.go b/internal/debug/loudpanic_fallback.go
new file mode 100644
index 0000000000..377490e5be
--- /dev/null
+++ b/internal/debug/loudpanic_fallback.go
@@ -0,0 +1,25 @@
+// Copyright 2016 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+//go:build !go1.6
+// +build !go1.6
+
+package debug
+
+// LoudPanic panics in a way that gets all goroutine stacks printed on stderr.
+func LoudPanic(x interface{}) {
+ panic(x)
+}
diff --git a/internal/debug/trace.go b/internal/debug/trace.go
index e291030b82..eea8798234 100644
--- a/internal/debug/trace.go
+++ b/internal/debug/trace.go
@@ -14,6 +14,9 @@
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see .
+//go:build go1.5
+// +build go1.5
+
package debug
import (
diff --git a/internal/debug/trace_fallback.go b/internal/debug/trace_fallback.go
new file mode 100644
index 0000000000..ec07d991ef
--- /dev/null
+++ b/internal/debug/trace_fallback.go
@@ -0,0 +1,32 @@
+// Copyright 2016 The go-ethereum Authors
+// This file is part of the go-ethereum library.
+//
+// The go-ethereum library is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Lesser General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// The go-ethereum library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with the go-ethereum library. If not, see .
+
+//go:build !go1.5
+// +build !go1.5
+
+// no-op implementation of tracing methods for Go < 1.5.
+
+package debug
+
+import "errors"
+
+func (*HandlerT) StartGoTrace(string) error {
+ return errors.New("tracing is not supported on Go < 1.5")
+}
+
+func (*HandlerT) StopGoTrace() error {
+ return errors.New("tracing is not supported on Go < 1.5")
+}
diff --git a/log/handler.go b/log/handler.go
index 4a0cf578f6..892cfcc3e1 100644
--- a/log/handler.go
+++ b/log/handler.go
@@ -7,7 +7,6 @@ import (
"os"
"reflect"
"sync"
- "sync/atomic"
"github.com/go-stack/stack"
)
@@ -355,21 +354,3 @@ func (m muster) FileHandler(path string, fmtr Format) Handler {
func (m muster) NetHandler(network, addr string, fmtr Format) Handler {
return must(NetHandler(network, addr, fmtr))
}
-
-// swapHandler wraps another handler that may be swapped out
-// dynamically at runtime in a thread-safe fashion.
-type swapHandler struct {
- handler atomic.Value
-}
-
-func (h *swapHandler) Log(r *Record) error {
- return (*h.handler.Load().(*Handler)).Log(r)
-}
-
-func (h *swapHandler) Swap(newHandler Handler) {
- h.handler.Store(&newHandler)
-}
-
-func (h *swapHandler) Get() Handler {
- return *h.handler.Load().(*Handler)
-}
diff --git a/log/handler_go13.go b/log/handler_go13.go
new file mode 100644
index 0000000000..4df694debe
--- /dev/null
+++ b/log/handler_go13.go
@@ -0,0 +1,27 @@
+//go:build !go1.4
+// +build !go1.4
+
+package log
+
+import (
+ "sync/atomic"
+ "unsafe"
+)
+
+// swapHandler wraps another handler that may be swapped out
+// dynamically at runtime in a thread-safe fashion.
+type swapHandler struct {
+ handler unsafe.Pointer
+}
+
+func (h *swapHandler) Log(r *Record) error {
+ return h.Get().Log(r)
+}
+
+func (h *swapHandler) Get() Handler {
+ return *(*Handler)(atomic.LoadPointer(&h.handler))
+}
+
+func (h *swapHandler) Swap(newHandler Handler) {
+ atomic.StorePointer(&h.handler, unsafe.Pointer(&newHandler))
+}
diff --git a/log/handler_go14.go b/log/handler_go14.go
new file mode 100644
index 0000000000..d0cb14aa06
--- /dev/null
+++ b/log/handler_go14.go
@@ -0,0 +1,24 @@
+//go:build go1.4
+// +build go1.4
+
+package log
+
+import "sync/atomic"
+
+// swapHandler wraps another handler that may be swapped out
+// dynamically at runtime in a thread-safe fashion.
+type swapHandler struct {
+ handler atomic.Value
+}
+
+func (h *swapHandler) Log(r *Record) error {
+ return (*h.handler.Load().(*Handler)).Log(r)
+}
+
+func (h *swapHandler) Swap(newHandler Handler) {
+ h.handler.Store(&newHandler)
+}
+
+func (h *swapHandler) Get() Handler {
+ return *h.handler.Load().(*Handler)
+}