9
9
//! data structs.
10
10
11
11
pub mod multilevel;
12
+ pub mod priority;
12
13
13
14
mod extras;
14
15
mod single_level;
@@ -18,7 +19,7 @@ pub use self::extras::Extras;
18
19
use std:: time:: Instant ;
19
20
20
21
/// A cell containing a task and needed extra information.
21
- pub trait TaskCell {
22
+ pub trait TaskCell : ' static {
22
23
/// Gets mutable extra information.
23
24
fn mut_extras ( & mut self ) -> & mut Extras ;
24
25
}
@@ -42,6 +43,7 @@ pub(crate) struct TaskInjector<T>(InjectorInner<T>);
42
43
enum InjectorInner < T > {
43
44
SingleLevel ( single_level:: TaskInjector < T > ) ,
44
45
Multilevel ( multilevel:: TaskInjector < T > ) ,
46
+ Priority ( priority:: TaskInjector < T > ) ,
45
47
}
46
48
47
49
impl < T : TaskCell + Send > TaskInjector < T > {
@@ -50,13 +52,15 @@ impl<T: TaskCell + Send> TaskInjector<T> {
50
52
match & self . 0 {
51
53
InjectorInner :: SingleLevel ( q) => q. push ( task_cell) ,
52
54
InjectorInner :: Multilevel ( q) => q. push ( task_cell) ,
55
+ InjectorInner :: Priority ( q) => q. push ( task_cell) ,
53
56
}
54
57
}
55
58
56
59
pub fn default_extras ( & self ) -> Extras {
57
60
match self . 0 {
58
61
InjectorInner :: SingleLevel ( _) => Extras :: single_level ( ) ,
59
62
InjectorInner :: Multilevel ( _) => Extras :: multilevel_default ( ) ,
63
+ InjectorInner :: Priority ( _) => Extras :: single_level ( ) ,
60
64
}
61
65
}
62
66
}
@@ -80,6 +84,7 @@ pub(crate) struct LocalQueue<T>(LocalQueueInner<T>);
80
84
enum LocalQueueInner < T > {
81
85
SingleLevel ( single_level:: LocalQueue < T > ) ,
82
86
Multilevel ( multilevel:: LocalQueue < T > ) ,
87
+ Priority ( priority:: LocalQueue < T > ) ,
83
88
}
84
89
85
90
impl < T : TaskCell + Send > LocalQueue < T > {
@@ -88,6 +93,7 @@ impl<T: TaskCell + Send> LocalQueue<T> {
88
93
match & mut self . 0 {
89
94
LocalQueueInner :: SingleLevel ( q) => q. push ( task_cell) ,
90
95
LocalQueueInner :: Multilevel ( q) => q. push ( task_cell) ,
96
+ LocalQueueInner :: Priority ( q) => q. push ( task_cell) ,
91
97
}
92
98
}
93
99
@@ -97,13 +103,15 @@ impl<T: TaskCell + Send> LocalQueue<T> {
97
103
match & mut self . 0 {
98
104
LocalQueueInner :: SingleLevel ( q) => q. pop ( ) ,
99
105
LocalQueueInner :: Multilevel ( q) => q. pop ( ) ,
106
+ LocalQueueInner :: Priority ( q) => q. pop ( ) ,
100
107
}
101
108
}
102
109
103
110
pub fn default_extras ( & self ) -> Extras {
104
111
match self . 0 {
105
112
LocalQueueInner :: SingleLevel ( _) => Extras :: single_level ( ) ,
106
113
LocalQueueInner :: Multilevel ( _) => Extras :: multilevel_default ( ) ,
114
+ LocalQueueInner :: Priority ( _) => Extras :: single_level ( ) ,
107
115
}
108
116
}
109
117
@@ -113,6 +121,7 @@ impl<T: TaskCell + Send> LocalQueue<T> {
113
121
match & mut self . 0 {
114
122
LocalQueueInner :: SingleLevel ( q) => q. has_tasks_or_pull ( ) ,
115
123
LocalQueueInner :: Multilevel ( q) => q. has_tasks_or_pull ( ) ,
124
+ LocalQueueInner :: Priority ( q) => q. has_tasks_or_pull ( ) ,
116
125
}
117
126
}
118
127
}
@@ -125,6 +134,8 @@ pub enum QueueType {
125
134
///
126
135
/// More to see: https://en.wikipedia.org/wiki/Multilevel_feedback_queue.
127
136
Multilevel ( multilevel:: Builder ) ,
137
+ /// A concurrent prioirty queue.
138
+ Priority ( priority:: Builder ) ,
128
139
}
129
140
130
141
impl Default for QueueType {
@@ -139,10 +150,17 @@ impl From<multilevel::Builder> for QueueType {
139
150
}
140
151
}
141
152
153
+ impl From < priority:: Builder > for QueueType {
154
+ fn from ( b : priority:: Builder ) -> QueueType {
155
+ QueueType :: Priority ( b)
156
+ }
157
+ }
158
+
142
159
pub ( crate ) fn build < T > ( ty : QueueType , local_num : usize ) -> ( TaskInjector < T > , Vec < LocalQueue < T > > ) {
143
160
match ty {
144
161
QueueType :: SingleLevel => single_level ( local_num) ,
145
162
QueueType :: Multilevel ( b) => b. build ( local_num) ,
163
+ QueueType :: Priority ( b) => b. build ( local_num) ,
146
164
}
147
165
}
148
166
0 commit comments