Skip to content

Commit a31f83f

Browse files
committed
chore(turbo-tasks): Move Invalidator struct from manager.rs to invalidation.rs
1 parent 38d8301 commit a31f83f

File tree

3 files changed

+136
-130
lines changed

3 files changed

+136
-130
lines changed

turbopack/crates/turbo-tasks/src/invalidation.rs

Lines changed: 128 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,138 @@ use std::{
33
fmt::Display,
44
hash::{Hash, Hasher},
55
mem::replace,
6+
sync::{Arc, Weak},
67
};
78

9+
use anyhow::Result;
810
use indexmap::{map::Entry, IndexMap, IndexSet};
11+
use serde::{de::Visitor, Deserialize, Serialize};
12+
use tokio::runtime::Handle;
913

10-
use crate::{magic_any::HasherMut, util::StaticOrArc};
14+
use crate::{
15+
magic_any::HasherMut,
16+
manager::{current_task, with_turbo_tasks},
17+
trace::TraceRawVcs,
18+
util::StaticOrArc,
19+
TaskId, TurboTasksApi,
20+
};
21+
22+
/// Get an [`Invalidator`] that can be used to invalidate the current task
23+
/// based on external events.
24+
pub fn get_invalidator() -> Invalidator {
25+
let handle = Handle::current();
26+
Invalidator {
27+
task: current_task("turbo_tasks::get_invalidator()"),
28+
turbo_tasks: with_turbo_tasks(Arc::downgrade),
29+
handle,
30+
}
31+
}
32+
33+
pub struct Invalidator {
34+
task: TaskId,
35+
turbo_tasks: Weak<dyn TurboTasksApi>,
36+
handle: Handle,
37+
}
38+
39+
impl Invalidator {
40+
pub fn invalidate(self) {
41+
let Invalidator {
42+
task,
43+
turbo_tasks,
44+
handle,
45+
} = self;
46+
let _ = handle.enter();
47+
if let Some(turbo_tasks) = turbo_tasks.upgrade() {
48+
turbo_tasks.invalidate(task);
49+
}
50+
}
51+
52+
pub fn invalidate_with_reason<T: InvalidationReason>(self, reason: T) {
53+
let Invalidator {
54+
task,
55+
turbo_tasks,
56+
handle,
57+
} = self;
58+
let _ = handle.enter();
59+
if let Some(turbo_tasks) = turbo_tasks.upgrade() {
60+
turbo_tasks.invalidate_with_reason(
61+
task,
62+
(Arc::new(reason) as Arc<dyn InvalidationReason>).into(),
63+
);
64+
}
65+
}
66+
67+
pub fn invalidate_with_static_reason<T: InvalidationReason>(self, reason: &'static T) {
68+
let Invalidator {
69+
task,
70+
turbo_tasks,
71+
handle,
72+
} = self;
73+
let _ = handle.enter();
74+
if let Some(turbo_tasks) = turbo_tasks.upgrade() {
75+
turbo_tasks
76+
.invalidate_with_reason(task, (reason as &'static dyn InvalidationReason).into());
77+
}
78+
}
79+
}
80+
81+
impl Hash for Invalidator {
82+
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
83+
self.task.hash(state);
84+
}
85+
}
86+
87+
impl PartialEq for Invalidator {
88+
fn eq(&self, other: &Self) -> bool {
89+
self.task == other.task
90+
}
91+
}
92+
93+
impl Eq for Invalidator {}
94+
95+
impl TraceRawVcs for Invalidator {
96+
fn trace_raw_vcs(&self, _context: &mut crate::trace::TraceRawVcsContext) {
97+
// nothing here
98+
}
99+
}
100+
101+
impl Serialize for Invalidator {
102+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
103+
where
104+
S: serde::Serializer,
105+
{
106+
serializer.serialize_newtype_struct("Invalidator", &self.task)
107+
}
108+
}
109+
110+
impl<'de> Deserialize<'de> for Invalidator {
111+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
112+
where
113+
D: serde::Deserializer<'de>,
114+
{
115+
struct V;
116+
117+
impl<'de> Visitor<'de> for V {
118+
type Value = Invalidator;
119+
120+
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
121+
write!(f, "an Invalidator")
122+
}
123+
124+
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
125+
where
126+
D: serde::Deserializer<'de>,
127+
{
128+
Ok(Invalidator {
129+
task: TaskId::deserialize(deserializer)?,
130+
turbo_tasks: with_turbo_tasks(Arc::downgrade),
131+
handle: tokio::runtime::Handle::current(),
132+
})
133+
}
134+
}
135+
deserializer.deserialize_newtype_struct("Invalidator", V)
136+
}
137+
}
11138

