| 
									
										
										
										
											2019-06-11 12:45:33 +02:00
										 |  |  | // Copyright 2019 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 <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package p2p | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"container/heap" | 
					
						
							| 
									
										
										
										
											2020-02-13 11:10:03 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/ethereum/go-ethereum/common/mclock" | 
					
						
							| 
									
										
										
										
											2019-06-11 12:45:33 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // expHeap tracks strings and their expiry time. | 
					
						
							|  |  |  | type expHeap []expItem | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // expItem is an entry in addrHistory. | 
					
						
							|  |  |  | type expItem struct { | 
					
						
							|  |  |  | 	item string | 
					
						
							| 
									
										
										
										
											2020-02-13 11:10:03 +01:00
										 |  |  | 	exp  mclock.AbsTime | 
					
						
							| 
									
										
										
										
											2019-06-11 12:45:33 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // nextExpiry returns the next expiry time. | 
					
						
							| 
									
										
										
										
											2020-02-13 11:10:03 +01:00
										 |  |  | func (h *expHeap) nextExpiry() mclock.AbsTime { | 
					
						
							| 
									
										
										
										
											2019-06-11 12:45:33 +02:00
										 |  |  | 	return (*h)[0].exp | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // add adds an item and sets its expiry time. | 
					
						
							| 
									
										
										
										
											2020-02-13 11:10:03 +01:00
										 |  |  | func (h *expHeap) add(item string, exp mclock.AbsTime) { | 
					
						
							| 
									
										
										
										
											2019-06-11 12:45:33 +02:00
										 |  |  | 	heap.Push(h, expItem{item, exp}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // contains checks whether an item is present. | 
					
						
							|  |  |  | func (h expHeap) contains(item string) bool { | 
					
						
							|  |  |  | 	for _, v := range h { | 
					
						
							|  |  |  | 		if v.item == item { | 
					
						
							|  |  |  | 			return true | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return false | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // expire removes items with expiry time before 'now'. | 
					
						
							| 
									
										
										
										
											2020-02-13 11:10:03 +01:00
										 |  |  | func (h *expHeap) expire(now mclock.AbsTime, onExp func(string)) { | 
					
						
							|  |  |  | 	for h.Len() > 0 && h.nextExpiry() < now { | 
					
						
							|  |  |  | 		item := heap.Pop(h) | 
					
						
							|  |  |  | 		if onExp != nil { | 
					
						
							|  |  |  | 			onExp(item.(expItem).item) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-06-11 12:45:33 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // heap.Interface boilerplate | 
					
						
							|  |  |  | func (h expHeap) Len() int            { return len(h) } | 
					
						
							| 
									
										
										
										
											2020-02-13 11:10:03 +01:00
										 |  |  | func (h expHeap) Less(i, j int) bool  { return h[i].exp < h[j].exp } | 
					
						
							| 
									
										
										
										
											2019-06-11 12:45:33 +02:00
										 |  |  | func (h expHeap) Swap(i, j int)       { h[i], h[j] = h[j], h[i] } | 
					
						
							|  |  |  | func (h *expHeap) Push(x interface{}) { *h = append(*h, x.(expItem)) } | 
					
						
							|  |  |  | func (h *expHeap) Pop() interface{} { | 
					
						
							|  |  |  | 	old := *h | 
					
						
							|  |  |  | 	n := len(old) | 
					
						
							|  |  |  | 	x := old[n-1] | 
					
						
							|  |  |  | 	*h = old[0 : n-1] | 
					
						
							|  |  |  | 	return x | 
					
						
							|  |  |  | } |