@@ -162,16 +162,19 @@ fn individual_conflicts(conflicts: AccessConflicts) -> FixedBitSet {
162
162
163
163
fn get_all_access_ids ( access : & Access < ComponentId > ) -> Vec < ( ReflectAccessId , bool ) > {
164
164
let mut access_all_read = Access :: < ComponentId > :: default ( ) ;
165
- access_all_read. read_all_components ( ) ;
165
+ access_all_read. read_all ( ) ;
166
166
167
167
let mut access_all_write = Access :: < ComponentId > :: default ( ) ;
168
- access_all_write. write_all_components ( ) ;
168
+ access_all_write. write_all ( ) ;
169
169
170
170
// read conflicts with each set to figure out the necessary locks
171
171
172
- let read = individual_conflicts ( access. get_conflicts ( & access_all_read) ) ;
172
+ let mut read = individual_conflicts ( access. get_conflicts ( & access_all_read) ) ;
173
173
let written = individual_conflicts ( access. get_conflicts ( & access_all_write) ) ;
174
174
175
+ // remove reads from writes
176
+ read. difference_with ( & written) ;
177
+
175
178
let mut result = Vec :: new ( ) ;
176
179
for c in read. ones ( ) {
177
180
result. push ( (
@@ -188,3 +191,38 @@ fn get_all_access_ids(access: &Access<ComponentId>) -> Vec<(ReflectAccessId, boo
188
191
189
192
result
190
193
}
194
+
195
+ #[ cfg( test) ]
196
+ mod test {
197
+ use bevy:: {
198
+ app:: Update ,
199
+ ecs:: {
200
+ component:: Component ,
201
+ system:: { Query , Resource } ,
202
+ } ,
203
+ } ;
204
+
205
+ use super :: * ;
206
+ #[ derive( Component ) ]
207
+ struct Comp ;
208
+
209
+ #[ derive( Resource ) ]
210
+ struct Res ;
211
+
212
+ #[ test]
213
+ pub fn check_with_world_correctly_locks_resource_and_component ( ) {
214
+ let system_fn = |mut guard : WithWorldGuard < ( ResMut < Res > , Query < & ' static Comp > ) > | {
215
+ let ( guard, ( _res, _entity) ) = guard. get_mut ( ) ;
216
+ assert_eq ! ( guard. list_accesses( ) . len( ) , 2 , "Expected 2 accesses" ) ;
217
+ } ;
218
+
219
+ let mut app = bevy:: app:: App :: new ( ) ;
220
+ app. add_systems ( Update , system_fn) ;
221
+ app. insert_resource ( Res ) ;
222
+ app. world_mut ( ) . spawn ( Comp ) ;
223
+
224
+ app. cleanup ( ) ;
225
+ app. finish ( ) ;
226
+ app. update ( ) ;
227
+ }
228
+ }
0 commit comments