Skip to content

Commit dc7c302

Browse files
committed
gen: use all cpus
1 parent 437bc8e commit dc7c302

File tree

1 file changed

+57
-36
lines changed

1 file changed

+57
-36
lines changed

test/gen/gen.go

+57-36
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package main
33
import (
44
"fmt"
55
"reflect"
6+
"runtime"
67
"runtime/debug"
78
"strings"
9+
"sync"
810

911
"github.com/expr-lang/expr"
1012
"github.com/expr-lang/expr/builtin"
@@ -74,43 +76,62 @@ func init() {
7476
}
7577

7678
func main() {
77-
var code string
78-
defer func() {
79-
if r := recover(); r != nil {
80-
fmt.Printf("==========================\n%s\n==========================\n%s\n==========================\n", code, r)
81-
debug.PrintStack()
82-
}
83-
}()
84-
85-
var corpus = map[string]struct{}{}
86-
87-
for {
88-
code = node(oneOf(list[int]{
89-
{3, 100},
90-
{4, 40},
91-
{5, 50},
92-
{6, 30},
93-
{7, 20},
94-
{8, 10},
95-
{9, 5},
96-
{10, 5},
97-
}))
98-
99-
program, err := expr.Compile(code, expr.Env(Env))
100-
if err != nil {
101-
continue
102-
}
103-
_, err = expr.Run(program, Env)
104-
if err != nil {
105-
continue
106-
}
107-
108-
if _, ok := corpus[code]; ok {
109-
continue
110-
}
111-
corpus[code] = struct{}{}
112-
fmt.Println(code)
79+
runtime.GOMAXPROCS(runtime.NumCPU())
80+
81+
var corpus = make(map[string]struct{})
82+
var corpusMutex sync.Mutex
83+
84+
numWorkers := runtime.NumCPU()
85+
var wg sync.WaitGroup
86+
wg.Add(numWorkers)
87+
88+
for i := 0; i < numWorkers; i++ {
89+
go func(workerID int) {
90+
defer func() {
91+
if r := recover(); r != nil {
92+
fmt.Printf("Worker %d recovered from panic: %v\n", workerID, r)
93+
debug.PrintStack()
94+
}
95+
}()
96+
97+
defer wg.Done()
98+
for {
99+
var code string
100+
101+
code = node(oneOf(list[int]{
102+
{3, 100},
103+
{4, 40},
104+
{5, 50},
105+
{6, 30},
106+
{7, 20},
107+
{8, 10},
108+
{9, 5},
109+
{10, 5},
110+
}))
111+
112+
program, err := expr.Compile(code, expr.Env(Env))
113+
if err != nil {
114+
continue
115+
}
116+
_, err = expr.Run(program, Env)
117+
if err != nil {
118+
continue
119+
}
120+
121+
corpusMutex.Lock()
122+
if _, exists := corpus[code]; exists {
123+
corpusMutex.Unlock()
124+
continue
125+
}
126+
corpus[code] = struct{}{}
127+
corpusMutex.Unlock()
128+
129+
fmt.Println(code)
130+
}
131+
}(i)
113132
}
133+
134+
wg.Wait()
114135
}
115136

116137
type fn func(depth int) string

0 commit comments

Comments
 (0)