Skip to content

Commit c8d2bc5

Browse files
authored
box Scheduled task state to save memory (vercel/turborepo#8807)
### Description This makes the enum smaller for the Done state, which is the common one ### Testing Instructions <!-- Give a quick description of steps to test your changes. -->
1 parent 1c5f7af commit c8d2bc5

File tree

1 file changed

+41
-43
lines changed
  • crates/turbo-tasks-memory/src

1 file changed

+41
-43
lines changed

crates/turbo-tasks-memory/src/task.rs

Lines changed: 41 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ impl TaskState {
187187
let description2 = description.clone();
188188
Self {
189189
aggregation_node: TaskAggregationNode::new(),
190-
state_type: Scheduled {
190+
state_type: Scheduled(Box::new(ScheduledState {
191191
start_event: Event::new(move || {
192192
format!("TaskState({})::start_event", description())
193193
}),
@@ -196,7 +196,7 @@ impl TaskState {
196196
}),
197197
outdated_edges: Default::default(),
198198
clean: true,
199-
},
199+
})),
200200
collectibles: Default::default(),
201201
output: Default::default(),
202202
cells: Default::default(),
@@ -326,8 +326,8 @@ struct InProgressState {
326326
/// true, when the task was invalidated while executing. It will be
327327
/// scheduled again.
328328
stale: bool,
329-
/// Dependencies and children that need to be disconnected once leaving
330-
/// this state.
329+
/// Dependencies and children that need to be disconnected once entering
330+
/// Done.
331331
outdated_edges: TaskEdgesSet,
332332
/// Children that are connected during execution. These children are already
333333
/// removed from `outdated_edges`.
@@ -336,6 +336,18 @@ struct InProgressState {
336336
outdated_collectibles: MaybeCollectibles,
337337
}
338338

339+
struct ScheduledState {
340+
/// Event is fired when the task is IsProgress.
341+
start_event: Event,
342+
/// Event is fired when the task is Done.
343+
done_event: Event,
344+
/// Dependencies and children that need to be disconnected once entering
345+
/// Done.
346+
outdated_edges: Box<TaskEdgesSet>,
347+
/// true, when the task wasn't changed since the last execution
348+
clean: bool,
349+
}
350+
339351
enum TaskStateType {
340352
/// Ready
341353
///
@@ -362,15 +374,7 @@ enum TaskStateType {
362374
/// Execution is invalid and scheduled
363375
///
364376
/// on start this will move to InProgress or Dirty depending on active flag
365-
Scheduled {
366-
/// Event is fired when the task is IsProgress.
367-
start_event: Event,
368-
/// Event is fired when the task is Done.
369-
done_event: Event,
370-
outdated_edges: Box<TaskEdgesSet>,
371-
/// true, when the task wasn't changed since the last execution
372-
clean: bool,
373-
},
377+
Scheduled(Box<ScheduledState>),
374378

375379
/// Execution is happening
376380
///
@@ -396,7 +400,7 @@ impl TaskStateType {
396400
TaskStateType::Dirty { outdated_edges, .. } => {
397401
Either::Right(Either::Right(outdated_edges.children()))
398402
}
399-
TaskStateType::Scheduled { outdated_edges, .. } => {
403+
TaskStateType::Scheduled(box ScheduledState { outdated_edges, .. }) => {
400404
Either::Right(Either::Right(outdated_edges.children()))
401405
}
402406
}
@@ -420,7 +424,7 @@ impl TaskStateType {
420424
(edges, children)
421425
}
422426
TaskStateType::Dirty { outdated_edges, .. }
423-
| TaskStateType::Scheduled { outdated_edges, .. } => {
427+
| TaskStateType::Scheduled(box ScheduledState { outdated_edges, .. }) => {
424428
let mut edges = *outdated_edges;
425429
let children = edges.drain_children();
426430
(edges, children)
@@ -718,12 +722,12 @@ impl Task {
718722
// should not start in this state
719723
return None;
720724
}
721-
Scheduled {
725+
Scheduled(box ScheduledState {
722726
ref mut done_event,
723727
ref mut start_event,
724728
ref mut outdated_edges,
725729
clean,
726-
} => {
730+
}) => {
727731
start_event.notify(usize::MAX);
728732
let done_event = done_event.take();
729733
let outdated_edges = *take(outdated_edges);
@@ -997,12 +1001,12 @@ impl Task {
9971001
let description = self.get_event_description();
9981002
let start_event =
9991003
Event::new(move || format!("TaskState({})::start_event", description()));
1000-
state.state_type = Scheduled {
1004+
state.state_type = Scheduled(Box::new(ScheduledState {
10011005
start_event,
10021006
done_event,
10031007
outdated_edges: Box::new(outdated_edges),
10041008
clean: false,
1005-
};
1009+
}));
10061010
drop(state);
10071011
schedule_task = true;
10081012
} else {
@@ -1088,7 +1092,7 @@ impl Task {
10881092

10891093
if let TaskMetaStateWriteGuard::Full(mut state) = self.state_mut() {
10901094
match state.state_type {
1091-
Scheduled { ref mut clean, .. } => {
1095+
Scheduled(box ScheduledState { ref mut clean, .. }) => {
10921096
*clean = false;
10931097

10941098
// already scheduled
@@ -1113,7 +1117,7 @@ impl Task {
11131117
);
11141118
let description = self.get_event_description();
11151119
let description2 = description.clone();
1116-
state.state_type = Scheduled {
1120+
state.state_type = Scheduled(Box::new(ScheduledState {
11171121
done_event: Event::new(move || {
11181122
format!("TaskState({})::done_event", description())
11191123
}),
@@ -1122,7 +1126,7 @@ impl Task {
11221126
}),
11231127
outdated_edges: Box::new(outdated_edges),
11241128
clean: false,
1125-
};
1129+
}));
11261130
drop(state);
11271131
change_job.apply(&aggregation_context);
11281132

@@ -1210,7 +1214,7 @@ impl Task {
12101214
} => {
12111215
let description = self.get_event_description();
12121216
let description2 = description.clone();
1213-
state.state_type = Scheduled {
1217+
state.state_type = Scheduled(Box::new(ScheduledState {
12141218
start_event: Event::new(move || {
12151219
format!("TaskState({})::start_event", description())
12161220
}),
@@ -1219,7 +1223,7 @@ impl Task {
12191223
}),
12201224
outdated_edges: take(outdated_edges),
12211225
clean: false,
1222-
};
1226+
}));
12231227
let change_job = state.aggregation_node.apply_change(
12241228
&aggregation_context,
12251229
TaskChange {
@@ -1245,7 +1249,7 @@ impl Task {
12451249
);
12461250
let description = self.get_event_description();
12471251
let description2 = description.clone();
1248-
state.state_type = Scheduled {
1252+
state.state_type = Scheduled(Box::new(ScheduledState {
12491253
start_event: Event::new(move || {
12501254
format!("TaskState({})::start_event", description())
12511255
}),
@@ -1254,7 +1258,7 @@ impl Task {
12541258
}),
12551259
outdated_edges: Box::new(outdated_edges),
12561260
clean: true,
1257-
};
1261+
}));
12581262
drop(state);
12591263
change_job.apply(&aggregation_context);
12601264

@@ -1277,7 +1281,7 @@ impl Task {
12771281
let mut aggregation_context = TaskAggregationContext::new(turbo_tasks, backend);
12781282
let description = self.get_event_description();
12791283
let description2 = description.clone();
1280-
state.state_type = Scheduled {
1284+
state.state_type = Scheduled(Box::new(ScheduledState {
12811285
start_event: Event::new(move || {
12821286
format!("TaskState({})::start_event", description())
12831287
}),
@@ -1286,7 +1290,7 @@ impl Task {
12861290
}),
12871291
outdated_edges: take(outdated_edges),
12881292
clean: false,
1289-
};
1293+
}));
12901294
let job = state.aggregation_node.apply_change(
12911295
&aggregation_context,
12921296
TaskChange {
@@ -1390,14 +1394,14 @@ impl Task {
13901394
let start_event =
13911395
Event::new(move || format!("TaskState({})::start_event", description()));
13921396
let listener = start_event.listen_with_note(note);
1393-
state.state_type = Scheduled {
1397+
state.state_type = Scheduled(Box::new(ScheduledState {
13941398
start_event,
13951399
done_event: Event::new(move || {
13961400
format!("TaskState({})::done_event", description2())
13971401
}),
13981402
outdated_edges: take(outdated_edges),
13991403
clean: false,
1400-
};
1404+
}));
14011405
let change_job = state.aggregation_node.apply_change(
14021406
&aggregation_context,
14031407
TaskChange {
@@ -1411,9 +1415,9 @@ impl Task {
14111415
aggregation_context.apply_queued_updates();
14121416
Err(ReadCellError::Recomputing(listener))
14131417
}
1414-
Scheduled {
1418+
Scheduled(box ScheduledState {
14151419
ref start_event, ..
1416-
} => Err(ReadCellError::Recomputing(
1420+
}) => Err(ReadCellError::Recomputing(
14171421
start_event.listen_with_note(note),
14181422
)),
14191423
}
@@ -1630,14 +1634,14 @@ impl Task {
16301634
let done_event =
16311635
Event::new(move || format!("TaskState({})::done_event", description()));
16321636
let listener = done_event.listen_with_note(note);
1633-
state.state_type = Scheduled {
1637+
state.state_type = Scheduled(Box::new(ScheduledState {
16341638
start_event: Event::new(move || {
16351639
format!("TaskState({})::start_event", description2())
16361640
}),
16371641
done_event,
16381642
outdated_edges: take(outdated_edges),
16391643
clean: false,
1640-
};
1644+
}));
16411645
let change_job = state.aggregation_node.apply_change(
16421646
&aggregation_context,
16431647
TaskChange {
@@ -1649,15 +1653,9 @@ impl Task {
16491653
change_job.apply(&aggregation_context);
16501654
Ok(Err(listener))
16511655
}
1652-
Scheduled {
1653-
done_event: ref event,
1654-
..
1655-
}
1656-
| InProgress(box InProgressState {
1657-
done_event: ref event,
1658-
..
1659-
}) => {
1660-
let listener = event.listen_with_note(note);
1656+
Scheduled(box ScheduledState { ref done_event, .. })
1657+
| InProgress(box InProgressState { ref done_event, .. }) => {
1658+
let listener = done_event.listen_with_note(note);
16611659
drop(state);
16621660
Ok(Err(listener))
16631661
}

0 commit comments

Comments
 (0)