diff --git a/dnspod_handler.go b/dnspod_handler.go index 96aafe9..ab3f24d 100644 --- a/dnspod_handler.go +++ b/dnspod_handler.go @@ -7,7 +7,6 @@ import ( "log" "net/http" "net/url" - "os" "runtime/debug" "strconv" "strings" @@ -19,19 +18,13 @@ import ( type DNSPodHandler struct{} -func (handler *DNSPodHandler) DomainLoop(domain *Domain) { +func (handler *DNSPodHandler) DomainLoop(domain *Domain, panicChan chan<- Domain) { defer func() { if err := recover(); err != nil { - panicCount++ log.Printf("Recovered in %v: %v\n", err, debug.Stack()) fmt.Println(identifyPanic()) log.Print(identifyPanic()) - if panicCount < PANIC_MAX { - log.Println("Got panic in goroutine, will start a new one... :", panicCount) - go handler.DomainLoop(domain) - } else { - os.Exit(1) - } + panicChan <- *domain } }() diff --git a/godns.go b/godns.go index e0f637d..0391247 100644 --- a/godns.go +++ b/godns.go @@ -22,7 +22,6 @@ var ( configuration Settings optConf = flag.String("c", "./config.json", "Specify a config file") optHelp = flag.Bool("h", false, "Show help") - panicCount = 0 ) func main() { @@ -53,10 +52,24 @@ func main() { } func dnsLoop() { + panicChan := make(chan Domain) + handler := createHandler(configuration.Provider) for _, domain := range configuration.Domains { - go handler.DomainLoop(&domain) + go handler.DomainLoop(&domain, panicChan) } - select {} + panicCount := 0 + for { + select { + case failDomain := <-panicChan: + log.Println("Got panic in goroutine, will start a new one... :", panicCount) + go handler.DomainLoop(&failDomain, panicChan) + } + + panicCount++ + if panicCount >= PANIC_MAX { + os.Exit(1) + } + } } diff --git a/handler.go b/handler.go index fedd3c1..655201d 100644 --- a/handler.go +++ b/handler.go @@ -1,7 +1,7 @@ package main type IHandler interface { - DomainLoop(domain *Domain) + DomainLoop(domain *Domain, panicChan chan<- Domain) } func createHandler(provider string) IHandler { diff --git a/he_handler.go b/he_handler.go index 677567e..83dfc9b 100644 --- a/he_handler.go +++ b/he_handler.go @@ -6,7 +6,6 @@ import ( "log" "net/http" "net/url" - "os" "runtime/debug" "strings" "time" @@ -20,19 +19,13 @@ var ( type HEHandler struct{} -func (handler *HEHandler) DomainLoop(domain *Domain) { +func (handler *HEHandler) DomainLoop(domain *Domain, panicChan chan<- Domain) { defer func() { if err := recover(); err != nil { - panicCount++ log.Printf("Recovered in %v: %v\n", err, debug.Stack()) fmt.Println(identifyPanic()) log.Print(identifyPanic()) - if panicCount < PANIC_MAX { - log.Println("Got panic in goroutine, will start a new one... :", panicCount) - go handler.DomainLoop(domain) - } else { - os.Exit(1) - } + panicChan <- *domain } }()