github.com/jmigpin/editor@v1.6.0/core/godebug/debug/debug.go (about) 1 package debug 2 3 import ( 4 "fmt" 5 "os" 6 "runtime/debug" 7 "sync" 8 ) 9 10 var dsrv struct { // debug server 11 sync.Mutex 12 srv *Server 13 exited bool // prevent from being hot started again 14 } 15 16 //---------- 17 18 // Called by the generated config. 19 func StartServer() { 20 hotStartServer() 21 } 22 func hotStartServer() { 23 if dsrv.srv == nil { 24 dsrv.Lock() 25 if dsrv.srv == nil && !dsrv.exited { 26 startServer2() 27 } 28 dsrv.Unlock() 29 } 30 } 31 func startServer2() { 32 srv, err := NewServer() 33 if err != nil { 34 fmt.Printf("error: godebug/debug: start server failed: %v\n", err) 35 os.Exit(1) 36 } 37 dsrv.srv = srv 38 } 39 40 //---------- 41 42 // Auto-inserted at main for a clean exit. Not to be used. 43 func ExitServer() { 44 dsrv.Lock() 45 if !dsrv.exited && dsrv.srv != nil { 46 dsrv.srv.Close() 47 } 48 dsrv.exited = true 49 dsrv.Unlock() 50 51 if !hasSrcLines { 52 if r := recover(); r != nil { 53 // use std msg format 54 println(fmt.Sprintf("panic: %v\n", r)) 55 56 println("GODEBUG WARNING: code not compiled with src lines references. Trace locations refer to annotated files. Consider using -srclines flag.\n") 57 58 println(string(debug.Stack())) 59 60 os.Exit(2) // default panic seems to exit with code 2 as well 61 } 62 } 63 } 64 65 // Auto-inserted in annotated files to replace os.Exit calls. Not to be used. 66 func Exit(code int) { 67 ExitServer() 68 os.Exit(code) 69 } 70 71 //---------- 72 73 // Auto-inserted at annotations. Not to be used. 74 func Line(fileIndex, debugIndex, offset int, item Item) { 75 hotStartServer() 76 lmsg := &LineMsg{FileIndex: fileIndex, DebugIndex: debugIndex, Offset: offset, Item: item} 77 dsrv.srv.Send(lmsg) 78 }