Size: a a a

2021 March 31

MS

Mikola Summer Duck in Rust Async
Alexander
Я конечно понимаю что это для примера, но имхо такой код показывать это перебор. Я про то что slept ставят сразу, а потом уже wake. Кто-нибудь возьмёт и скопирует себе :)
Нормальный код же. Матч рассчитан на то что в него зайдут только два раза.
источник

A

Alexander in Rust Async
Mikola Summer Duck
Нормальный код же. Матч рассчитан на то что в него зайдут только два раза.
Ну, кмк, никто не может запретить дёрнуть wake когда приспичит, от этого логика когда обработалось не должна ломаться. Тут просто удачно расставили
источник

A

Alexander in Rust Async
всё равно что сделать что-то: self.bufferReady = true, а потом начать его заполнять, а потом wake дёрнуть
источник

MS

Mikola Summer Duck in Rust Async
Скорее не wake, а споллят ещё раз
источник

MS

Mikola Summer Duck in Rust Async
Но тогда ведь придётся делать аркоатомик, шарить его между тредами и сетить из заспавненного треда
источник

MS

Mikola Summer Duck in Rust Async
Я имею в виду чтоб правильно сделать
источник

A

Alexander in Rust Async
Да, я понимаю , что для примера это возможно переусложнение, но так как-то не ок тоже
источник

MS

Mikola Summer Duck in Rust Async
Вейкеры вообще от лукавого. Настоящие программисты поллят все таски в цикле ✊Пулл-бейсд риактивити фор зе вин. /шутка
источник
2021 April 01

MB

Mikail Bagishov in Rust Async
Ilyas Gasanov
Я вообще правильно понимаю, что если мой тип Foo: !Unpin, и в моей программе используется Pin<&mut Foo>, то я могу натворить UB внутри drop(), даже не прибегая к unsafe { } блоку во всей программе ни разу?
Когда ты делаешь Pin::new_unchecked, помимо прочего ты обещаешь что деструктор не натворит глупостей
источник

MB

Mikail Bagishov in Rust Async
А если ты прячешь этот unchecked с помощью pin-project, то он не даст тебе напрямую делать impl Drop, только impl PinnedDrop.
источник

IG

Ilyas Gasanov in Rust Async
А, вон оно как. Что ж, умно… 🧐
источник

IG

Ilyas Gasanov in Rust Async
А как тогда с Box::pin()? Я ведь могу получить Pin<&mut T> из &mut Pin<Box<T>> без unsafe, или не?
источник

IG

Ilyas Gasanov in Rust Async
И если да, то что мешает явно реализовать ерунду без ансейфа в дропе для T в данном случае?
источник

MB

Mikail Bagishov in Rust Async
Ilyas Gasanov
А как тогда с Box::pin()? Я ведь могу получить Pin<&mut T> из &mut Pin<Box<T>> без unsafe, или не?
Если T: !Unpin, то сделать переход Pin<Box<T>> -> Pin<&mut T> не удастся
источник

IG

Ilyas Gasanov in Rust Async
А смысл в таком случае боксить !Unpin футуры, если в сигнатуре полла всё равно требуется именно Pin<&mut Self>?
источник

MB

Mikail Bagishov in Rust Async
Так, извини, я немного дезинформировал
источник

MB

Mikail Bagishov in Rust Async
Поэтому лучше просто скину немного исходников
https://doc.rust-lang.org/stable/src/alloc/boxed.rs.html#1596
источник

MB

Mikail Bagishov in Rust Async
Mikail Bagishov
Если T: !Unpin, то сделать переход Pin<Box<T>> -> Pin<&mut T> не удастся
Короче, идея такая:
перейти к Pin<&mut T> все-таки можно, через Pin::as_mut()
Но вот достать из него этот самый &mut T не удастся
источник

IG

Ilyas Gasanov in Rust Async
Да, но дроп у T всё равно его получит.
источник

IG

Ilyas Gasanov in Rust Async
И он-то может делов натворить с инвариантом.)
источник