| 
									
										
										
										
											2021-08-25 18:46:29 +02:00
										 |  |  | //go:build !go1.4 | 
					
						
							| 
									
										
										
										
											2017-02-20 17:39:36 +02:00
										 |  |  | // +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)) | 
					
						
							|  |  |  | } |