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:
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