123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- /*
- Keeping track of pending available snowflake proxies.
- */
- package main
- /*
- The Snowflake struct contains a single interaction
- over the offer and answer channels.
- */
- type Snowflake struct {
- id string
- offerChannel chan []byte
- answerChannel chan []byte
- clients int
- index int
- }
- // Implements heap.Interface, and holds Snowflakes.
- type SnowflakeHeap []*Snowflake
- func (sh SnowflakeHeap) Len() int { return len(sh) }
- func (sh SnowflakeHeap) Less(i, j int) bool {
- // Snowflakes serving less clients should sort earlier.
- return sh[i].clients < sh[j].clients
- }
- func (sh SnowflakeHeap) Swap(i, j int) {
- sh[i], sh[j] = sh[j], sh[i]
- sh[i].index = i
- sh[j].index = j
- }
- func (sh *SnowflakeHeap) Push(s interface{}) {
- n := len(*sh)
- snowflake := s.(*Snowflake)
- snowflake.index = n
- *sh = append(*sh, snowflake)
- }
- // Only valid when Len() > 0.
- func (sh *SnowflakeHeap) Pop() interface{} {
- flakes := *sh
- n := len(flakes)
- snowflake := flakes[n-1]
- snowflake.index = -1
- *sh = flakes[0 : n-1]
- return snowflake
- }
|