@@ -3,8 +3,10 @@ package main
3
3
import (
4
4
"fmt"
5
5
"reflect"
6
+ "runtime"
6
7
"runtime/debug"
7
8
"strings"
9
+ "sync"
8
10
9
11
"github.com/expr-lang/expr"
10
12
"github.com/expr-lang/expr/builtin"
@@ -74,43 +76,62 @@ func init() {
74
76
}
75
77
76
78
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 )
113
132
}
133
+
134
+ wg .Wait ()
114
135
}
115
136
116
137
type fn func (depth int ) string
0 commit comments