Skip to content

Commit a6cfdea

Browse files
committed
refactor(kernel): dissolve CfgBuilderInner
1 parent 0b15000 commit a6cfdea

File tree

7 files changed

+53
-75
lines changed

7 files changed

+53
-75
lines changed

src/r3_kernel/src/cfg.rs

Lines changed: 42 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
//! Static configuration mechanism for the kernel
2-
use core::marker::PhantomData;
3-
42
use r3_core::{kernel::Hunk, utils::ConstAllocator};
53

64
use crate::{
@@ -110,7 +108,7 @@ macro_rules! build {
110108
cfg.finish_phase3_interrupt();
111109
let phase3_data = cfg.finish_phase3();
112110

113-
(my_cfg.into_inner(), id_map, phase3_data)
111+
(my_cfg.into_middle(), id_map, phase3_data)
114112
}
115113

116114
const CFG_OUTPUT: (
@@ -310,29 +308,23 @@ macro_rules! array_item_from_fn {
310308

311309
/// A kernel configuration being constructed.
312310
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>,
332321
}
333322

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.
336328
// FIXME: Not anymore
337329
#[doc(hidden)]
338330
pub struct MiddleCfg<Traits: KernelTraits> {
@@ -361,37 +353,33 @@ impl<Traits: KernelTraits> CfgBuilder<Traits> {
361353
#[doc(hidden)]
362354
pub const unsafe fn new(allocator: &ConstAllocator) -> Self {
363355
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()),
377366
}
378367
}
379368

380369
/// Get `MiddleCfg`, consuming `self`.
381370
#[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> {
384372
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),
395383
}
396384
}
397385

