Changeset 449 in code for trunk/server.go
- Timestamp:
- Feb 9, 2021, 4:34:46 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/server.go
r409 r449 6 6 "net" 7 7 "net/http" 8 "strings" 8 9 "sync" 9 10 "sync/atomic" … … 55 56 Identd *Identd // can be nil 56 57 57 db *DB 58 59 lock sync.Mutex 60 users map[string]*user 58 db *DB 59 stopWG sync.WaitGroup 60 61 lock sync.Mutex 62 listeners map[net.Listener]struct{} 63 users map[string]*user 61 64 } 62 65 … … 65 68 Logger: log.New(log.Writer(), "", log.LstdFlags), 66 69 HistoryLimit: 1000, 70 db: db, 71 listeners: make(map[net.Listener]struct{}), 67 72 users: make(map[string]*user), 68 db: db,69 73 } 70 74 } … … 74 78 } 75 79 76 func (s *Server) Run() error {80 func (s *Server) Start() error { 77 81 users, err := s.db.ListUsers() 78 82 if err != nil { … … 86 90 s.lock.Unlock() 87 91 88 select {} 92 return nil 93 } 94 95 func (s *Server) Shutdown() { 96 s.lock.Lock() 97 for ln := range s.listeners { 98 if err := ln.Close(); err != nil { 99 s.Logger.Printf("failed to stop listener: %v", err) 100 } 101 } 102 for _, u := range s.users { 103 u.events <- eventStop{} 104 } 105 s.lock.Unlock() 106 107 s.stopWG.Wait() 89 108 } 90 109 … … 117 136 s.users[u.Username] = u 118 137 138 s.stopWG.Add(1) 139 119 140 go func() { 120 141 u.run() … … 123 144 delete(s.users, u.Username) 124 145 s.lock.Unlock() 146 147 s.stopWG.Done() 125 148 }() 126 149 … … 146 169 147 170 func (s *Server) Serve(ln net.Listener) error { 171 s.lock.Lock() 172 s.listeners[ln] = struct{}{} 173 s.lock.Unlock() 174 175 s.stopWG.Add(1) 176 177 defer func() { 178 s.lock.Lock() 179 delete(s.listeners, ln) 180 s.lock.Unlock() 181 182 s.stopWG.Done() 183 }() 184 148 185 for { 149 186 conn, err := ln.Accept() 150 if err != nil { 187 // TODO: use net.ErrClosed when available 188 if err != nil && strings.Contains(err.Error(), "use of closed network connection") { 189 return nil 190 } else if err != nil { 151 191 return fmt.Errorf("failed to accept connection: %v", err) 152 192 }
Note:
See TracChangeset
for help on using the changeset viewer.