-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathframework.go
More file actions
91 lines (80 loc) · 1.99 KB
/
framework.go
File metadata and controls
91 lines (80 loc) · 1.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright (C) 2015 Vinay Kumar
//
// zipscan is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// zipscan is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
package main
import (
"sync"
)
type fileInfo struct {
processed bool
path string
name string
dir bool
foundContentMatch bool
foundPathMatch bool
}
type processorInfo struct {
fn processor
count int
}
type processor func(fileInfoChannel, fileInfoChannel)
type processorFn func(fileInfo, fileInfoChannel)
func NewProcessor(fn processorFn) processor {
return func(in fileInfoChannel, out fileInfoChannel) {
if in == nil {
fn(fileInfo{}, out)
return
}
for {
select {
case i, ok := <-in:
if ok {
fn(i, out)
} else {
return
}
}
}
}
}
func SetupSystem(p *[]processorInfo) fileInfoChannel {
var lastProcessorOutChannel fileInfoChannel = nil
for _, e := range *p {
newOutChannel := make(fileInfoChannel,100)
if e.count > 1 {
go NewProcessorRunnerWithWait(lastProcessorOutChannel,newOutChannel,e.fn,e.count)()
} else {
go NewProcessorRunner(lastProcessorOutChannel,newOutChannel,e.fn)()
}
lastProcessorOutChannel = newOutChannel
}
return lastProcessorOutChannel
}
func NewProcessorRunner(in fileInfoChannel,out fileInfoChannel,fn processor) func(){
return func(){
fn(in, out)
close(out)
}
}
func NewProcessorRunnerWithWait(in fileInfoChannel,out fileInfoChannel,fn processor,count int) func(){
return func(){
var wg sync.WaitGroup
wg.Add(count)
for i := 1; i <= count; i++ {
go func() {
fn(in, out)
defer wg.Done()
}()
}
wg.Wait()
close(out)
}
}