27 lines
		
	
	
		
			511 B
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			27 lines
		
	
	
		
			511 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// +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))
							 | 
						||
| 
								 | 
							
								}
							 |