From b6814241cc84e9b73b53e8cd8bf48a1c90e0397a Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Sun, 9 Feb 2014 23:24:55 +0100 Subject: [PATCH] Fix locking around deleteFile (fixes #64) --- model/filequeue.go | 4 +++- model/filequeue_test.go | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/model/filequeue.go b/model/filequeue.go index e78c18025..fb9808692 100644 --- a/model/filequeue.go +++ b/model/filequeue.go @@ -199,7 +199,7 @@ func (q *FileQueue) QueuedFiles() (files []string) { } func (q *FileQueue) deleteAt(i int) { - q.files = q.files[:i+copy(q.files[i:], q.files[i+1:])] + q.files = append(q.files[:i], q.files[i+1:]...) } func (q *FileQueue) deleteFile(n string) { @@ -228,7 +228,9 @@ func (q *FileQueue) RemoveAvailable(toRemove string) { if node == toRemove { q.availability[file] = nodes[:i+copy(nodes[i:], nodes[i+1:])] if len(q.availability[file]) == 0 { + q.fmut.Lock() q.deleteFile(file) + q.fmut.Unlock() } } break diff --git a/model/filequeue_test.go b/model/filequeue_test.go index 7a274ce67..5f8670291 100644 --- a/model/filequeue_test.go +++ b/model/filequeue_test.go @@ -275,3 +275,21 @@ func TestFileQueueThreadHandling(t *testing.T) { t.Error("Total mismatch; %d != %d", gotTot, total) } } + +func TestDeleteAt(t *testing.T) { + q := FileQueue{} + + for i := 0; i < 4; i++ { + q.files = queuedFileList{{name: "a"}, {name: "b"}, {name: "c"}, {name: "d"}} + q.deleteAt(i) + if l := len(q.files); l != 3 { + t.Fatal("deleteAt(%d) failed; %d != 3", i, l) + } + } + + q.files = queuedFileList{{name: "a"}} + q.deleteAt(0) + if l := len(q.files); l != 0 { + t.Fatal("deleteAt(only) failed; %d != 0", l) + } +}