@@ -61,7 +61,7 @@ use crate::{
6161 backing_storage:: BackingStorage ,
6262 data:: {
6363 ActivenessState , AggregationNumber , CachedDataItem , CachedDataItemKey , CachedDataItemType ,
64- CachedDataItemValueRef , CellRef , CollectibleRef , CollectiblesRef , DirtyState ,
64+ CachedDataItemValueRef , CellRef , CollectibleRef , CollectiblesRef , Dirtyness ,
6565 InProgressCellState , InProgressState , InProgressStateInner , OutputValue , RootType ,
6666 } ,
6767 utils:: {
@@ -567,8 +567,9 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
567567 }
568568 }
569569
570- let is_dirty =
571- get ! ( task, Dirty ) . map_or ( false , |dirty_state| dirty_state. get ( self . session_id ) ) ;
570+ let is_dirty = task
571+ . dirty_state ( )
572+ . map_or ( false , |dirty_state| dirty_state. get ( self . session_id ) ) ;
572573
573574 // Check the dirty count of the root node
574575 let dirty_tasks = get ! ( task, AggregatedDirtyContainerCount )
@@ -624,7 +625,8 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
624625 visited : & mut FxHashSet < TaskId > ,
625626 ) -> String {
626627 let task = ctx. task ( task_id, TaskDataCategory :: Data ) ;
627- let is_dirty = get ! ( task, Dirty )
628+ let is_dirty = task
629+ . dirty_state ( )
628630 . map_or ( false , |dirty_state| dirty_state. get ( ctx. session_id ( ) ) ) ;
629631 let in_progress =
630632 get ! ( task, InProgress ) . map_or ( "not in progress" , |p| match p {
@@ -2369,57 +2371,60 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
23692371 ) ) ;
23702372
23712373 // Update the dirty state
2372- let old_dirty_state = get ! ( task, Dirty ) . copied ( ) ;
2374+ let old_dirtyness = task. dirtyness_and_session ( ) ;
23732375
2374- let new_dirty_state = if session_dependent {
2375- Some ( DirtyState {
2376- clean_in_session : Some ( self . session_id ) ,
2377- } )
2376+ let new_dirtyness = if session_dependent {
2377+ Some ( ( Dirtyness :: SessionDependent , Some ( self . session_id ) ) )
23782378 } else {
23792379 None
23802380 } ;
23812381
2382- let dirty_changed = old_dirty_state != new_dirty_state ;
2382+ let dirty_changed = old_dirtyness != new_dirtyness ;
23832383 let data_update = if dirty_changed {
2384- if let Some ( new_dirty_state) = new_dirty_state {
2385- task. insert ( CachedDataItem :: Dirty {
2386- value : new_dirty_state,
2387- } ) ;
2388- } else {
2384+ if let Some ( ( value, _) ) = new_dirtyness {
2385+ task. insert ( CachedDataItem :: Dirty { value } ) ;
2386+ } else if old_dirtyness. is_some ( ) {
23892387 task. remove ( & CachedDataItemKey :: Dirty { } ) ;
23902388 }
2389+ if let Some ( session_id) = new_dirtyness. and_then ( |t| t. 1 ) {
2390+ task. insert ( CachedDataItem :: CleanInSession { value : session_id } ) ;
2391+ } else if old_dirtyness. is_some_and ( |t| t. 1 . is_some ( ) ) {
2392+ task. remove ( & CachedDataItemKey :: CleanInSession { } ) ;
2393+ }
23912394
2392- if old_dirty_state. is_some ( ) || new_dirty_state. is_some ( ) {
2393- let mut dirty_containers = get ! ( task, AggregatedDirtyContainerCount )
2394- . cloned ( )
2395- . unwrap_or_default ( ) ;
2396- if let Some ( old_dirty_state) = old_dirty_state {
2397- dirty_containers. update_with_dirty_state ( & old_dirty_state) ;
2395+ let mut dirty_containers = get ! ( task, AggregatedDirtyContainerCount )
2396+ . cloned ( )
2397+ . unwrap_or_default ( ) ;
2398+ if let Some ( ( old_dirtyness, old_clean_in_session) ) = old_dirtyness {
2399+ dirty_containers
2400+ . update_with_dirtyness_and_session ( old_dirtyness, old_clean_in_session) ;
2401+ }
2402+ let aggregated_update = match ( old_dirtyness, new_dirtyness) {
2403+ ( None , None ) => unreachable ! ( ) ,
2404+ ( Some ( old) , None ) => {
2405+ dirty_containers. undo_update_with_dirtyness_and_session ( old. 0 , old. 1 )
23982406 }
2399- let aggregated_update = match ( old_dirty_state , new_dirty_state ) {
2400- ( None , None ) => unreachable ! ( ) ,
2401- ( Some ( old ) , None ) => dirty_containers . undo_update_with_dirty_state ( & old ) ,
2402- ( None , Some ( new) ) => dirty_containers . update_with_dirty_state ( & new ) ,
2403- ( Some ( old) , Some ( new ) ) => dirty_containers . replace_dirty_state ( & old , & new) ,
2404- } ;
2405- if !aggregated_update . is_zero ( ) {
2406- if aggregated_update. get ( self . session_id ) < 0
2407- && let Some ( activeness_state ) = get_mut ! ( task , Activeness )
2408- {
2409- activeness_state . all_clean_event . notify ( usize :: MAX ) ;
2410- activeness_state. unset_active_until_clean ( ) ;
2411- if activeness_state. is_empty ( ) {
2412- task . remove ( & CachedDataItemKey :: Activeness { } ) ;
2413- }
2407+ ( None , Some ( new ) ) => {
2408+ dirty_containers . update_with_dirtyness_and_session ( new . 0 , new . 1 )
2409+ }
2410+ ( Some ( old ) , Some ( new) ) => {
2411+ dirty_containers . replace_dirtyness_and_session ( old. 0 , old . 1 , new . 0 , new. 1 )
2412+ }
2413+ } ;
2414+ if ! aggregated_update. is_zero ( ) {
2415+ if aggregated_update . get ( self . session_id ) < 0
2416+ && let Some ( activeness_state ) = get_mut ! ( task , Activeness )
2417+ {
2418+ activeness_state. all_clean_event . notify ( usize :: MAX ) ;
2419+ activeness_state. unset_active_until_clean ( ) ;
2420+ if activeness_state . is_empty ( ) {
2421+ task . remove ( & CachedDataItemKey :: Activeness { } ) ;
24142422 }
2415- AggregationUpdateJob :: data_update (
2416- & mut task,
2417- AggregatedDataUpdate :: new ( )
2418- . dirty_container_update ( task_id, aggregated_update) ,
2419- )
2420- } else {
2421- None
24222423 }
2424+ AggregationUpdateJob :: data_update (
2425+ & mut task,
2426+ AggregatedDataUpdate :: new ( ) . dirty_container_update ( task_id, aggregated_update) ,
2427+ )
24232428 } else {
24242429 None
24252430 }
@@ -2887,7 +2892,9 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
28872892
28882893 let mut ctx = self . execute_context ( turbo_tasks) ;
28892894 let mut task = ctx. task ( task_id, TaskDataCategory :: All ) ;
2890- let is_dirty = get ! ( task, Dirty ) . map_or ( false , |dirty| dirty. get ( self . session_id ) ) ;
2895+ let is_dirty = task
2896+ . dirty_state ( )
2897+ . map_or ( false , |dirty| dirty. get ( self . session_id ) ) ;
28912898 let has_dirty_containers = get ! ( task, AggregatedDirtyContainerCount )
28922899 . map_or ( false , |dirty_containers| {
28932900 dirty_containers. get ( self . session_id ) > 0
@@ -2980,7 +2987,9 @@ impl<B: BackingStorage> TurboTasksBackendInner<B> {
29802987 }
29812988 }
29822989
2983- let is_dirty = get ! ( task, Dirty ) . is_some_and ( |dirty| dirty. get ( self . session_id ) ) ;
2990+ let is_dirty = task
2991+ . dirty_state ( )
2992+ . is_some_and ( |dirty| dirty. get ( self . session_id ) ) ;
29842993 let has_dirty_container = get ! ( task, AggregatedDirtyContainerCount )
29852994 . is_some_and ( |count| count. get ( self . session_id ) > 0 ) ;
29862995 let should_be_in_upper = is_dirty || has_dirty_container;
0 commit comments