1
1
//! Static configuration mechanism for the kernel
2
- use core:: marker:: PhantomData ;
3
-
4
2
use r3_core:: { kernel:: Hunk , utils:: ConstAllocator } ;
5
3
6
4
use crate :: {
@@ -110,7 +108,7 @@ macro_rules! build {
110
108
cfg. finish_phase3_interrupt( ) ;
111
109
let phase3_data = cfg. finish_phase3( ) ;
112
110
113
- ( my_cfg. into_inner ( ) , id_map, phase3_data)
111
+ ( my_cfg. into_middle ( ) , id_map, phase3_data)
114
112
}
115
113
116
114
const CFG_OUTPUT : (
@@ -310,29 +308,23 @@ macro_rules! array_item_from_fn {
310
308
311
309
/// A kernel configuration being constructed.
312
310
pub struct CfgBuilder < Traits : KernelTraits > {
313
- /// Disallows the mutation of `CfgBuilderInner` by a user-defined
314
- /// configuration function by making this not `pub`.
315
- inner : CfgBuilderInner < Traits > ,
316
- }
317
-
318
- // TODO: It's not needed anymore; move the whole contents into `CfgBuilder`
319
- #[ doc( hidden) ]
320
- pub ( crate ) struct CfgBuilderInner < Traits : KernelTraits > {
321
- _phantom : PhantomData < Traits > ,
322
- pub hunk_pool_len : usize ,
323
- pub hunk_pool_align : usize ,
324
- pub tasks : ComptimeVec < CfgBuilderTask < Traits > > ,
325
- pub num_task_priority_levels : usize ,
326
- pub interrupt_lines : ComptimeVec < CfgBuilderInterruptLine > ,
327
- pub startup_hook : Option < fn ( ) > ,
328
- pub event_groups : ComptimeVec < CfgBuilderEventGroup > ,
329
- pub mutexes : ComptimeVec < CfgBuilderMutex > ,
330
- pub semaphores : ComptimeVec < CfgBuilderSemaphore > ,
331
- pub timers : ComptimeVec < CfgBuilderTimer > ,
311
+ hunk_pool_len : usize ,
312
+ hunk_pool_align : usize ,
313
+ tasks : ComptimeVec < CfgBuilderTask < Traits > > ,
314
+ num_task_priority_levels : usize ,
315
+ interrupt_lines : ComptimeVec < CfgBuilderInterruptLine > ,
316
+ startup_hook : Option < fn ( ) > ,
317
+ event_groups : ComptimeVec < CfgBuilderEventGroup > ,
318
+ mutexes : ComptimeVec < CfgBuilderMutex > ,
319
+ semaphores : ComptimeVec < CfgBuilderSemaphore > ,
320
+ timers : ComptimeVec < CfgBuilderTimer > ,
332
321
}
333
322
334
- /// The private portion of [`CfgBuilder`]. This is not a real public interface,
335
- /// but needs to be `pub` so [`build!`] can access the contents.
323
+ /// The product of a [`CfgBuilder`]. [`build!`] will use it to define static
324
+ /// items and associate them with `Traits`.
325
+ ///
326
+ /// This is not a real public interface, but needs to be `pub` so [`build!`] can
327
+ /// access the contents.
336
328
// FIXME: Not anymore
337
329
#[ doc( hidden) ]
338
330
pub struct MiddleCfg < Traits : KernelTraits > {
@@ -361,37 +353,33 @@ impl<Traits: KernelTraits> CfgBuilder<Traits> {
361
353
#[ doc( hidden) ]
362
354
pub const unsafe fn new ( allocator : & ConstAllocator ) -> Self {
363
355
Self {
364
- inner : CfgBuilderInner {
365
- _phantom : PhantomData ,
366
- hunk_pool_len : 0 ,
367
- hunk_pool_align : 1 ,
368
- tasks : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
369
- num_task_priority_levels : 4 ,
370
- interrupt_lines : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
371
- startup_hook : None ,
372
- event_groups : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
373
- mutexes : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
374
- semaphores : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
375
- timers : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
376
- } ,
356
+ hunk_pool_len : 0 ,
357
+ hunk_pool_align : 1 ,
358
+ tasks : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
359
+ num_task_priority_levels : 4 ,
360
+ interrupt_lines : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
361
+ startup_hook : None ,
362
+ event_groups : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
363
+ mutexes : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
364
+ semaphores : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
365
+ timers : ComptimeVec :: new_in ( allocator. clone ( ) ) ,
377
366
}
378
367
}
379
368
380
369
/// Get `MiddleCfg`, consuming `self`.
381
370
#[ doc( hidden) ]
382
- pub const fn into_inner ( self ) -> MiddleCfg < Traits > {
383
- let inner = self . inner ;
371
+ pub const fn into_middle ( self ) -> MiddleCfg < Traits > {
384
372
MiddleCfg {
385
- hunk_pool_len : inner . hunk_pool_len ,
386
- hunk_pool_align : inner . hunk_pool_align ,
387
- tasks : Frozen :: leak_slice ( & inner . tasks ) ,
388
- num_task_priority_levels : inner . num_task_priority_levels ,
389
- interrupt_lines : Frozen :: leak_slice ( & inner . interrupt_lines ) ,
390
- startup_hook : inner . startup_hook ,
391
- event_groups : Frozen :: leak_slice ( & inner . event_groups ) ,
392
- mutexes : Frozen :: leak_slice ( & inner . mutexes ) ,
393
- semaphores : Frozen :: leak_slice ( & inner . semaphores ) ,
394
- timers : Frozen :: leak_slice ( & inner . timers ) ,
373
+ hunk_pool_len : self . hunk_pool_len ,
374
+ hunk_pool_align : self . hunk_pool_align ,
375
+ tasks : Frozen :: leak_slice ( & self . tasks ) ,
376
+ num_task_priority_levels : self . num_task_priority_levels ,
377
+ interrupt_lines : Frozen :: leak_slice ( & self . interrupt_lines ) ,
378
+ startup_hook : self . startup_hook ,
379
+ event_groups : Frozen :: leak_slice ( & self . event_groups ) ,
380
+ mutexes : Frozen :: leak_slice ( & self . mutexes ) ,
381
+ semaphores : Frozen :: leak_slice ( & self . semaphores ) ,
382
+ timers : Frozen :: leak_slice ( & self . timers ) ,
395
383
}
396
384
}
397
385
@@ -400,7 +388,7 @@ impl<Traits: KernelTraits> CfgBuilder<Traits> {
400
388
pub const fn finalize_in_cfg ( cfg : & mut r3_core:: kernel:: Cfg < Self > ) {
401
389
// Create hunks for task stacks.
402
390
let mut i = 0 ;
403
- let mut tasks = & mut cfg. raw ( ) . inner . tasks ;
391
+ let mut tasks = & mut cfg. raw ( ) . tasks ;
404
392
while i < tasks. len ( ) {
405
393
if let Some ( size) = tasks[ i] . stack . auto_size ( ) {
406
394
// Round up the stack size
@@ -414,7 +402,7 @@ impl<Traits: KernelTraits> CfgBuilder<Traits> {
414
402
415
403
// Borrow again `tasks`, which was unborrowed because of the
416
404
// call to `HunkDefiner::finish`
417
- tasks = & mut cfg. raw ( ) . inner . tasks ;
405
+ tasks = & mut cfg. raw ( ) . tasks ;
418
406
419
407
tasks[ i] . stack = crate :: task:: StackHunk :: from_hunk ( hunk, size) ;
420
408
}
@@ -441,14 +429,14 @@ unsafe impl<Traits: KernelTraits> const r3_core::kernel::raw_cfg::CfgBase for Cf
441
429
unreachable ! ( ) ;
442
430
}
443
431
444
- self . inner . num_task_priority_levels = new_value;
432
+ self . num_task_priority_levels = new_value;
445
433
}
446
434
447
435
fn startup_hook_define ( & mut self , func : fn ( ) ) {
448
436
assert ! (
449
- self . inner . startup_hook. is_none( ) ,
437
+ self . startup_hook. is_none( ) ,
450
438
"only one combined startup hook can be registered"
451
439
) ;
452
- self . inner . startup_hook = Some ( func) ;
440
+ self . startup_hook = Some ( func) ;
453
441
}
454
442
}
0 commit comments