On Fri, 20 Feb 2026 12:25:43 -0300
Daniel Almeida <[email protected]> wrote:

> >> +
> >> +    // Checks and updates the seat state based on the slot it points to
> >> +    // (if any). Returns a Seat with a value matching the slot state.
> >> +    fn check_seat(&mut self, locked_seat: &LockedSeat<T, MAX_SLOTS>) -> 
> >> Seat {
> >> +        let new_seat = match locked_seat.access(self) {
> >> +            Seat::Active(seat_info) => {
> >> +                let old_slot_idx = seat_info.slot as usize;
> >> +                let slot = &self.slots[old_slot_idx];
> >> +
> >> +                if kernel::warn_on!(
> >> +                    !matches!(slot, Slot::Active(slot_info) if 
> >> slot_info.seqno == seat_info.seqno)
> >> +                ) {
> >> +                    Seat::NoSeat
> >> +                } else {
> >> +                    Seat::Active(SeatInfo {
> >> +                        slot: seat_info.slot,
> >> +                        seqno: seat_info.seqno,
> >> +                    })
> >> +                }
> >> +            }
> >> +
> >> +            Seat::Idle(seat_info) => {
> >> +                let old_slot_idx = seat_info.slot as usize;
> >> +                let slot = &self.slots[old_slot_idx];
> >> +
> >> +                if !matches!(slot, Slot::Idle(slot_info) if 
> >> slot_info.seqno == seat_info.seqno) {
> >> +                    Seat::NoSeat
> >> +                } else {
> >> +                    Seat::Idle(SeatInfo {
> >> +                        slot: seat_info.slot,
> >> +                        seqno: seat_info.seqno,
> >> +                    })
> >> +                }
> >> +            }
> >> +
> >> +            _ => Seat::NoSeat,
> >> +        };
> >> +
> >> +        // FIXME: Annoying manual copy. The original idea was to not add 
> >> Copy+Clone to SeatInfo,
> >> +        // so that only slot.rs can change the seat state, but there 
> >> might be better solutions
> >> +        // to prevent that.  
> > 
> > Okay, I guess we want some inputs from Daniel and/or Alice on that one.  
> 
> Hm, I'd say we shouldn't implement Clone to avoid any possibility of holding 
> on
> to stale state by duplicating it.

Okay, so basically what we have now.

> 
> Why do we need to return Seat from this function? Can't we simply write
> locked_seat in place and not return anything?

We do both actually. IIRC, the reason is that LockedBy borrows &self if
we want to read the locked_seat, which prevents us from calling methods
taking a &mut ref from a `match(locked_seat.access())`.

> 
> >   
> >> +        match &new_seat {
> >> +            Seat::Active(seat_info) => {
> >> +                *locked_seat.access_mut(self) = Seat::Active(SeatInfo {
> >> +                    slot: seat_info.slot,
> >> +                    seqno: seat_info.seqno,
> >> +                })
> >> +            }
> >> +            Seat::Idle(seat_info) => {
> >> +                *locked_seat.access_mut(self) = Seat::Idle(SeatInfo {
> >> +                    slot: seat_info.slot,
> >> +                    seqno: seat_info.seqno,
> >> +                })
> >> +            }
> >> +            _ => *locked_seat.access_mut(self) = Seat::NoSeat,
> >> +        }
> >> +
> >> +        new_seat
> >> +    }
> >> +  
> 

Reply via email to