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  }