-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathtask.rs
104 lines (94 loc) · 3.83 KB
/
task.rs
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
92
93
94
95
96
97
98
99
100
101
102
103
104
use crate::{
package::simulation::{
context::ContextTask, init::InitTask, output::OutputTask, state::StateTask,
},
task::{StoreAccessValidator, Task, TaskDistributionConfig, TaskSharedStore, TargetedTaskMessage, TaskMessage},
worker::WorkerHandler,
worker_pool::{WorkerPoolHandler, SplitConfig},
Result,
};
// All traits applied here apply to the enum.
// Also we have automatically derived all
// From<init::Task>, ..., From<output::Task> for this enum.
// Additionally we have TryInto<init::Task>, (and others)
// implemented for this enum.
#[derive(Clone, Debug)]
pub enum PackageTask {
Init(InitTask),
Context(ContextTask),
State(StateTask),
Output(OutputTask),
}
impl Task for PackageTask {
fn name(&self) -> &'static str {
match self {
Self::Init(inner) => inner.name(),
Self::Context(inner) => inner.name(),
Self::State(inner) => inner.name(),
Self::Output(inner) => inner.name(),
}
}
fn distribution(&self) -> TaskDistributionConfig {
match self {
Self::Init(inner) => inner.distribution(),
Self::Context(inner) => inner.distribution(),
Self::State(inner) => inner.distribution(),
Self::Output(inner) => inner.distribution(),
}
}
}
impl StoreAccessValidator for PackageTask {
fn verify_store_access(&self, access: &TaskSharedStore) -> Result<()> {
match self {
Self::Init(inner) => inner.verify_store_access(access),
Self::Context(inner) => inner.verify_store_access(access),
Self::State(inner) => inner.verify_store_access(access),
Self::Output(inner) => inner.verify_store_access(access),
}
}
}
impl WorkerHandler for PackageTask {
fn start_message(&self) -> Result<TargetedTaskMessage> {
match self {
Self::Init(inner) => inner.start_message(),
Self::Context(inner) => inner.start_message(),
Self::State(inner) => inner.start_message(),
Self::Output(inner) => inner.start_message(),
}
}
fn handle_worker_message(&mut self, msg: TaskMessage) -> Result<TargetedTaskMessage> {
match self {
Self::Init(inner) => inner.handle_worker_message(msg),
Self::Context(inner) => inner.handle_worker_message(msg),
Self::State(inner) => inner.handle_worker_message(msg),
Self::Output(inner) => inner.handle_worker_message(msg),
}
}
fn combine_task_messages(&self, task_messages: Vec<TaskMessage>) -> Result<TaskMessage> {
match self {
Self::Init(inner) => inner.combine_task_messages(task_messages),
Self::Context(inner) => inner.combine_task_messages(task_messages),
Self::State(inner) => inner.combine_task_messages(task_messages),
Self::Output(inner) => inner.combine_task_messages(task_messages),
}
}
}
impl WorkerPoolHandler for PackageTask {
fn split_task(&self, split_config: &SplitConfig) -> Result<Vec<PackageTask>> {
match self {
Self::Init(inner) => inner.split_task(split_config),
Self::Context(inner) => inner.split_task(split_config),
Self::State(inner) => inner.split_task(split_config),
Self::Output(inner) => inner.split_task(split_config),
}
}
fn combine_messages(&self, split_messages: Vec<TaskMessage>) -> Result<TaskMessage> {
match self {
Self::Init(inner) => inner.combine_messages(split_messages),
Self::Context(inner) => inner.combine_messages(split_messages),
Self::State(inner) => inner.combine_messages(split_messages),
Self::Output(inner) => inner.combine_messages(split_messages),
}
}
}
// TODO: Is there an important differentiation between Task and TaskMessage