@@ -14,8 +14,6 @@ use crate::{
14
14
} ;
15
15
use heapless:: Vec ;
16
16
17
- static ID_GENERATOR : IdGenerator = IdGenerator :: new ( ) ;
18
-
19
17
#[ derive( PartialEq , Eq ) ]
20
18
struct ClusterDescriptor {
21
19
volume_idx : VolumeIdx ,
@@ -24,6 +22,14 @@ struct ClusterDescriptor {
24
22
}
25
23
26
24
impl ClusterDescriptor {
25
+ fn new ( volume_idx : VolumeIdx , cluster : Cluster , search_id : SearchId ) -> Self {
26
+ Self {
27
+ volume_idx,
28
+ cluster,
29
+ search_id,
30
+ }
31
+ }
32
+
27
33
fn compare_volume_and_cluster ( & self , volume_idx : VolumeIdx , cluster : Cluster ) -> bool {
28
34
self . volume_idx == volume_idx && self . cluster == cluster
29
35
}
42
48
{
43
49
pub ( crate ) block_device : D ,
44
50
pub ( crate ) timesource : T ,
51
+ id_generator : IdGenerator ,
45
52
open_dirs : Vec < ClusterDescriptor , MAX_DIRS > ,
46
53
open_files : Vec < ClusterDescriptor , MAX_FILES > ,
47
54
}
81
88
VolumeManager {
82
89
block_device,
83
90
timesource,
91
+ id_generator : IdGenerator :: new ( ) ,
84
92
open_dirs : Vec :: new ( ) ,
85
93
open_files : Vec :: new ( ) ,
86
94
}
@@ -186,14 +194,14 @@ where
186
194
return Err ( Error :: DirAlreadyOpen ) ;
187
195
}
188
196
189
- let search_id = ID_GENERATOR . next ( ) ;
197
+ let search_id = self . id_generator . get ( ) ;
190
198
// Remember this open directory
191
199
self . open_dirs
192
- . push ( ClusterDescriptor {
193
- volume_idx : volume. idx ,
194
- cluster : Cluster :: ROOT_DIR ,
200
+ . push ( ClusterDescriptor :: new (
201
+ volume. idx ,
202
+ Cluster :: ROOT_DIR ,
195
203
search_id,
196
- } )
204
+ ) )
197
205
. map_err ( |_| Error :: TooManyOpenDirs ) ?;
198
206
199
207
Ok ( Directory {
@@ -234,13 +242,13 @@ where
234
242
}
235
243
236
244
// Remember this open directory.
237
- let search_id = ID_GENERATOR . next ( ) ;
245
+ let search_id = self . id_generator . get ( ) ;
238
246
self . open_dirs
239
- . push ( ClusterDescriptor {
240
- volume_idx : volume. idx ,
241
- cluster : dir_entry. cluster ,
247
+ . push ( ClusterDescriptor :: new (
248
+ volume. idx ,
249
+ dir_entry. cluster ,
242
250
search_id,
243
- } )
251
+ ) )
244
252
. map_err ( |_| Error :: TooManyOpenDirs ) ?;
245
253
246
254
Ok ( Directory {
@@ -255,7 +263,7 @@ where
255
263
// Unwrap, because we should never be in a situation where we're attempting to close a dir
256
264
// with an ID which doesn't exist in our open dirs list.
257
265
let idx_to_close = cluster_position_by_id ( & self . open_dirs , dir. search_id ) . unwrap ( ) ;
258
- self . open_dirs . swap_remove ( idx_to_close) ;
266
+ self . open_dirs . remove ( idx_to_close) ;
259
267
drop ( dir) ;
260
268
}
261
269
@@ -310,7 +318,7 @@ where
310
318
}
311
319
312
320
let mode = solve_mode_variant ( mode, true ) ;
313
- let search_id = ID_GENERATOR . next ( ) ;
321
+ let search_id = self . id_generator . get ( ) ;
314
322
315
323
let file = match mode {
316
324
Mode :: ReadOnly => File {
@@ -367,11 +375,11 @@ where
367
375
368
376
// Remember this open file
369
377
self . open_files
370
- . push ( ClusterDescriptor {
371
- volume_idx : volume. idx ,
372
- cluster : file. starting_cluster ,
378
+ . push ( ClusterDescriptor :: new (
379
+ volume. idx ,
380
+ file. starting_cluster ,
373
381
search_id,
374
- } )
382
+ ) )
375
383
. map_err ( |_| Error :: TooManyOpenDirs ) ?;
376
384
377
385
Ok ( file)
@@ -421,7 +429,7 @@ where
421
429
}
422
430
} ;
423
431
424
- let search_id = ID_GENERATOR . next ( ) ;
432
+ let search_id = self . id_generator . get ( ) ;
425
433
426
434
let file = File {
427
435
starting_cluster : entry. cluster ,
@@ -435,11 +443,11 @@ where
435
443
436
444
// Remember this open file
437
445
self . open_files
438
- . push ( ClusterDescriptor {
439
- volume_idx : volume. idx ,
440
- cluster : file. starting_cluster ,
446
+ . push ( ClusterDescriptor :: new (
447
+ volume. idx ,
448
+ file. starting_cluster ,
441
449
search_id,
442
- } )
450
+ ) )
443
451
. map_err ( |_| Error :: TooManyOpenFiles ) ?;
444
452
445
453
Ok ( file)
@@ -478,8 +486,19 @@ where
478
486
}
479
487
480
488
match & volume. volume_type {
481
- VolumeType :: Fat ( fat) => fat. delete_directory_entry ( self , dir, name) ,
489
+ VolumeType :: Fat ( fat) => fat. delete_directory_entry ( self , dir, name) ? ,
482
490
}
491
+
492
+ // Unwrap, because we should never be in a situation where we're attempting to close a file
493
+ // which doesn't exist in our open files list.
494
+ let idx_to_remove = self
495
+ . open_files
496
+ . iter ( )
497
+ . position ( |d| d. compare_volume_and_cluster ( volume. idx , dir_entry. cluster ) )
498
+ . unwrap ( ) ;
499
+ self . open_files . remove ( idx_to_remove) ;
500
+
501
+ Ok ( ( ) )
483
502
}
484
503
485
504
/// Read from an open file.
@@ -643,7 +662,7 @@ where
643
662
// Unwrap, because we should never be in a situation where we're attempting to close a file
644
663
// with an ID which doesn't exist in our open files list.
645
664
let idx_to_close = cluster_position_by_id ( & self . open_files , file. search_id ) . unwrap ( ) ;
646
- self . open_files . swap_remove ( idx_to_close) ;
665
+ self . open_files . remove ( idx_to_close) ;
647
666
648
667
drop ( file) ;
649
668
Ok ( ( ) )
0 commit comments