storj/storage/testqueue/queue.go

49 lines
911 B
Go

// Copyright (C) 2018 Storj Labs, Inc.
// See LICENSE for copying information.
package testqueue
import (
"container/list"
"fmt"
"sync"
"storj.io/storj/storage"
)
//Queue is a threadsafe FIFO queue implementing storage.Queue
type Queue struct {
mu sync.Mutex
s *list.List
}
//New returns a queue suitable for testing
func New() *Queue {
return &Queue{s: list.New(), mu: sync.Mutex{}}
}
//Enqueue add a FIFO element
func (q *Queue) Enqueue(value storage.Value) error {
q.mu.Lock()
defer q.mu.Unlock()
q.s.PushBack(value)
return nil
}
//Dequeue removes a FIFO element
func (q *Queue) Dequeue() (storage.Value, error) {
q.mu.Lock()
defer q.mu.Unlock()
for q.s.Len() > 0 {
e := q.s.Front() // First element
q.s.Remove(e) // Dequeue
return e.Value.(storage.Value), nil
}
return nil, fmt.Errorf("queue empty")
}
//Close closes the queue
func (q *Queue) Close() error {
return nil
}