@@ -400,7 +388,7 @@ impl<Traits: KernelTraits> CfgBuilder<Traits> {
400388
pub const fn finalize_in_cfg(cfg: &mut r3_core::kernel::Cfg<Self>) {
401389
// Create hunks for task stacks.
402390
let mut i = 0;
403-
let mut tasks = &mut cfg.raw().inner.tasks;
391+
let mut tasks = &mut cfg.raw().tasks;
404392
while i < tasks.len() {
405393
if let Some(size) = tasks[i].stack.auto_size() {
406394
// Round up the stack size
@@ -414,7 +402,7 @@ impl<Traits: KernelTraits> CfgBuilder<Traits> {
414402

415403
// Borrow again `tasks`, which was unborrowed because of the
416404
// call to `HunkDefiner::finish`
417-
tasks = &mut cfg.raw().inner.tasks;
405+
tasks = &mut cfg.raw().tasks;
418406

419407
tasks[i].stack = crate::task::StackHunk::from_hunk(hunk, size);
420408
}
@@ -441,14 +429,14 @@ unsafe impl<Traits: KernelTraits> const r3_core::kernel::raw_cfg::CfgBase for Cf
441429
unreachable!();
442430
}
443431

444-
self.inner.num_task_priority_levels = new_value;
432+
self.num_task_priority_levels = new_value;
445433
}
446434

447435
fn startup_hook_define(&mut self, func: fn()) {
448436
assert!(
449-
self.inner.startup_hook.is_none(),
437+
self.startup_hook.is_none(),
450438
"only one combined startup hook can be registered"
451439
);
452-
self.inner.startup_hook = Some(func);
440+
self.startup_hook = Some(func);
453441
}
454442
}

src/r3_kernel/src/cfg/event_group.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@ unsafe impl<Traits: KernelTraits> const CfgEventGroup for CfgBuilder<Traits> {
1616
}: EventGroupDescriptor<Self::System>,
1717
_properties: Properties,
1818
) -> event_group::EventGroupId {
19-
let inner = &mut self.inner;
20-
21-
inner.event_groups.push(CfgBuilderEventGroup {
19+
self.event_groups.push(CfgBuilderEventGroup {
2220
initial_bits,
2321
queue_order: wait::QueueOrder::from(queue_order),
2422
});
2523

26-
unsafe { NonZeroUsize::new_unchecked(inner.event_groups.len()) }
24+
unsafe { NonZeroUsize::new_unchecked(self.event_groups.len()) }
2725
}
2826
}
2927

src/r3_kernel/src/cfg/interrupt.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ unsafe impl<Traits: KernelTraits> const CfgInterruptLine for CfgBuilder<Traits>
1717
}: InterruptLineDescriptor<Self::System>,
1818
_properties: Properties,
1919
) {
20-
self.inner.interrupt_lines.push(CfgBuilderInterruptLine {
20+
self.interrupt_lines.push(CfgBuilderInterruptLine {
2121
line,
2222
priority,
2323
start,

src/r3_kernel/src/cfg/mutex.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,9 @@ unsafe impl<Traits: KernelTraits> const CfgMutex for CfgBuilder<Traits> {
1515
}: MutexDescriptor<Self::System>,
1616
_properties: Properties,
1717
) -> mutex::MutexId {
18-
let inner = &mut self.inner;
18+
self.mutexes.push(CfgBuilderMutex { protocol });
1919

20-
inner.mutexes.push(CfgBuilderMutex { protocol });
21-
22-
unsafe { NonZeroUsize::new_unchecked(inner.mutexes.len()) }
20+
unsafe { NonZeroUsize::new_unchecked(self.mutexes.len()) }
2321
}
2422
}
2523

src/r3_kernel/src/cfg/semaphore.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,18 @@ unsafe impl<Traits: KernelTraits> const CfgSemaphore for CfgBuilder<Traits> {
1717
}: SemaphoreDescriptor<Self::System>,
1818
_properties: Properties,
1919
) -> semaphore::SemaphoreId {
20-
let inner = &mut self.inner;
21-
2220
assert!(
2321
initial <= maximum,
2422
"`initial` must be less than or equal to `maximum`"
2523
);
2624

27-
inner.semaphores.push(CfgBuilderSemaphore {
25+
self.semaphores.push(CfgBuilderSemaphore {
2826
initial,
2927
maximum,
3028
queue_order: wait::QueueOrder::from(queue_order),
3129
});
3230

33-
unsafe { NonZeroUsize::new_unchecked(inner.semaphores.len()) }
31+
unsafe { NonZeroUsize::new_unchecked(self.semaphores.len()) }
3432
}
3533
}
3634

src/r3_kernel/src/cfg/task.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,15 @@ unsafe impl<Traits: KernelTraits> const CfgTask for CfgBuilder<Traits> {
4141
stack = task::StackHunk::from_hunk(hunk.hunk(), stack_size);
4242
}
4343

44-
let inner = &mut self.inner;
45-
46-
inner.tasks.push(CfgBuilderTask {
44+
self.tasks.push(CfgBuilderTask {
4745
start,
4846
param,
4947
stack,
5048
priority,
5149
active,
5250
});
5351

54-
unsafe { NonZeroUsize::new_unchecked(inner.tasks.len()) }
52+
unsafe { NonZeroUsize::new_unchecked(self.tasks.len()) }
5553
}
5654
}
5755

src/r3_kernel/src/cfg/timer.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ unsafe impl<Traits: KernelTraits> const CfgTimer for CfgBuilder<Traits> {
1919
}: TimerDescriptor<Self::System>,
2020
_properties: Properties,
2121
) -> timer::TimerId {
22-
let inner = &mut self.inner;
23-
2422
let period = if let Some(period) = period {
2523
// FIXME: Work-around for `Result::expect` being not `const fn`
2624
if let Ok(x) = timeout::time32_from_duration(period) {
@@ -45,15 +43,15 @@ unsafe impl<Traits: KernelTraits> const CfgTimer for CfgBuilder<Traits> {
4543
timeout::BAD_DURATION32
4644
};
4745

48-
inner.timers.push(CfgBuilderTimer {
46+
self.timers.push(CfgBuilderTimer {
4947
start,
5048
param,
5149
delay,
5250
period,
5351
active,
5452
});
5553

56-
unsafe { NonZeroUsize::new_unchecked(inner.timers.len()) }
54+
unsafe { NonZeroUsize::new_unchecked(self.timers.len()) }
5755
}
5856
}
5957

0 commit comments

Comments
 (0)