lib9p

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

commit a9b45b66283b83ecb64577a8fc1be549375c12e8
parent c3c5e2ace48d2d47c310c7824e730369d2bd344a
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Fri, 29 Dec 2023 08:32:10 +0900

delete respond

Diffstat:
Mserver.go | 52++++++++++++----------------------------------------
Mserver2_test.go | 4++--
2 files changed, 14 insertions(+), 42 deletions(-)

diff --git a/server.go b/server.go @@ -128,22 +128,26 @@ func (s *Server) runListener(ctx context.Context, rp *ReqPool) { // and marshalls each of them into 9P messages and writes it to s.w. func (s *Server) runSpeaker(ctx context.Context, rp *ReqPool) { rc := make(chan *Req) - s.speakChan = rc + s.respChan = rc go func() { for { select { - case r := <-rc: + case r, ok := <-rc: + if !ok { + return + } + r.Ofcall.SetTag(r.Tag) // free tag. rp.delete(r.Tag) _, err := s.w.Write(r.Ofcall.marshal()) if err != nil { - select { - case r.speakErrChan <- err: - case <-ctx.Done(): - return - } + // TODO: handle error. + log.Printf("speak: %v", err) + continue + } + if s.chatty9P { + fmt.Fprintf(os.Stderr, "--> %s\n", r.Ofcall) } - close(r.speakErrChan) case <-ctx.Done(): return } @@ -1190,7 +1194,6 @@ func (s *Server) Serve(ctx context.Context) { go sRemove(ctx, s, removeChan) go sStat(ctx, s, statChan) go sWStat(ctx, s, wstatChan) - go respond(ctx, s) L: for { select { @@ -1245,34 +1248,3 @@ L: } } } - -func respond(ctx context.Context, s *Server) { - for { - select { - case <-ctx.Done(): - return - case r, ok := <-s.respChan: - if !ok { - return - } - r.Ofcall.SetTag(r.Tag) - select { - case s.speakChan <- r: - if s.chatty9P { - fmt.Fprintf(os.Stderr, "--> %s\n", r.Ofcall) - } - case <-ctx.Done(): - return - } - select { - case err := <-r.speakErrChan: - // TODO: handle errors. - if err != nil { - log.Printf("speak: %v", err) - } - case <-ctx.Done(): - return - } - } - } -} diff --git a/server2_test.go b/server2_test.go @@ -79,9 +79,9 @@ func TestRunSpeaker(t *testing.T) { if err != nil { t.Fatalf("unmarshal %v", err) } - s.speakChan <- &Req{ + s.respChan <- &Req{ + Tag: msg.GetTag(), Ofcall: msg, - speakErrChan: make(chan error), } got := make([]byte, len(want)) _, err = io.ReadFull(r, got)