12139
pub trait DynamicEqHash {
13140
fn as_any(&self) -> &dyn Any;

turbopack/crates/turbo-tasks/src/lib.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,16 +83,16 @@ pub use completion::{Completion, Completions};
8383
pub use display::ValueToString;
8484
pub use id::{ExecutionId, FunctionId, TaskId, TraitTypeId, ValueTypeId, TRANSIENT_TASK_BIT};
8585
pub use invalidation::{
86-
DynamicEqHash, InvalidationReason, InvalidationReasonKind, InvalidationReasonSet,
86+
get_invalidator, DynamicEqHash, InvalidationReason, InvalidationReasonKind,
87+
InvalidationReasonSet, Invalidator,
8788
};
8889
pub use join_iter_ext::{JoinIterExt, TryFlatJoinIterExt, TryJoinIterExt};
8990
pub use magic_any::MagicAny;
9091
pub use manager::{
91-
dynamic_call, dynamic_this_call, emit, get_invalidator, mark_finished, mark_stateful,
92-
prevent_gc, run_once, run_once_with_reason, spawn_blocking, spawn_thread, trait_call,
93-
turbo_tasks, CurrentCellRef, Invalidator, ReadConsistency, TaskPersistence, TurboTasks,
94-
TurboTasksApi, TurboTasksBackendApi, TurboTasksBackendApiExt, TurboTasksCallApi, Unused,
95-
UpdateInfo,
92+
dynamic_call, dynamic_this_call, emit, mark_finished, mark_stateful, prevent_gc, run_once,
93+
run_once_with_reason, spawn_blocking, spawn_thread, trait_call, turbo_tasks, CurrentCellRef,
94+
ReadConsistency, TaskPersistence, TurboTasks, TurboTasksApi, TurboTasksBackendApi,
95+
TurboTasksBackendApiExt, TurboTasksCallApi, Unused, UpdateInfo,
9696
};
9797
pub use native_function::{FunctionMeta, NativeFunction};
9898
pub use raw_vc::{CellId, RawVc, ReadRawVcFuture, ResolveTypeError};

turbopack/crates/turbo-tasks/src/manager.rs

Lines changed: 2 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::{
22
any::Any,
33
borrow::Cow,
44
future::Future,
5-
hash::{BuildHasherDefault, Hash},
5+
hash::BuildHasherDefault,
66
mem::take,
77
panic::AssertUnwindSafe,
88
pin::Pin,
@@ -18,7 +18,7 @@ use anyhow::{anyhow, Result};
1818
use auto_hash_map::AutoMap;
1919
use futures::FutureExt;
2020
use rustc_hash::FxHasher;
21-
use serde::{de::Visitor, Deserialize, Serialize};
21+
use serde::{Deserialize, Serialize};
2222
use tokio::{runtime::Handle, select, task_local};
2323
use tokio_util::task::TaskTracker;
2424
use tracing::{info_span, instrument, trace_span, Instrument, Level};
@@ -1513,112 +1513,6 @@ pub(crate) fn current_task(from: &str) -> TaskId {
15131513
}
15141514
}
15151515

1516-
pub struct Invalidator {
1517-
task: TaskId,
1518-
turbo_tasks: Weak<dyn TurboTasksApi>,
1519-
handle: Handle,
1520-
}
1521-
1522-
impl Hash for Invalidator {
1523-
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
1524-
self.task.hash(state);
1525-
}
1526-
}
1527-
1528-
impl PartialEq for Invalidator {
1529-
fn eq(&self, other: &Self) -> bool {
1530-
self.task == other.task
1531-
}
1532-
}
1533-
1534-
impl Eq for Invalidator {}
1535-
1536-
impl Invalidator {
1537-
pub fn invalidate(self) {
1538-
let Invalidator {
1539-
task,
1540-
turbo_tasks,
1541-
handle,
1542-
} = self;
1543-
let _ = handle.enter();
1544-
if let Some(turbo_tasks) = turbo_tasks.upgrade() {
1545-
turbo_tasks.invalidate(task);
1546-
}
1547-
}
1548-
1549-
pub fn invalidate_with_reason<T: InvalidationReason>(self, reason: T) {
1550-
let Invalidator {
1551-
task,
1552-
turbo_tasks,
1553-
handle,
1554-
} = self;
1555-
let _ = handle.enter();
1556-
if let Some(turbo_tasks) = turbo_tasks.upgrade() {
1557-
turbo_tasks.invalidate_with_reason(
1558-
task,
1559-
(Arc::new(reason) as Arc<dyn InvalidationReason>).into(),
1560-
);
1561-
}
1562-
}
1563-
1564-
pub fn invalidate_with_static_reason<T: InvalidationReason>(self, reason: &'static T) {
1565-
let Invalidator {
1566-
task,
1567-
turbo_tasks,
1568-
handle,
1569-
} = self;
1570-
let _ = handle.enter();
1571-
if let Some(turbo_tasks) = turbo_tasks.upgrade() {
1572-
turbo_tasks
1573-
.invalidate_with_reason(task, (reason as &'static dyn InvalidationReason).into());
1574-
}
1575-
}
1576-
}
1577-
1578-
impl TraceRawVcs for Invalidator {
1579-
fn trace_raw_vcs(&self, _context: &mut crate::trace::TraceRawVcsContext) {
1580-
// nothing here
1581-
}
1582-
}
1583-
1584-
impl Serialize for Invalidator {
1585-
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
1586-
where
1587-
S: serde::Serializer,
1588-
{
1589-
serializer.serialize_newtype_struct("Invalidator", &self.task)
1590-
}
1591-
}
1592-
1593-
impl<'de> Deserialize<'de> for Invalidator {
1594-
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
1595-
where
1596-
D: serde::Deserializer<'de>,
1597-
{
1598-
struct V;
1599-
1600-
impl<'de> Visitor<'de> for V {
1601-
type Value = Invalidator;
1602-
1603-
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
1604-
write!(f, "an Invalidator")
1605-
}
1606-
1607-
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
1608-
where
1609-
D: serde::Deserializer<'de>,
1610-
{
1611-
Ok(Invalidator {
1612-
task: TaskId::deserialize(deserializer)?,
1613-
turbo_tasks: weak_turbo_tasks(),
1614-
handle: tokio::runtime::Handle::current(),
1615-
})
1616-
}
1617-
}
1618-
deserializer.deserialize_newtype_struct("Invalidator", V)
1619-
}
1620-
}
1621-
16221516
pub async fn run_once<T: Send + 'static>(
16231517
tt: Arc<dyn TurboTasksApi>,
16241518
future: impl Future<Output = Result<T>> + Send + 'static,
@@ -1704,10 +1598,6 @@ pub fn with_turbo_tasks<T>(func: impl FnOnce(&Arc<dyn TurboTasksApi>) -> T) -> T
17041598
TURBO_TASKS.with(|arc| func(arc))
17051599
}
17061600

1707-
pub fn weak_turbo_tasks() -> Weak<dyn TurboTasksApi> {
1708-
TURBO_TASKS.with(Arc::downgrade)
1709-
}
1710-
17111601
pub fn with_turbo_tasks_for_testing<T>(
17121602
tt: Arc<dyn TurboTasksApi>,
17131603
current_task: TaskId,
@@ -1738,17 +1628,6 @@ pub fn current_task_for_testing() -> TaskId {
17381628
CURRENT_GLOBAL_TASK_STATE.with(|ts| ts.read().unwrap().task_id)
17391629
}
17401630

1741-
/// Get an [`Invalidator`] that can be used to invalidate the current task
1742-
/// based on external events.
1743-
pub fn get_invalidator() -> Invalidator {
1744-
let handle = Handle::current();
1745-
Invalidator {
1746-
task: current_task("turbo_tasks::get_invalidator()"),
1747-
turbo_tasks: weak_turbo_tasks(),
1748-
handle,
1749-
}
1750-
}
1751-
17521631
/// Marks the current task as finished. This excludes it from waiting for
17531632
/// strongly consistency.
17541633
pub fn mark_finished() {

0 commit comments

Comments
 (0)