diff options
author | René 'Necoro' Neumann <necoro@necoro.eu> | 2021-02-28 13:22:17 +0100 |
---|---|---|
committer | René 'Necoro' Neumann <necoro@necoro.eu> | 2021-02-28 13:22:17 +0100 |
commit | 4f112c16dfac61deb128b48e9d516f78ab55fc95 (patch) | |
tree | c9cb69966987ec59fc2eaf20b4fa377056e1f8f8 /internal/imap/client.go | |
parent | c407994dd3aeb2c5a8e5f3fa070e7436fe308fc9 (diff) | |
download | feed2imap-go-4f112c16dfac61deb128b48e9d516f78ab55fc95.tar.gz feed2imap-go-4f112c16dfac61deb128b48e9d516f78ab55fc95.tar.bz2 feed2imap-go-4f112c16dfac61deb128b48e9d516f78ab55fc95.zip |
Start IMAP connections in the background and use them on the go
Diffstat (limited to '')
-rw-r--r-- | internal/imap/client.go | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/internal/imap/client.go b/internal/imap/client.go index 783acf6..c916a64 100644 --- a/internal/imap/client.go +++ b/internal/imap/client.go @@ -1,6 +1,8 @@ package imap import ( + "sync/atomic" + uidplus "github.com/emersion/go-imap-uidplus" imapClient "github.com/emersion/go-imap/client" @@ -17,15 +19,17 @@ type connConf struct { type Client struct { connConf - mailboxes *mailboxes - commander *commander - connections [numberConns]*connection - nextFreeIndex int + mailboxes *mailboxes + commander *commander + connections [numberConns]*connection + idxCounter int32 + connChannel chan *connection } func (cl *Client) Disconnect() { if cl != nil { cl.stopCommander() + close(cl.connChannel) connected := false for _, conn := range cl.connections { @@ -39,7 +43,9 @@ func (cl *Client) Disconnect() { } func (cl *Client) createConnection(c *imapClient.Client) *connection { - if cl.nextFreeIndex >= len(cl.connections) { + nextIndex := int(atomic.AddInt32(&cl.idxCounter, 1)) - 1 + + if nextIndex >= len(cl.connections) { panic("Too many connections") } @@ -51,12 +57,14 @@ func (cl *Client) createConnection(c *imapClient.Client) *connection { c: client, } - cl.connections[cl.nextFreeIndex] = conn - cl.nextFreeIndex++ + cl.connections[nextIndex] = conn return conn } func NewClient() *Client { - return &Client{mailboxes: NewMailboxes()} + return &Client{ + mailboxes: NewMailboxes(), + connChannel: make(chan *connection, 0), + } } |