Changeset 103 in code for trunk/downstream.go


Ignore:
Timestamp:
Mar 16, 2020, 11:44:59 AM (5 years ago)
Author:
contact
Message:

Per-user dispatcher goroutine

This allows message handlers to read upstream/downstream connection
information without causing any race condition.

References: https://todo.sr.ht/~emersion/soju/1

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/downstream.go

    r102 r103  
    192192}
    193193
    194 func (dc *downstreamConn) readMessages() error {
     194func (dc *downstreamConn) readMessages(ch chan<- downstreamIncomingMessage) error {
    195195        dc.logger.Printf("new connection")
    196196
     
    207207                }
    208208
    209                 err = dc.handleMessage(msg)
    210                 if ircErr, ok := err.(ircError); ok {
    211                         ircErr.Message.Prefix = dc.srv.prefix()
    212                         dc.SendMessage(ircErr.Message)
    213                 } else if err != nil {
    214                         return fmt.Errorf("failed to handle IRC command %q: %v", msg.Command, err)
    215                 }
    216 
    217                 if dc.isClosed() {
    218                         return nil
    219                 }
     209                ch <- downstreamIncomingMessage{msg, dc}
    220210        }
    221211
     
    485475}
    486476
     477func (dc *downstreamConn) runUntilRegistered() error {
     478        for !dc.registered {
     479                msg, err := dc.irc.ReadMessage()
     480                if err == io.EOF {
     481                        break
     482                } else if err != nil {
     483                        return fmt.Errorf("failed to read IRC command: %v", err)
     484                }
     485
     486                err = dc.handleMessage(msg)
     487                if ircErr, ok := err.(ircError); ok {
     488                        ircErr.Message.Prefix = dc.srv.prefix()
     489                        dc.SendMessage(ircErr.Message)
     490                } else if err != nil {
     491                        return fmt.Errorf("failed to handle IRC command %q: %v", msg, err)
     492                }
     493        }
     494
     495        return nil
     496}
     497
    487498func (dc *downstreamConn) handleMessageRegistered(msg *irc.Message) error {
    488499        switch msg.Command {
Note: See TracChangeset for help on using the changeset viewer.