2024-11-23 12:30:23 +09:00
|
|
|
package hodu
|
|
|
|
|
2024-12-08 00:57:58 +09:00
|
|
|
import "net/http"
|
|
|
|
import "os"
|
|
|
|
import "runtime"
|
2024-11-23 12:30:23 +09:00
|
|
|
import "sync"
|
|
|
|
|
2024-12-07 21:24:06 +09:00
|
|
|
const HODU_RPC_VERSION uint32 = 0x010000
|
2024-11-23 12:30:23 +09:00
|
|
|
|
|
|
|
type LogLevel int
|
2024-12-09 01:51:04 +09:00
|
|
|
type LogMask int
|
2024-11-23 12:30:23 +09:00
|
|
|
|
|
|
|
const (
|
2024-12-09 01:51:04 +09:00
|
|
|
LOG_DEBUG LogLevel = 1 << iota
|
2024-11-23 12:30:23 +09:00
|
|
|
LOG_INFO
|
2024-12-09 01:51:04 +09:00
|
|
|
LOG_WARN
|
|
|
|
LOG_ERROR
|
2024-11-23 12:30:23 +09:00
|
|
|
)
|
|
|
|
|
2024-12-09 01:59:05 +09:00
|
|
|
const LOG_ALL LogMask = LogMask(LOG_DEBUG | LOG_INFO | LOG_WARN | LOG_ERROR)
|
|
|
|
const LOG_NONE LogMask = LogMask(0)
|
|
|
|
|
2024-11-23 12:30:23 +09:00
|
|
|
type Logger interface {
|
2024-12-08 23:16:43 +09:00
|
|
|
Write(id string, level LogLevel, fmtstr string, args ...interface{})
|
2024-11-23 12:30:23 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
type Service interface {
|
2024-12-08 23:16:43 +09:00
|
|
|
RunTask(wg *sync.WaitGroup) // blocking. run the actual task loop. it must call wg.Done() upon exit from itself.
|
2024-11-23 12:30:23 +09:00
|
|
|
StartService(data interface{}) // non-blocking. spin up a service. it may be invokded multiple times for multiple instances
|
|
|
|
StopServices() // non-blocking. send stop request to all services spun up
|
|
|
|
WaitForTermination() // blocking. must wait until all services are stopped
|
2024-11-23 20:13:07 +09:00
|
|
|
WriteLog(id string, level LogLevel, fmtstr string, args ...interface{})
|
2024-11-23 12:30:23 +09:00
|
|
|
}
|
2024-12-07 22:18:07 +09:00
|
|
|
|
2024-12-07 23:03:23 +09:00
|
|
|
func tcp_addr_str_class(addr string) string {
|
|
|
|
if len(addr) > 0 {
|
|
|
|
switch addr[0] {
|
|
|
|
case '[':
|
|
|
|
return "tcp6"
|
|
|
|
case ':':
|
|
|
|
return "tcp"
|
|
|
|
default:
|
|
|
|
return "tcp4"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return "tcp"
|
|
|
|
}
|
2024-12-08 00:57:58 +09:00
|
|
|
|
|
|
|
func dump_call_frame_and_exit(log Logger, req *http.Request, err interface{}) {
|
|
|
|
var buf []byte
|
|
|
|
buf = make([]byte, 65536); buf = buf[:min(65536, runtime.Stack(buf, false))]
|
|
|
|
log.Write("", LOG_ERROR, "[%s] %s %s - %v\n%s", req.RemoteAddr, req.Method, req.URL.String(), err, string(buf))
|
|
|
|
os.Exit(99) // fatal error. treat panic() as a fatal runtime error
|
|
|
|
}
|