aboutsummaryrefslogtreecommitdiffstats
path: root/syz-verifier/exectask.go
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2022-03-31 10:08:30 +0200
committerGitHub <noreply@github.com>2022-03-31 10:08:30 +0200
commitc4c32d8c774cb19ca838765ca4ddf38ab8dc0ddb (patch)
treeee08141c6405c8fa54684392c31b5de6beaf52c2 /syz-verifier/exectask.go
parent9d49f3a7c56a414597a16f28dd8b6b2be6352ad8 (diff)
syz-verifier: add exectask.go tests, fix races
Diffstat (limited to 'syz-verifier/exectask.go')
-rw-r--r--syz-verifier/exectask.go57
1 files changed, 38 insertions, 19 deletions
diff --git a/syz-verifier/exectask.go b/syz-verifier/exectask.go
index 052469ed7..e7e366d49 100644
--- a/syz-verifier/exectask.go
+++ b/syz-verifier/exectask.go
@@ -43,40 +43,53 @@ func (t *ExecTask) ToRPC() *rpctype.ExecTask {
}
}
-var (
- ChanMapMutex = sync.Mutex{}
- TaskIDToExecResultChan = map[int64]ExecResultChan{}
- TaskCounter = int64(-1)
-)
+type ExecTaskFactory struct {
+ chanMapMutex sync.Mutex
+ taskIDToExecResultChan map[int64]ExecResultChan
+ taskCounter int64
+}
+
+func MakeExecTaskFactory() *ExecTaskFactory {
+ return &ExecTaskFactory{
+ taskIDToExecResultChan: make(map[int64]ExecResultChan),
+ taskCounter: -1,
+ }
+}
type ExecResultChan chan *ExecResult
-func MakeExecTask(prog *prog.Prog) *ExecTask {
+func (factory *ExecTaskFactory) MakeExecTask(prog *prog.Prog) *ExecTask {
task := &ExecTask{
CreationTime: time.Now(),
Program: prog,
ExecResultChan: make(ExecResultChan),
- ID: atomic.AddInt64(&TaskCounter, 1),
+ ID: atomic.AddInt64(&factory.taskCounter, 1),
}
- ChanMapMutex.Lock()
- defer ChanMapMutex.Unlock()
- TaskIDToExecResultChan[task.ID] = task.ExecResultChan
+ factory.chanMapMutex.Lock()
+ defer factory.chanMapMutex.Unlock()
+ factory.taskIDToExecResultChan[task.ID] = task.ExecResultChan
return task
}
-func DeleteExecTask(task *ExecTask) {
- ChanMapMutex.Lock()
- defer ChanMapMutex.Unlock()
- delete(TaskIDToExecResultChan, task.ID)
+func (factory *ExecTaskFactory) ExecTasksQueued() int {
+ factory.chanMapMutex.Lock()
+ defer factory.chanMapMutex.Unlock()
+ return len(factory.taskIDToExecResultChan)
+}
+
+func (factory *ExecTaskFactory) DeleteExecTask(task *ExecTask) {
+ factory.chanMapMutex.Lock()
+ defer factory.chanMapMutex.Unlock()
+ delete(factory.taskIDToExecResultChan, task.ID)
}
-func GetExecResultChan(taskID int64) ExecResultChan {
- ChanMapMutex.Lock()
- defer ChanMapMutex.Unlock()
+func (factory *ExecTaskFactory) GetExecResultChan(taskID int64) ExecResultChan {
+ factory.chanMapMutex.Lock()
+ defer factory.chanMapMutex.Unlock()
- return TaskIDToExecResultChan[taskID]
+ return factory.taskIDToExecResultChan[taskID]
}
func MakeExecTaskQueue() *ExecTaskQueue {
@@ -88,22 +101,28 @@ func MakeExecTaskQueue() *ExecTaskQueue {
// ExecTaskQueue respects the pq.priority. Internally it is a thread-safe PQ.
type ExecTaskQueue struct {
pq ExecTaskPriorityQueue
+ mu sync.Mutex
}
// PopTask return false if no tasks are available.
func (q *ExecTaskQueue) PopTask() (*ExecTask, bool) {
+ q.mu.Lock()
+ defer q.mu.Unlock()
if q.pq.Len() == 0 {
return nil, false
}
-
return heap.Pop(&q.pq).(*ExecTask), true
}
func (q *ExecTaskQueue) PushTask(task *ExecTask) {
+ q.mu.Lock()
+ defer q.mu.Unlock()
heap.Push(&q.pq, task)
}
func (q *ExecTaskQueue) Len() int {
+ q.mu.Lock()
+ defer q.mu.Unlock()
return q.pq.Len()
}