From a275f65848f2c1fdd4302f56121defc408e7d8b6 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 28 Apr 2019 13:26:38 +0000 Subject: lib/msgstore: protect with a mutex MessageStore has a lot of exported fields that can be read from the outside. Each read must be protected, because a call from Update could happen at any time. --- widgets/msglist.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'widgets') diff --git a/widgets/msglist.go b/widgets/msglist.go index 4f853f3..eeadec7 100644 --- a/widgets/msglist.go +++ b/widgets/msglist.go @@ -53,6 +53,8 @@ func (ml *MessageList) Draw(ctx *ui.Context) { return } + store.Lock() + var ( needsHeaders []uint32 row int = 0 @@ -92,6 +94,8 @@ func (ml *MessageList) Draw(ctx *ui.Context) { tcell.StyleDefault, "%s", msg) } + store.Unlock() + if len(needsHeaders) != 0 { store.FetchHeaders(needsHeaders, nil) ml.spinner.Start() @@ -109,11 +113,13 @@ func (ml *MessageList) storeUpdate(store *lib.MessageStore) { return } + store.Lock() if len(store.Uids) > 0 { for ml.selected >= len(store.Uids) { ml.Prev() } } + store.Unlock() ml.Invalidate() } @@ -139,16 +145,25 @@ func (ml *MessageList) Store() *lib.MessageStore { func (ml *MessageList) Empty() bool { store := ml.Store() + store.Lock() + defer store.Unlock() + return store == nil || len(store.Uids) == 0 } func (ml *MessageList) Selected() *types.MessageInfo { store := ml.Store() + store.Lock() + defer store.Unlock() + return store.Messages[store.Uids[len(store.Uids)-ml.selected-1]] } func (ml *MessageList) Select(index int) { store := ml.Store() + store.Lock() + defer store.Unlock() + ml.selected = index for ; ml.selected < 0; ml.selected = len(store.Uids) + ml.selected { } @@ -166,6 +181,9 @@ func (ml *MessageList) Select(index int) { func (ml *MessageList) nextPrev(delta int) { store := ml.Store() + store.Lock() + defer store.Unlock() + if store == nil || len(store.Uids) == 0 { return } -- cgit v1.2.3