lib9p

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

commit e960f1e8324812d97f534263312362555ad37f8c
parent 37bb98f0157e24a426422911ec275062899a3ad8
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Wed, 13 Dec 2023 13:05:33 +0900

add cpu profiling
need to cache the GID

Diffstat:
Mcmd/diskfs/main.go | 50+++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 45 insertions(+), 5 deletions(-)

diff --git a/cmd/diskfs/main.go b/cmd/diskfs/main.go @@ -10,6 +10,9 @@ import ( "log" "net" "os" + "os/signal" + "runtime/pprof" + "sync" "git.mtkn.jp/lib9p" "git.mtkn.jp/lib9p/diskfs" @@ -20,6 +23,15 @@ var aFlag = flag.String("a", "127.0.0.1", "Address the server listens to.") var pFlag = flag.Int("p", 5640, "Port number the server listens to.") func main() { + f, err := os.Create("cpu.prof") + if err != nil { + log.Fatal("open file: %v", err) + } + defer f.Close() + if err := pprof.StartCPUProfile(f); err != nil { + log.Fatal("profile: %v", err) + } + defer pprof.StopCPUProfile() flag.Parse() if flag.NArg() != 1 { fmt.Fprintf(os.Stderr, "usage: %s [-D] [-a <addr>] [-p <port>] <root>\n", os.Args[0]) @@ -29,24 +41,51 @@ func main() { if err != nil { log.Fatalf("listen tcp: %v", err) } + ctx := runSignalHandler() + go func() { + <-ctx.Done() + listener.Close() + }() + wg := new(sync.WaitGroup) +L: for { conn, err := listener.Accept() if err != nil { - log.Printf("accept connection: %v", err) - continue + select { + case <-ctx.Done(): + break L + default: + log.Printf("accept connection: %v", err) + continue L + } } disk, err := diskfs.Open(flag.Arg(0)) if err != nil { log.Fatalf("open file tree.") } - go handle(conn, disk) + wg.Add(1) + go handle(ctx, wg, conn, disk) } + wg.Wait() + log.Println("shutting down") } -func handle(conn net.Conn, disk *diskfs.FS) { +func handle(ctx context.Context, wg *sync.WaitGroup, conn net.Conn, disk *diskfs.FS) { srv := lib9p.NewServer(disk, 8*1024, conn, conn) if *dFlag { srv.Chatty() } - srv.Serve(context.Background()) + srv.Serve(ctx) + wg.Done() } + +func runSignalHandler() context.Context { + quit := make(chan os.Signal) + signal.Notify(quit, os.Interrupt) + ctx, cancel := context.WithCancel(context.Background()) + go func() { + <-quit + cancel() + }() + return ctx +} +\ No newline at end of file