+
+ match := makeArgRe.FindStringSubmatch(MakeFlags)
+ if len(match) == 0 {
+ // MAKEFLAGS does not contain anything related to jobserver
+ jsStart(jobsEnv)
+ return
+ }
+ MakeFlags = match[1] + " " + match[4]
+
+ func() {
+ defer func() {
+ if err := recover(); err != nil {
+ log.Fatalln(err)
+ }
+ }()
+ JSR = mustParseFd(match[2], "JSR")
+ JSW = mustParseFd(match[3], "JSW")
+ }()
+
+ if token := os.Getenv(EnvJSToken); token != "" {
+ jsTokenInt, err := strconv.ParseUint(token, 10, 8)
+ if err != nil {
+ log.Fatalln("invalid", EnvJSToken, "format:", err)
+ }
+ jsToken = byte(jsTokenInt)
+ jsTokens[jsToken]++
+ jsRelease("ifchange entered", jsToken)
+ }
+
+ killed := make(chan os.Signal, 0)
+ signal.Notify(killed, syscall.SIGTERM, syscall.SIGINT)
+ go func() {
+ <-killed
+ jsTokensM.Lock()
+ for token, i := range jsTokens {
+ for ; i > 0; i-- {
+ jsReleaseNoLock(token)
+ }
+ }
+ jsTokensM.Unlock()
+ os.Exit(1)
+ }()