Struct GenericGlobal

Source
pub struct GenericGlobal(/* private fields */);
Expand description
use once_cell::sync::OnceCell;
use generic_global_variables::*;

use std::thread::spawn;
use std::sync::Mutex;

fn get_buffer<T: Send + Sync>(f: impl FnOnce() -> T) -> Entry<T> {
    static GLOBALS: OnceCell<GenericGlobal> = OnceCell::new();

    let globals = GLOBALS.get_or_init(GenericGlobal::new);
    globals.get_or_init(f)
}

let handles1: Vec<_> = (0..24).map(|_| {
    spawn(|| {
        let arc = get_buffer(Mutex::<Vec::<Box<[u8]>>>::default);
        let buffer = arc.lock()
            .unwrap()
            .pop()
            .unwrap_or_else(|| vec![0 as u8; 20].into_boxed_slice());
        // Read some data into buffer and process it
        // ...

        arc.lock().unwrap().push(buffer);
    })
}).collect();

let handles2: Vec<_> = (0..50).map(|_| {
    spawn(|| {
        let arc = get_buffer(Mutex::<Vec::<Box<[u32]>>>::default);
        let buffer = arc.lock()
            .unwrap()
            .pop()
            .unwrap_or_else(|| vec![1 as u32; 20].into_boxed_slice());
        // Read some data into buffer and process it
        // ...

        arc.lock().unwrap().push(buffer);
    })
}).collect();

for handle in handles1 {
    handle.join();
}

for handle in handles2 {
    handle.join();
}

Implementations§

Source§

impl GenericGlobal

Source

pub fn new() -> Self

Source

pub fn get_or_init<T: 'static + Send + Sync>( &self, f: impl FnOnce() -> T, ) -> Entry<T>

Trait Implementations§

Source§

impl Debug for GenericGlobal

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for GenericGlobal

Source§

fn default() -> GenericGlobal

Returns the “default value” for a type. Read more
Source§

impl Send for GenericGlobal

Source§

impl Sync for GenericGlobal

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, 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, 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.