@@ -10,7 +10,9 @@ use crate::loom::sync::atomic::{AtomicBool, Ordering};
10
10
use crate :: loom:: sync:: { AtomicMut , Mutex } ;
11
11
use crate :: loom:: thread:: { self , JoinHandle , ThreadId } ;
12
12
use crate :: plumbing:: MemoDropSender ;
13
- use crate :: table:: memo:: { memo_drop_channel, spawn_memo_drop_thread, MemoDropReceiver } ;
13
+ use crate :: table:: memo:: {
14
+ memo_drop_channel, run_memo_drops, spawn_memo_drop_thread, MemoDropReceiver ,
15
+ } ;
14
16
use crate :: table:: Table ;
15
17
use crate :: { Cancelled , Event , EventKind , Revision } ;
16
18
@@ -41,7 +43,7 @@ pub struct Runtime {
41
43
table : Table ,
42
44
// DROP ORDER: `memo_drop_sender` and `unparker` need to drop before `memo_drop_thread`
43
45
// as `memo_drop_thread` exits once `memo_drop_sender` drops and its last parker barrier unparks
44
- memo_drop_unparker : UnparkOnDrop ,
46
+ memo_drop_unparker : Option < UnparkOnDrop > ,
45
47
memo_drop_sender : MemoDropSender ,
46
48
memo_drop_receiver : Exclusive < Option < MemoDropReceiver > > ,
47
49
memo_drop_thread : JoinOnDrop ,
@@ -87,26 +89,6 @@ impl<V> StampedValue<V> {
87
89
}
88
90
}
89
91
90
- impl Default for Runtime {
91
- fn default ( ) -> Self {
92
- let ( memo_drop_sender, memo_drop_receiver) = memo_drop_channel ( ) ;
93
-
94
- let parker = Parker :: new ( ) ;
95
- let unparker = UnparkOnDrop ( parker. unparker ( ) . clone ( ) ) ;
96
- memo_drop_sender. park ( parker) ;
97
- Runtime {
98
- revisions : [ Revision :: start ( ) ; Durability :: LEN ] ,
99
- revision_canceled : Default :: default ( ) ,
100
- dependency_graph : Default :: default ( ) ,
101
- table : Default :: default ( ) ,
102
- memo_drop_unparker : unparker,
103
- memo_drop_sender,
104
- memo_drop_receiver : Exclusive :: new ( Some ( memo_drop_receiver) ) ,
105
- memo_drop_thread : Default :: default ( ) ,
106
- }
107
- }
108
- }
109
-
110
92
impl std:: fmt:: Debug for Runtime {
111
93
fn fmt ( & self , fmt : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
112
94
fmt. debug_struct ( "Runtime" )
@@ -118,6 +100,28 @@ impl std::fmt::Debug for Runtime {
118
100
}
119
101
120
102
impl Runtime {
103
+ pub ( crate ) fn new ( drop_in_thread : bool ) -> Self {
104
+ let ( memo_drop_sender, memo_drop_receiver) = memo_drop_channel ( ) ;
105
+ let memo_drop_unparker = if drop_in_thread {
106
+ let parker = Parker :: new ( ) ;
107
+ let unparker = UnparkOnDrop ( parker. unparker ( ) . clone ( ) ) ;
108
+ memo_drop_sender. park ( parker) ;
109
+ Some ( unparker)
110
+ } else {
111
+ None
112
+ } ;
113
+ Runtime {
114
+ revisions : [ Revision :: start ( ) ; Durability :: LEN ] ,
115
+ revision_canceled : Default :: default ( ) ,
116
+ dependency_graph : Default :: default ( ) ,
117
+ table : Default :: default ( ) ,
118
+ memo_drop_unparker,
119
+ memo_drop_sender,
120
+ memo_drop_receiver : Exclusive :: new ( Some ( memo_drop_receiver) ) ,
121
+ memo_drop_thread : JoinOnDrop ( None ) ,
122
+ }
123
+ }
124
+
121
125
#[ inline]
122
126
pub ( crate ) fn current_revision ( & self ) -> Revision {
123
127
self . revisions [ 0 ]
@@ -181,13 +185,18 @@ impl Runtime {
181
185
/// Releases the previous barrier and acquires a new one, effectively kicking off a destruction
182
186
/// cycle for all collected memos up to this point.
183
187
pub ( crate ) fn memo_drop_barrier ( & mut self ) {
184
- if let Some ( receiver) = self . memo_drop_receiver . get_mut ( ) . take ( ) {
185
- tracing:: trace!( "Spawning memo drop thread" ) ;
186
- self . memo_drop_thread . 0 = Some ( spawn_memo_drop_thread ( receiver) ) ;
188
+ match & mut self . memo_drop_unparker {
189
+ Some ( UnparkOnDrop ( memo_drop_unparker) ) => {
190
+ if let Some ( receiver) = self . memo_drop_receiver . get_mut ( ) . take ( ) {
191
+ tracing:: trace!( "Spawning memo drop thread" ) ;
192
+ self . memo_drop_thread . 0 = Some ( spawn_memo_drop_thread ( receiver) ) ;
193
+ }
194
+ let parker = Parker :: new ( ) ;
195
+ mem:: replace ( memo_drop_unparker, parker. unparker ( ) . clone ( ) ) . unpark ( ) ;
196
+ self . memo_drop_sender . park ( parker) ;
197
+ }
198
+ None => run_memo_drops ( self . memo_drop_receiver . get_mut ( ) . as_mut ( ) . unwrap ( ) ) ,
187
199
}
188
- let parker = Parker :: new ( ) ;
189
- mem:: replace ( & mut self . memo_drop_unparker . 0 , parker. unparker ( ) . clone ( ) ) . unpark ( ) ;
190
- self . memo_drop_sender . park ( parker) ;
191
200
}
192
201
193
202
/// Block until `other_id` completes executing `database_key`, or return `BlockResult::Cycle`
0 commit comments