1// +build !go1.4 2 3package log15 4 5import ( 6 "sync/atomic" 7 "unsafe" 8) 9 10// swapHandler wraps another handler that may be swapped out 11// dynamically at runtime in a thread-safe fashion. 12type swapHandler struct { 13 handler unsafe.Pointer 14} 15 16func (h *swapHandler) Log(r *Record) error { 17 return h.Get().Log(r) 18} 19 20func (h *swapHandler) Get() Handler { 21 return *(*Handler)(atomic.LoadPointer(&h.handler)) 22} 23 24func (h *swapHandler) Swap(newHandler Handler) { 25 atomic.StorePointer(&h.handler, unsafe.Pointer(&newHandler)) 26} 27