| 
					
				 | 
			
			
				@@ -42,7 +42,7 @@ func (queue *timedQueueImpl) Pop() interface{} { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type TimedQueue struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	queue   timedQueueImpl 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	access  sync.Mutex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	access  sync.RWMutex 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	removed chan interface{} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -50,7 +50,7 @@ func NewTimedQueue(updateInterval int) *TimedQueue { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	queue := &TimedQueue{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		queue:   make([]*timedQueueEntry, 0, 256), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		removed: make(chan interface{}, 16), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		access:  sync.Mutex{}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		access:  sync.RWMutex{}, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	go queue.cleanup(time.Tick(time.Duration(updateInterval) * time.Second)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	return queue 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -72,18 +72,23 @@ func (queue *TimedQueue) RemovedEntries() <-chan interface{} { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (queue *TimedQueue) cleanup(tick <-chan time.Time) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		now := <-tick 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if queue.queue.Len() == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    queue.access.RLock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    queueLen := queue.queue.Len() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    queue.access.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if queueLen == 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		nowSec := now.UTC().Unix() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		entry := queue.queue[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		if entry.timeSec > nowSec { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    queue.access.RLock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		firstEntryTime := queue.queue[0].timeSec 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    queue.access.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if firstEntryTime > nowSec { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		queue.access.Lock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		entry = heap.Pop(&queue.queue).(*timedQueueEntry) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		firstEntryValue := heap.Pop(&queue.queue).(*timedQueueEntry).value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		queue.access.Unlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		queue.removed <- entry.value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		queue.removed <- firstEntryValue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |