Struct BitmapVec

Source
pub struct BitmapVec { /* private fields */ }
Expand description

Represents an owned bitmap.

Wraps underlying C bitmap API. See Bitmap for available methods.

§Examples

Basic usage

use kernel::alloc::flags::GFP_KERNEL;
use kernel::bitmap::BitmapVec;

let mut b = BitmapVec::new(16, GFP_KERNEL)?;

assert_eq!(16, b.len());
for i in 0..16 {
    if i % 4 == 0 {
      b.set_bit(i);
    }
}
assert_eq!(Some(0), b.next_bit(0));
assert_eq!(Some(1), b.next_zero_bit(0));
assert_eq!(Some(4), b.next_bit(1));
assert_eq!(Some(5), b.next_zero_bit(4));
assert_eq!(Some(12), b.last_bit());

§Invariants

  • nbits is <= i32::MAX and never changes.
  • if nbits <= bindings::BITS_PER_LONG, then repr is a usize.
  • otherwise, repr holds a non-null pointer to an initialized array of unsigned long that is large enough to hold nbits bits.

Implementations§

Source§

impl BitmapVec

Source

pub fn new(nbits: usize, flags: Flags) -> Result<Self, AllocError>

Constructs a new BitmapVec.

Fails with AllocError when the BitmapVec could not be allocated. This includes the case when nbits is greater than i32::MAX.

Source

pub fn len(&self) -> usize

Returns length of this Bitmap.

Source

pub fn fill_random(&mut self)

Fills this Bitmap with random bits.

Methods from Deref<Target = Bitmap>§

Source

pub fn as_ptr(&self) -> *const usize

Returns a raw pointer to the backing Bitmap.

Source

pub fn as_mut_ptr(&mut self) -> *mut usize

Returns a mutable raw pointer to the backing Bitmap.

Source

pub fn len(&self) -> usize

Returns length of this Bitmap.

Source

pub fn set_bit(&mut self, index: usize)

Set bit with index index.

ATTENTION: set_bit is non-atomic, which differs from the naming convention in C code. The corresponding C function is __set_bit.

If CONFIG_RUST_BITMAP_HARDENED is not enabled and index is greater than or equal to self.nbits, does nothing.

§Panics

Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and index is greater than or equal to self.nbits.

Source

pub fn set_bit_atomic(&self, index: usize)

Set bit with index index, atomically.

This is a relaxed atomic operation (no implied memory barriers).

ATTENTION: The naming convention differs from C, where the corresponding function is called set_bit.

If CONFIG_RUST_BITMAP_HARDENED is not enabled and index is greater than or equal to self.len(), does nothing.

§Panics

Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and index is greater than or equal to self.len().

Source

pub fn clear_bit(&mut self, index: usize)

Clear index bit.

ATTENTION: clear_bit is non-atomic, which differs from the naming convention in C code. The corresponding C function is __clear_bit.

If CONFIG_RUST_BITMAP_HARDENED is not enabled and index is greater than or equal to self.len(), does nothing.

§Panics

Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and index is greater than or equal to self.len().

Source

pub fn clear_bit_atomic(&self, index: usize)

Clear index bit, atomically.

This is a relaxed atomic operation (no implied memory barriers).

ATTENTION: The naming convention differs from C, where the corresponding function is called clear_bit.

If CONFIG_RUST_BITMAP_HARDENED is not enabled and index is greater than or equal to self.len(), does nothing.

§Panics

Panics if CONFIG_RUST_BITMAP_HARDENED is enabled and index is greater than or equal to self.len().

Source

pub fn copy_and_extend(&mut self, src: &Bitmap)

Copy src into this Bitmap and set any remaining bits to zero.

§Examples
use kernel::alloc::{AllocError, flags::GFP_KERNEL};
use kernel::bitmap::BitmapVec;

let mut long_bitmap = BitmapVec::new(256, GFP_KERNEL)?;

assert_eq!(None, long_bitmap.last_bit());

let mut short_bitmap = BitmapVec::new(16, GFP_KERNEL)?;

short_bitmap.set_bit(7);
long_bitmap.copy_and_extend(&short_bitmap);
assert_eq!(Some(7), long_bitmap.last_bit());
Source

pub fn last_bit(&self) -> Option<usize>

Finds last set bit.

§Examples
use kernel::alloc::{AllocError, flags::GFP_KERNEL};
use kernel::bitmap::BitmapVec;

let bitmap = BitmapVec::new(64, GFP_KERNEL)?;

match bitmap.last_bit() {
    Some(idx) => {
        pr_info!("The last bit has index {idx}.\n");
    }
    None => {
        pr_info!("All bits in this bitmap are 0.\n");
    }
}
Source

pub fn next_bit(&self, start: usize) -> Option<usize>

Finds next set bit, starting from start.

Returns None if start is greater or equal to self.nbits.

Source

pub fn next_zero_bit(&self, start: usize) -> Option<usize>

Finds next zero bit, starting from start. Returns None if start is greater than or equal to self.len().

Trait Implementations§

Source§

impl Deref for BitmapVec

Source§

type Target = Bitmap

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Bitmap

Dereferences the value.
Source§

impl DerefMut for BitmapVec

Source§

fn deref_mut(&mut self) -> &mut Bitmap

Mutably dereferences the value.
Source§

impl Drop for BitmapVec

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl Send for BitmapVec

Enable ownership transfer to other threads.

SAFETY: We own the underlying bitmap representation.

Source§

impl Sync for BitmapVec

Enable unsynchronized concurrent access to BitmapVec through shared references.

SAFETY: deref() will return a reference to a Bitmap. Its methods take immutable references are either atomic or read-only.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Init<T> for T

Source§

unsafe fn __init(self, slot: *mut T) -> Result<(), Infallible>

Initializes slot. Read more
Source§

fn chain<F>(self, f: F) -> ChainInit<Self, F, T, E>
where F: FnOnce(&mut T) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> PinInit<T> for T

Source§

unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), Infallible>

Initializes slot. Read more
Source§

fn pin_chain<F>(self, f: F) -> ChainPinInit<Self, F, T, E>
where F: FnOnce(Pin<&mut T>) -> Result<(), E>,

First initializes the value using self then calls the function f with the initialized value. Read more
Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.