lib9p

Go 9P library.
Log | Files | Refs | LICENSE

commit 05a26fbcb320ed68aa4e56c373b5534260aef9cf
parent 7bd2d64bb275555671213e0870dcf54d0ca1280b
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Thu, 28 Dec 2023 09:34:27 +0900

add select

Diffstat:
Mserver.go | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 99 insertions(+), 21 deletions(-)

diff --git a/server.go b/server.go @@ -225,7 +225,11 @@ func sVersion(ctx context.Context, s *Server, c <-chan *Req) { Version: version, } s.setMSize(r.Ofcall.(*RVersion).Msize) - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -248,20 +252,32 @@ func sAuth(ctx context.Context, s *Server, c <-chan *Req) { } if authc == nil { setError(r, fmt.Errorf("authentication not required")) - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } continue } ifcall := r.Ifcall.(*TAuth) var err error if ifcall.Afid == NOFID { setError(r, fmt.Errorf("NOFID can't be used for afid")) // TODO: really? - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } continue } r.Afid, err = s.fPool.add(ifcall.Afid) if err != nil { setError(r, ErrDupFid) - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } continue } authc <- r // TODO: I think Req.listenErr should be exported. @@ -330,7 +346,11 @@ func sAttach(ctx context.Context, s *Server, c <-chan *Req) { } setError(r, r.err) } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -348,7 +368,11 @@ func sFlush(ctx context.Context, s *Server, c <-chan *Req) { r.Oldreq.flush() } r.Ofcall = &RFlush{} - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -437,7 +461,11 @@ func sWalk(ctx context.Context, s *Server, c <-chan *Req) { } } } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -534,22 +562,38 @@ func sOpen(ctx context.Context, s *Server, c <-chan *Req) { resp: if r.err != nil { setError(r, r.err) - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } continue } r.Fid.OMode = r.Ifcall.(*TOpen).Mode if _, ok := r.Fid.File.(*AuthFile); ok { - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } continue } f, err := r.Srv.fs.OpenFile(r.Fid.path, r.Fid.OMode) if err != nil { setError(r, err) - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } continue } r.Fid.File = f - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -626,7 +670,11 @@ func sCreate(ctx context.Context, s *Server, c <-chan *Req) { if r.err != nil { setError(r, r.err) } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -726,6 +774,8 @@ func sRead(ctx context.Context, s *Server, c <-chan *Req) { } case <-r.done: continue + case <-ctx.Done(): + return } r.Ofcall = &RRead{ Count: uint32(n), @@ -735,7 +785,11 @@ func sRead(ctx context.Context, s *Server, c <-chan *Req) { if r.err != nil { setError(r, r.err) } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -801,13 +855,19 @@ func sWrite(ctx context.Context, s *Server, c <-chan *Req) { } case <-r.done: continue + case <-ctx.Done(): + return } r.Ofcall = ofcall resp: if r.err != nil { setError(r, r.err) } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -840,7 +900,11 @@ func sClunk(ctx context.Context, s *Server, c <-chan *Req) { log.Printf("clunk: %v", r.err) r.Ofcall = &RClunk{} } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -894,7 +958,11 @@ func sRemove(ctx context.Context, s *Server, c <-chan *Req) { if r.err != nil { setError(r, r.err) } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -930,7 +998,11 @@ func sStat(ctx context.Context, s *Server, c <-chan *Req) { if r.err != nil { setError(r, r.err) } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } @@ -1072,15 +1144,17 @@ func sWStat(ctx context.Context, s *Server, c <-chan *Req) { if r.err != nil { setError(r, r.err) } - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } } } } // Serve serves 9P conversation. func (s *Server) Serve(ctx context.Context) { - ctx, cancel := context.WithCancel(ctx) - defer cancel() s.runListener(ctx) s.runSpeaker(ctx) var ( @@ -1146,7 +1220,11 @@ L: switch r.Ifcall.(type) { default: setError(r, fmt.Errorf("unknown message type: %d", r.Ifcall.Type())) - s.respChan <- r + select { + case s.respChan <- r: + case <-ctx.Done(): + return + } case *TVersion: versionChan <- r case *TAuth: