diff options
| author | Chris Lu <chris.lu@gmail.com> | 2019-12-06 22:20:59 -0800 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2019-12-06 22:20:59 -0800 |
| commit | f81d43442b11b0471db00a77ad8bc9b462977474 (patch) | |
| tree | 1d0ad3566947cd4c9e5ba3a6374490197bdf3c8b /weed/util/queue.go | |
| parent | f38f90b7ea546373076c69d3b93069ea8fa46755 (diff) | |
| download | seaweedfs-f81d43442b11b0471db00a77ad8bc9b462977474.tar.xz seaweedfs-f81d43442b11b0471db00a77ad8bc9b462977474.zip | |
filer: speed up filer.meta.save by parallelizing
Diffstat (limited to 'weed/util/queue.go')
| -rw-r--r-- | weed/util/queue.go | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/weed/util/queue.go b/weed/util/queue.go new file mode 100644 index 000000000..31d9d1769 --- /dev/null +++ b/weed/util/queue.go @@ -0,0 +1,61 @@ +package util + +import "sync" + +type node struct { + data interface{} + next *node +} + +type Queue struct { + head *node + tail *node + count int + sync.RWMutex +} + +func NewQueue() *Queue { + q := &Queue{} + return q +} + +func (q *Queue) Len() int { + q.RLock() + defer q.RUnlock() + return q.count +} + +func (q *Queue) Enqueue(item interface{}) { + q.Lock() + defer q.Unlock() + + n := &node{data: item} + + if q.tail == nil { + q.tail = n + q.head = n + } else { + q.tail.next = n + q.tail = n + } + q.count++ +} + +func (q *Queue) Dequeue() interface{} { + q.Lock() + defer q.Unlock() + + if q.head == nil { + return nil + } + + n := q.head + q.head = n.next + + if q.head == nil { + q.tail = nil + } + q.count-- + + return n.data +}
\ No newline at end of file |
