Fix the synchronisation issues…

configurable-file-paths
Robert Gerus 2015-11-08 22:00:33 +01:00
parent fa40fe1ef4
commit 7a8c07445e
3 changed files with 30 additions and 27 deletions

View File

@ -2,7 +2,6 @@ package bot
import ( import (
"log" "log"
"time"
"github.com/arachnist/gorepost/irc" "github.com/arachnist/gorepost/irc"
) )
@ -17,14 +16,16 @@ func RemoveCallback(command string) {
delete(Callbacks, command) delete(Callbacks, command)
} }
func Dispatcher(output *chan irc.Message, input *chan irc.Message) { func Dispatcher(quit chan struct{}, output chan irc.Message, input chan irc.Message) {
// FIXME
time.Sleep(time.Second * 2)
log.Println("spawned Dispatcher") log.Println("spawned Dispatcher")
for { for {
msg := <-*input select {
if Callbacks[msg.Command] != nil { case msg := <-input:
go Callbacks[msg.Command](*output, msg) if Callbacks[msg.Command] != nil {
go Callbacks[msg.Command](output, msg)
}
case <-quit:
log.Println("closing Dispatcher")
} }
} }
} }

View File

@ -11,8 +11,9 @@ import (
) )
func main() { func main() {
config, err := config.ReadConfig(os.Args[1])
var exit chan struct{} var exit chan struct{}
config, err := config.ReadConfig(os.Args[1])
if err != nil { if err != nil {
fmt.Println("Error reading configuration from", os.Args[1], "error:", err.Error()) fmt.Println("Error reading configuration from", os.Args[1], "error:", err.Error())
os.Exit(1) os.Exit(1)
@ -28,10 +29,7 @@ func main() {
connections := make([]irc.Connection, len(config.Networks)) connections := make([]irc.Connection, len(config.Networks))
for i, _ := range connections { for i, _ := range connections {
network := config.Networks[i] network := config.Networks[i]
connections[i].L.Lock() connections[i].Setup(bot.Dispatcher, network, config.Servers[network], config.Nick, config.User, config.RealName)
connections[i].Setup(network, config.Servers[network], config.Nick, config.User, config.RealName)
connections[i].L.Unlock()
go bot.Dispatcher(&connections[i].Input, &connections[i].Output)
} }
<-exit <-exit
} }

View File

@ -13,20 +13,22 @@ const delim byte = '\n'
const endline string = "\r\n" const endline string = "\r\n"
type Connection struct { type Connection struct {
Network string Network string
Nick string Nick string
User string User string
RealName string RealName string
Input chan Message Input chan Message
Output chan Message Output chan Message
reader *bufio.Reader reader *bufio.Reader
writer *bufio.Writer writer *bufio.Writer
conn net.Conn dispatcher func(chan struct{}, chan Message, chan Message)
reconnect chan struct{} conn net.Conn
Quit chan struct{} reconnect chan struct{}
quitsend chan struct{} Quit chan struct{}
quitrecv chan struct{} quitsend chan struct{}
l sync.Mutex quitrecv chan struct{}
quitdispatcher chan struct{}
l sync.Mutex
} }
func (c *Connection) Sender() { func (c *Connection) Sender() {
@ -112,6 +114,7 @@ func (c *Connection) Keeper(servers []string) {
go c.Sender() go c.Sender()
go c.Receiver() go c.Receiver()
go c.dispatcher(c.quitdispatcher, c.Input, c.Output)
log.Println(c.Network, "Initializing IRC connection") log.Println(c.Network, "Initializing IRC connection")
c.Input <- Message{ c.Input <- Message{
@ -127,7 +130,7 @@ func (c *Connection) Keeper(servers []string) {
} }
} }
func (c *Connection) Setup(network string, servers []string, nick string, user string, realname string) { func (c *Connection) Setup(dispatcher func(chan struct{}, chan Message, chan Message), network string, servers []string, nick string, user string, realname string) {
rand.Seed(time.Now().UnixNano()) rand.Seed(time.Now().UnixNano())
c.reconnect = make(chan struct{}, 1) c.reconnect = make(chan struct{}, 1)
@ -136,6 +139,7 @@ func (c *Connection) Setup(network string, servers []string, nick string, user s
c.User = user c.User = user
c.RealName = realname c.RealName = realname
c.Network = network c.Network = network
c.dispatcher = dispatcher
c.reconnect <- struct{}{} c.reconnect <- struct{}{}
go c.Keeper(servers) go c.Keeper(servers)