Changeset 37 in code for trunk/server.go


Ignore:
Timestamp:
Feb 7, 2020, 10:36:42 AM (5 years ago)
Author:
contact
Message:

Per-user connections

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/server.go

    r29 r37  
    33import (
    44        "fmt"
     5        "log"
    56        "net"
    67        "sync"
     
    3132}
    3233
     34type user struct {
     35        username string
     36        srv      *Server
     37
     38        lock          sync.Mutex
     39        upstreamConns []*upstreamConn
     40}
     41
    3342type Upstream struct {
    3443        Addr     string
     
    4554
    4655        lock            sync.Mutex
     56        users           map[string]*user
    4757        downstreamConns []*downstreamConn
    48         upstreamConns   []*upstreamConn
     58}
     59
     60func NewServer() *Server {
     61        return &Server{
     62                Logger: log.New(log.Writer(), "", log.LstdFlags),
     63                users:  make(map[string]*user),
     64        }
    4965}
    5066
     
    5470
    5571func (s *Server) Run() {
     72        // TODO: multi-user
     73        u := &user{username: "jounce", srv: s}
     74
     75        s.lock.Lock()
     76        s.users[u.username] = u
     77        s.lock.Unlock()
     78
    5679        for i := range s.Upstreams {
    5780                upstream := &s.Upstreams[i]
    5881                // TODO: retry connecting
    5982                go func() {
    60                         conn, err := connectToUpstream(s, upstream)
     83                        conn, err := connectToUpstream(u, upstream)
    6184                        if err != nil {
    6285                                s.Logger.Printf("failed to connect to upstream server %q: %v", upstream.Addr, err)
     
    6487                        }
    6588
    66                         s.lock.Lock()
    67                         s.upstreamConns = append(s.upstreamConns, conn)
    68                         s.lock.Unlock()
     89                        u.lock.Lock()
     90                        u.upstreamConns = append(u.upstreamConns, conn)
     91                        u.lock.Unlock()
    6992
    7093                        if err := conn.readMessages(); err != nil {
     
    7295                        }
    7396
    74                         s.lock.Lock()
    75                         for i, c := range s.upstreamConns {
     97                        u.lock.Lock()
     98                        for i, c := range u.upstreamConns {
    7699                                if c == conn {
    77                                         s.upstreamConns = append(s.upstreamConns[:i], s.upstreamConns[i+1:]...)
     100                                        u.upstreamConns = append(u.upstreamConns[:i], u.upstreamConns[i+1:]...)
    78101                                        break
    79102                                }
    80103                        }
    81                         s.lock.Unlock()
     104                        u.lock.Unlock()
    82105                }()
    83106        }
Note: See TracChangeset for help on using the changeset viewer.