Changeset 168 in code for trunk/user.go


Ignore:
Timestamp:
Mar 27, 2020, 6:17:58 PM (5 years ago)
Author:
contact
Message:

Nuke user.lock

Split user.register into two functions, one to make sure the user is
authenticated, the other to send our current state. This allows to get
rid of data races by doing the second part in the user goroutine.

Closes: https://todo.sr.ht/~emersion/soju/22

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/user.go

    r167 r168  
    9292        events chan event
    9393
    94         lock            sync.Mutex
    9594        networks        []*network
    9695        downstreamConns []*downstreamConn
     
    106105
    107106func (u *user) forEachNetwork(f func(*network)) {
    108         u.lock.Lock()
    109107        for _, network := range u.networks {
    110108                f(network)
    111109        }
    112         u.lock.Unlock()
    113110}
    114111
    115112func (u *user) forEachUpstream(f func(uc *upstreamConn)) {
    116         u.lock.Lock()
    117113        for _, network := range u.networks {
    118114                uc := network.upstream()
     
    122118                f(uc)
    123119        }
    124         u.lock.Unlock()
    125120}
    126121
    127122func (u *user) forEachDownstream(f func(dc *downstreamConn)) {
    128         u.lock.Lock()
    129123        for _, dc := range u.downstreamConns {
    130124                f(dc)
    131125        }
    132         u.lock.Unlock()
    133126}
    134127
     
    149142        }
    150143
    151         u.lock.Lock()
    152144        for _, record := range networks {
    153145                network := newNetwork(u, &record)
     
    156148                go network.run()
    157149        }
    158         u.lock.Unlock()
    159150
    160151        for e := range u.events {
     
    171162                case eventDownstreamConnected:
    172163                        dc := e.dc
    173                         u.lock.Lock()
     164
     165                        if err := dc.welcome(); err != nil {
     166                                dc.logger.Printf("failed to handle new registered connection: %v", err)
     167                                break
     168                        }
     169
    174170                        u.downstreamConns = append(u.downstreamConns, dc)
    175                         u.lock.Unlock()
    176171                case eventDownstreamDisconnected:
    177172                        dc := e.dc
    178                         u.lock.Lock()
    179173                        for i := range u.downstreamConns {
    180174                                if u.downstreamConns[i] == dc {
     
    183177                                }
    184178                        }
    185                         u.lock.Unlock()
    186179                case eventDownstreamMessage:
    187180                        msg, dc := e.msg, e.dc
     
    221214        })
    222215
    223         u.lock.Lock()
    224216        u.networks = append(u.networks, network)
    225         u.lock.Unlock()
    226217
    227218        go network.run()
Note: See TracChangeset for help on using the changeset viewer.