diff options
author | Simon Ser <contact@emersion.fr> | 2019-04-28 13:26:38 +0000 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2019-04-29 09:49:48 -0400 |
commit | a275f65848f2c1fdd4302f56121defc408e7d8b6 (patch) | |
tree | 13dfcf8e26f904f2de3d2c494b90c4f6c2fd8be0 /widgets | |
parent | f1698a337eb2b511835cd6cc38bf76d8e776ffa1 (diff) |
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.
Diffstat (limited to 'widgets')
-rw-r--r-- | widgets/msglist.go | 18 |
1 files changed, 18 insertions, 0 deletions
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 } |