turbo_tasks/
serialization_invalidation.rs1use std::{
2 hash::Hash,
3 sync::{Arc, Weak},
4};
5
6use serde::{Deserialize, Serialize, de::Visitor};
7use tokio::runtime::Handle;
8
9use crate::{TaskId, TurboTasksApi, manager::with_turbo_tasks, trace::TraceRawVcs};
10
11#[derive(Clone)]
12pub struct SerializationInvalidator {
13 task: TaskId,
14 turbo_tasks: Weak<dyn TurboTasksApi>,
15 handle: Handle,
16}
17
18impl Hash for SerializationInvalidator {
19 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
20 self.task.hash(state);
21 }
22}
23
24impl PartialEq for SerializationInvalidator {
25 fn eq(&self, other: &Self) -> bool {
26 self.task == other.task
27 }
28}
29
30impl Eq for SerializationInvalidator {}
31
32impl SerializationInvalidator {
33 pub fn invalidate(&self) {
34 let SerializationInvalidator {
35 task,
36 turbo_tasks,
37 handle,
38 } = self;
39 let _guard = handle.enter();
40 if let Some(turbo_tasks) = turbo_tasks.upgrade() {
41 turbo_tasks.invalidate_serialization(*task);
42 }
43 }
44
45 pub(crate) fn new(task_id: TaskId) -> Self {
46 Self {
47 task: task_id,
48 turbo_tasks: with_turbo_tasks(Arc::downgrade),
49 handle: Handle::current(),
50 }
51 }
52}
53
54impl TraceRawVcs for SerializationInvalidator {
55 fn trace_raw_vcs(&self, _context: &mut crate::trace::TraceRawVcsContext) {
56 }
58}
59
60impl Serialize for SerializationInvalidator {
61 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
62 where
63 S: serde::Serializer,
64 {
65 serializer.serialize_newtype_struct("SerializationInvalidator", &self.task)
66 }
67}
68
69impl<'de> Deserialize<'de> for SerializationInvalidator {
70 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71 where
72 D: serde::Deserializer<'de>,
73 {
74 struct V;
75
76 impl<'de> Visitor<'de> for V {
77 type Value = SerializationInvalidator;
78
79 fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
80 write!(f, "an SerializationInvalidator")
81 }
82
83 fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
84 where
85 D: serde::Deserializer<'de>,
86 {
87 Ok(SerializationInvalidator {
88 task: TaskId::deserialize(deserializer)?,
89 turbo_tasks: with_turbo_tasks(Arc::downgrade),
90 handle: tokio::runtime::Handle::current(),
91 })
92 }
93 }
94 deserializer.deserialize_newtype_struct("SerializationInvalidator", V)
95 }
96}