Структура RawWaker

Описание

RawWaker позволяет разработчику исполнителя задач создать Waker или LocalWaker, которые предоставляют кастомное поведение пробуждения.

Состоит из указателя данных и таблицы виртуальных функций (vtable), которая настраивает поведение RawWaker.

Использование RawWaker небезопасно. Реализация трейта Wake является безопасной альтернативой, но требует выделения памяти.

Синтаксис

#![allow(unused)]
fn main() {
pub struct RawWaker { /* приватные поля */ }
}

Методы

new

#![allow(unused)]
fn main() {
pub const fn new(data: *const (), vtable: &'static RawWakerVTable) -> RawWaker
}

Создает новый RawWaker из предоставленного указателя данных и vtable.

Доступность: 1.36.0 (const: 1.36.0)

Параметры

  • data - указатель на произвольные данные, требуемые исполнителем
  • vtable - таблица виртуальных функций для настройки поведения

Безопасность

  • Указатель данных должен указывать на потокобезопасный тип (например, Arc<T: Send + Sync>) при создании Waker
  • Это ограничение снимается при создании LocalWaker, что позволяет использовать типы без Send + Sync (например, Rc<T>)
  • Vtable настраивает поведение Waker, созданного из RawWaker

Реализации трейтов

From<Arc<W>> для RawWaker

#![allow(unused)]
fn main() {
impl<W> From<Arc<W>> for RawWaker
where
    W: Wake + Send + Sync + 'static,
}

Использует пробуждаемый тип как RawWaker.

Особенности:

  • Не требует выделения памяти или атомарных операций
  • Доступно только на платформах с target_has_atomic=ptr

From<Rc<W>> для RawWaker

#![allow(unused)]
fn main() {
impl<W> From<Rc<W>> for RawWaker
where
    W: LocalWake + 'static,
}

Использует пробуждаемый тип как RawWaker.

Особенности:

  • Не требует выделения памяти или атомарных операций
  • Работает с типами, не реализующими Send + Sync

Debug

#![allow(unused)]
fn main() {
impl Debug for RawWaker
}

Позволяет форматирование RawWaker для отладки.

PartialEq

#![allow(unused)]
fn main() {
impl PartialEq for RawWaker
}

Реализует проверку на равенство для RawWaker.

Автоматические реализации трейтов

  • Freeze for RawWaker - может быть заморожен
  • RefUnwindSafe for RawWaker - безопасен для паники
  • !Send for RawWaker - не может быть передан между потоками
  • !Sync for RawWaker - не может быть разделен между потоками
  • Unpin for RawWaker - может быть безопасно перемещено
  • UnwindSafe for RawWaker - безопасен для паники

Пример использования

#![allow(unused)]
fn main() {
use std::task::RawWaker;

// Создание кастомного RawWaker
let data: *const () = ...;
let vtable: &RawWakerVTable = ...;
let raw_waker = RawWaker::new(data, vtable);
}

Назначение

RawWaker используется для:

  • Создания кастомных исполнителей задач
  • Реализации низкоуровневого поведения пробуждения
  • Интеграции с внешними системами событий

Предупреждения

  • Использование RawWaker требует небезопасного кода
  • Неправильная реализация может привести к неопределенному поведению
  • Рекомендуется использовать безопасные альтернативы (Wake, LocalWake) когда это возможно

Безопасность

При реализации RawWaker необходимо обеспечить:

  • Корректность указателя данных
  • Правильную реализацию vtable
  • Потокобезопасность при использовании с Waker
  • Корректное управление временем жизни данных