pub struct UniqueFrameOwner<M: AnyFrameMeta + Repr<MetaSlotStorage> + OwnerOf> {
pub meta_own: M::Owner,
pub slot_index: usize,
}Fields§
§meta_own: M::Owner§slot_index: usizeImplementations§
Source§impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> UniqueFrameOwner<Link<M>>
impl<M: AnyFrameMeta + Repr<MetaSlotSmall>> UniqueFrameOwner<Link<M>>
Sourcepub open spec fn frame_link_inv(&self, regions: MetaRegionOwners) -> bool
pub open spec fn frame_link_inv(&self, regions: MetaRegionOwners) -> bool
{
&&& self.meta_perm_of(regions).value().metadata.prev is None
&&& self.meta_perm_of(regions).value().metadata.next is None
&&& self.meta_own.paddr == self.meta_perm_of(regions).addr()
}Source§impl<M: AnyFrameMeta + Repr<MetaSlotStorage> + OwnerOf> UniqueFrameOwner<M>
impl<M: AnyFrameMeta + Repr<MetaSlotStorage> + OwnerOf> UniqueFrameOwner<M>
Sourcepub open spec fn meta_perm_of(
self,
regions: MetaRegionOwners,
) -> PointsTo<MetaSlot, Metadata<M>>
pub open spec fn meta_perm_of( self, regions: MetaRegionOwners, ) -> PointsTo<MetaSlot, Metadata<M>>
{
PointsTo::new_spec(
regions.slots[self.slot_index],
regions.slot_owners[self.slot_index].inner_perms,
)
}The typed permission for this frame, reconstructed from the region: the
outer pointer-perm regions.slots[slot_index] paired with the inner
perms regions.slot_owners[slot_index].inner_perms. Borrow-model analog
of the owned meta_perm field; meaningful where slots.contains_key.
Sourcepub open spec fn perm_inv(self, perm: PointsTo<MetaSlot>) -> bool
pub open spec fn perm_inv(self, perm: PointsTo<MetaSlot>) -> bool
{
&&& perm.is_init()
&&& perm.addr() == meta_addr(self.slot_index)
}Sourcepub open spec fn global_inv(self, regions: MetaRegionOwners) -> bool
pub open spec fn global_inv(self, regions: MetaRegionOwners) -> bool
{
let perm = self.meta_perm_of(regions);
&&& regions.slots.contains_key(self.slot_index)
&&& regions.slot_owners.contains_key(self.slot_index)
&&& perm.is_init()
&&& perm.wf(&perm.inner_perms)
&&& perm.addr() == meta_addr(self.slot_index)
&&& perm.addr() == perm.points_to.addr()
&&& perm.value().metadata.wf(self.meta_own)
&&& regions.slot_owners[self.slot_index].self_addr == meta_addr(self.slot_index)
&&& regions.slot_owners[self.slot_index].inner_perms.ref_count.value()
== REF_COUNT_UNIQUE
&&& regions.frame_obligations.count(self.slot_index) > 0
}Borrow-model global invariant: the frame’s permission is parked in
regions.slots[slot_index] (NOT owned by the frame), and the
reconstructed meta_perm_of is well-formed and decodes to metadata
matching meta_own. A UniqueFrame is the sole live reference to its
slot, so the slot sits at REF_COUNT_UNIQUE — the unique-frame analog
of the segment’s 0 < ref_count <= REF_COUNT_MAX regime in
[SegmentOwner::relate_regions]. Being live, it also owes a pending-Drop
obligation in frame_obligations (minted at from_unused/from_raw,
consumed by drop/into_raw).
Sourcepub proof fn from_raw_owner(owner: M::Owner, index: Ghost<usize>) -> Self
pub proof fn from_raw_owner(owner: M::Owner, index: Ghost<usize>) -> Self
Sourcepub open spec fn from_unused_owner(
old_regions: MetaRegionOwners,
paddr: Paddr,
metadata: M,
res: Self,
regions: MetaRegionOwners,
) -> bool
pub open spec fn from_unused_owner( old_regions: MetaRegionOwners, paddr: Paddr, metadata: M, res: Self, regions: MetaRegionOwners, ) -> bool
{
&&& <M as OwnerOf>::wf(metadata, res.meta_own)
&&& res.slot_index == frame_to_index(paddr)
&&& res.meta_perm_of(regions).addr() == frame_to_meta(paddr)
&&& res.meta_perm_of(regions).value().metadata == metadata
&&& regions.slots == old_regions.slots
&&& regions.slot_owners[frame_to_index(paddr)].inner_perms
== old_regions.slot_owners[frame_to_index(paddr)].inner_perms
&&& regions.slot_owners[frame_to_index(paddr)].usage
== old_regions.slot_owners[frame_to_index(paddr)].usage
&&& regions.slot_owners[frame_to_index(paddr)].paths_in_pt
== old_regions.slot_owners[frame_to_index(paddr)].paths_in_pt
&&& forall |i: usize| {
i != frame_to_index(paddr)
==> regions.slot_owners[i] == old_regions.slot_owners[i]
}
&&& regions.frame_obligations == old_regions.frame_obligations
&&& regions.inv()
}Sourcepub proof fn tracked_from_unused_owner(tracked
regions: &mut MetaRegionOwners,
paddr: Paddr,
) -> tracked res : Self
pub proof fn tracked_from_unused_owner(tracked regions: &mut MetaRegionOwners, paddr: Paddr, ) -> tracked res : Self
Self::from_unused_owner(
*old(regions),
paddr,
res.meta_perm_of(*final(regions)).value().metadata,
res,
*final(regions),
),