aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/msgstore.go19
-rw-r--r--lib/ui/interfaces.go9
-rw-r--r--lib/ui/ui.go2
3 files changed, 7 insertions, 23 deletions
diff --git a/lib/msgstore.go b/lib/msgstore.go
index fbffa0a7..827d7cbf 100644
--- a/lib/msgstore.go
+++ b/lib/msgstore.go
@@ -2,7 +2,6 @@ package lib
import (
"io"
- "sync"
"time"
"github.com/emersion/go-imap"
@@ -12,8 +11,6 @@ import (
// Accesses to fields must be guarded by MessageStore.Lock/Unlock
type MessageStore struct {
- sync.Mutex
-
Deleted map[uint32]interface{}
DirInfo types.DirectoryInfo
Messages map[uint32]*types.MessageInfo
@@ -49,9 +46,6 @@ func NewMessageStore(worker *types.Worker,
func (store *MessageStore) FetchHeaders(uids []uint32,
cb func(*types.MessageInfo)) {
- store.Lock()
- defer store.Unlock()
-
// TODO: this could be optimized by pre-allocating toFetch and trimming it
// at the end. In practice we expect to get most messages back in one frame.
var toFetch imap.SeqSet
@@ -74,9 +68,6 @@ func (store *MessageStore) FetchHeaders(uids []uint32,
}
func (store *MessageStore) FetchFull(uids []uint32, cb func(io.Reader)) {
- store.Lock()
- defer store.Unlock()
-
// TODO: this could be optimized by pre-allocating toFetch and trimming it
// at the end. In practice we expect to get most messages back in one frame.
var toFetch imap.SeqSet
@@ -134,8 +125,6 @@ func merge(to *types.MessageInfo, from *types.MessageInfo) {
}
func (store *MessageStore) Update(msg types.WorkerMessage) {
- store.Lock()
-
update := false
switch msg := msg.(type) {
case *types.DirectoryInfo:
@@ -201,8 +190,6 @@ func (store *MessageStore) Update(msg types.WorkerMessage) {
update = true
}
- store.Unlock()
-
if update {
store.update()
}
@@ -220,7 +207,6 @@ func (store *MessageStore) update() {
func (store *MessageStore) Delete(uids []uint32,
cb func(msg types.WorkerMessage)) {
- store.Lock()
var set imap.SeqSet
for _, uid := range uids {
@@ -228,8 +214,6 @@ func (store *MessageStore) Delete(uids []uint32,
store.Deleted[uid] = nil
}
- store.Unlock()
-
store.worker.PostAction(&types.DeleteMessages{Uids: set}, cb)
store.update()
}
@@ -249,7 +233,6 @@ func (store *MessageStore) Copy(uids []uint32, dest string,
func (store *MessageStore) Move(uids []uint32, dest string,
cb func(msg types.WorkerMessage)) {
- store.Lock()
var set imap.SeqSet
for _, uid := range uids {
@@ -257,8 +240,6 @@ func (store *MessageStore) Move(uids []uint32, dest string,
store.Deleted[uid] = nil
}
- store.Unlock()
-
store.worker.PostAction(&types.CopyMessages{
Destination: dest,
Uids: set,
diff --git a/lib/ui/interfaces.go b/lib/ui/interfaces.go
index d27afe20..0cdffc1e 100644
--- a/lib/ui/interfaces.go
+++ b/lib/ui/interfaces.go
@@ -4,12 +4,15 @@ import (
"github.com/gdamore/tcell"
)
+// Drawable is a UI component that can draw. Unless specified, all methods must
+// only be called from a single goroutine, the UI goroutine.
type Drawable interface {
- // Called when this renderable should draw itself
+ // Called when this renderable should draw itself.
Draw(ctx *Context)
- // Specifies a function to call when this cell needs to be redrawn
+ // Specifies a function to call when this cell needs to be redrawn. The
+ // callback may be called in any goroutine.
OnInvalidate(callback func(d Drawable))
- // Invalidates the drawable
+ // Invalidates the drawable. This can be called from any goroutine.
Invalidate()
}
diff --git a/lib/ui/ui.go b/lib/ui/ui.go
index 9d9a5dae..91a26dae 100644
--- a/lib/ui/ui.go
+++ b/lib/ui/ui.go
@@ -10,7 +10,7 @@ import (
type UI struct {
Content DrawableInteractive
- exit atomic.Value
+ exit atomic.Value // bool
ctx *Context
screen tcell.Screen