/
multilevel.go
77 lines (68 loc) · 1.65 KB
/
multilevel.go
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
package dino
import (
"errors"
"github.com/stretchr/stew/slice"
)
// MultilevelQueue is a scheduler of schedulers
type MultilevelQueue struct {
Scheduler
name string
queues []Scheduler // We assume that this array is ordered by priority, with 0-index being the top priority queue
}
func (m *MultilevelQueue) Name() string {
return m.name
}
func (m *MultilevelQueue) New(n string, q ...Scheduler) {
m.name = n
m.queues = q
}
func (m *MultilevelQueue) Get() (*Process, error) {
for i, _ := range m.queues {
queue := m.queues[i]
if queue != nil && queue.Len() != 0 {
return queue.(Scheduler).Get()
}
}
return nil, errors.New("Nothing to return")
}
func (m *MultilevelQueue) Read() (*Process, error) {
for i, _ := range m.queues {
queue := m.queues[i]
if queue != nil && queue.Len() != 0 {
return queue.(Scheduler).Read()
}
}
return nil, errors.New("Nothing to return")
}
func (m *MultilevelQueue) Add(p *Process) error {
//TODO improve this function
if p == nil {
return errors.New("Cannot add nil process")
} else {
for i := range m.queues {
q := m.queues[i]
if q.Name() == string(p.Type) {
q.Add(p)
return nil
}
}
panic("Could not find compatible queue")
}
}
func (m *MultilevelQueue) Len() int {
length := 0
for i, _ := range m.queues {
queue := m.queues[i]
if queue != nil {
length += queue.(Scheduler).Len()
}
}
return length
}
func (m *MultilevelQueue) String() []string {
// str := "\n\n\t\t--------------------- " + m.name + " ---------------------\n"
// for i, _ := range m.queues {
// str += m.queues[i].String() + "\n"
// }
return slice.PlusStrings(m.queues[0].String(), m.queues[1].String())
}