X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=js.go;h=56566e444d1c9391b38e113aa796011435fcc6a8;hb=b4eefdd675c9aef9ff8bd1089d031ee05733195b;hp=1e452ee51a02725bcae747bdc501b72d3fffe52b;hpb=c41fe0fbd726f397636b569161f286821e221885;p=goredo.git diff --git a/js.go b/js.go index 1e452ee..56566e4 100644 --- a/js.go +++ b/js.go @@ -1,6 +1,6 @@ /* goredo -- djb's redo implementation on pure Go -Copyright (C) 2020-2021 Sergey Matveev +Copyright (C) 2020-2023 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -24,11 +24,9 @@ import ( "fmt" "log" "os" - "os/signal" "regexp" "strconv" "sync" - "syscall" ) const ( @@ -39,7 +37,7 @@ const ( EnvJSToken = "REDO_JS_TOKEN" EnvMake = "REDO_MAKE" - MakeTypeNone = "none" + MakeTypeNone = "none" MakeTypeBmake = "bmake" MakeTypeGmake = "gmake" ) @@ -69,17 +67,27 @@ var ( jsTokens map[byte]int jsTokensM sync.Mutex - flagJobs = flag.Int("j", -1, fmt.Sprintf("number of parallel jobs (0=inf, <0=1) (%s)", EnvJobs)) + flagJobs *int ) +func init() { + cmdName := CmdName() + if !(cmdName == CmdNameRedo || cmdName == CmdNameRedoIfchange) { + return + } + flagJobs = flag.Int("j", -1, + fmt.Sprintf("number of parallel jobs (0=inf, <0=1) (%s)", EnvJobs)) +} + func jsStart(jobsEnv string) { jobs := uint64(1) var err error - if *flagJobs == 0 { + switch { + case *flagJobs == 0: jobs = 0 - } else if *flagJobs > 0 { + case *flagJobs > 0: jobs = uint64(*flagJobs) - } else if jobsEnv != "" { + case jobsEnv != "": jobs, err = strconv.ParseUint(jobsEnv, 10, 64) if err != nil { log.Fatalln("can not parse", EnvJobs, err) @@ -93,7 +101,7 @@ func jsStart(jobsEnv string) { if err != nil { log.Fatalln(err) } - trace(CJS, "initial fill with %d", jobs) + tracef(CJS, "initial fill with %d", jobs) jsTokens[BMakeGoodToken] = int(jobs) for ; jobs > 0; jobs-- { jsReleaseNoLock(BMakeGoodToken) @@ -161,20 +169,6 @@ func jsInit() { 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) - }() } func jsReleaseNoLock(token byte) { @@ -187,18 +181,28 @@ func jsRelease(ctx string, token byte) { if JSW == nil { return } - trace(CJS, "release from %s", ctx) + tracef(CJS, "release from %s", ctx) jsTokensM.Lock() jsTokens[token]-- jsReleaseNoLock(token) jsTokensM.Unlock() } +func jsReleaseAll() { + jsTokensM.Lock() + for token, i := range jsTokens { + for ; i > 0; i-- { + jsReleaseNoLock(token) + } + } + jsTokensM.Unlock() +} + func jsAcquire(ctx string) byte { if JSR == nil { return BMakeGoodToken } - trace(CJS, "acquire for %s", ctx) + tracef(CJS, "acquire for %s", ctx) token := []byte{0} if n, err := JSR.Read(token); err != nil || n != 1 { log.Fatalln("can not read JSR:", err) @@ -206,6 +210,6 @@ func jsAcquire(ctx string) byte { jsTokensM.Lock() jsTokens[token[0]]++ jsTokensM.Unlock() - trace(CJS, "acquired for %s", ctx) + tracef(CJS, "acquired for %s", ctx) return token[0] }