From df8d1b10f9db950d3f86b3286fcb52b8ab015e8f Mon Sep 17 00:00:00 2001 From: diamondburned Date: Sat, 14 Nov 2020 19:36:44 -0800 Subject: [PATCH] fixed segfault completion bug --- go.mod | 2 +- go.sum | 2 ++ internal/channel/channel.go | 11 +++++++---- internal/channel/messenger.go | 26 ++++++++++++++++---------- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index c1937e0..d75ebd1 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.14 require ( github.com/Pallinder/go-randomdata v1.2.0 - github.com/diamondburned/aqs v0.0.0-20200704043812-99b676ee44eb + github.com/diamondburned/aqs v0.0.0-20201115033607-76f603ff676a github.com/diamondburned/cchat v0.3.11 github.com/lucasb-eyer/go-colorful v1.0.3 github.com/pkg/errors v0.9.1 diff --git a/go.sum b/go.sum index feee3d6..cd3c256 100644 --- a/go.sum +++ b/go.sum @@ -3,6 +3,8 @@ github.com/Pallinder/go-randomdata v1.2.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqC github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA= github.com/diamondburned/aqs v0.0.0-20200704043812-99b676ee44eb h1:Ja/niwykeFoSkYxdRRzM8QUAuCswfLmaiBTd2UIU+54= github.com/diamondburned/aqs v0.0.0-20200704043812-99b676ee44eb/go.mod h1:q1MbMBfZrv7xqV8n7LgMwhHs3oBbNwWJes8exs2AmDs= +github.com/diamondburned/aqs v0.0.0-20201115033607-76f603ff676a h1:XqKaACqS5vdKzbt0jaTcKfRgpjyjZ7xAXniAALUjElw= +github.com/diamondburned/aqs v0.0.0-20201115033607-76f603ff676a/go.mod h1:q1MbMBfZrv7xqV8n7LgMwhHs3oBbNwWJes8exs2AmDs= github.com/diamondburned/cchat v0.2.11 h1:w4c/6t02htGtVj6yIjznecOGMlkcj0TmmLy+K48gHeM= github.com/diamondburned/cchat v0.2.11/go.mod h1:IlMtF+XIvAJh0GL/2yFdf0/34w+Hdy5A1GgvSwAXtQI= github.com/diamondburned/cchat v0.2.12 h1:R4wrBdhELMfhv2Kn3xL/H3ci8UcLXzFRPq1IrY4+js4= diff --git a/internal/channel/channel.go b/internal/channel/channel.go index 27a63a9..6b80670 100644 --- a/internal/channel/channel.go +++ b/internal/channel/channel.go @@ -17,7 +17,7 @@ type Channel struct { name string user Username - messenger Messenger + messenger *Messenger } var _ cchat.Server = (*Channel)(nil) @@ -40,7 +40,7 @@ func AsCChatServers(channels []*Channel) []cchat.Server { // NewChannel creates a new random channel. func NewChannel(state *shared.State) *Channel { - return &Channel{ + ch := &Channel{ id: state.NextID(), name: "#" + randomdata.Noun(), user: Username{ @@ -51,6 +51,10 @@ func NewChannel(state *shared.State) *Channel { }, }, } + + ch.messenger = NewMessenger(ch) + + return ch } func (ch *Channel) ID() string { @@ -66,6 +70,5 @@ func (ch *Channel) AsNicknamer() cchat.Nicknamer { } func (ch *Channel) AsMessenger() cchat.Messenger { - ch.messenger.channel = ch - return &ch.messenger + return ch.messenger } diff --git a/internal/channel/messenger.go b/internal/channel/messenger.go index b37fe66..1ce6eb2 100644 --- a/internal/channel/messenger.go +++ b/internal/channel/messenger.go @@ -44,6 +44,22 @@ type Messenger struct { var _ cchat.Messenger = (*Messenger)(nil) +func NewMessenger(ch *Channel) *Messenger { + msgr := Messenger{} + msgr.channel = ch + // Initialize. + msgr.messages = make(map[uint32]message.Message, FetchBacklog) + msgr.messageids = make([]uint32, 0, FetchBacklog) + + // Allocate 3 channels that we won't clean up, because we're lazy. + msgr.send = NewMessageSender(&msgr) + msgr.edit = make(chan message.Message) + msgr.del = make(chan message.Header) + msgr.typ = typing.NewSubscriber(message.NewAuthor(msgr.channel.user.Rich())) + + return &msgr +} + func (msgr *Messenger) JoinServer(ctx context.Context, ct cchat.MessagesContainer) (func(), error) { // Is this a fresh channel? If yes, generate messages with some IO latency. if len(msgr.messageids) == 0 || msgr.messages == nil { @@ -52,16 +68,6 @@ func (msgr *Messenger) JoinServer(ctx context.Context, ct cchat.MessagesContaine return nil, err } - // Initialize. - msgr.messages = make(map[uint32]message.Message, FetchBacklog) - msgr.messageids = make([]uint32, 0, FetchBacklog) - - // Allocate 3 channels that we won't clean up, because we're lazy. - msgr.send = NewMessageSender(msgr) - msgr.edit = make(chan message.Message) - msgr.del = make(chan message.Header) - msgr.typ = typing.NewSubscriber(message.NewAuthor(msgr.channel.user.Rich())) - // Generate the backlog. for i := 0; i < FetchBacklog; i++ { msgr.addMessage(msgr.randomMsg(), ct)