Skip to content

Commit 1b9f83e

Browse files
taiki-ecramertj
authored andcommitted
Use 'self: Pin<&mut Self>' on AsyncRead/AsyncWrite
1 parent c949076 commit 1b9f83e

File tree

15 files changed

+160
-128
lines changed

15 files changed

+160
-128
lines changed

futures-io/src/lib.rs

Lines changed: 60 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ mod if_std {
1818
use std::boxed::Box;
1919
use std::cmp;
2020
use std::io as StdIo;
21+
use std::pin::Pin;
2122
use std::ptr;
2223

2324
// Re-export IoVec for convenience
@@ -108,7 +109,7 @@ mod if_std {
108109
/// `Interrupted`. Implementations must convert `WouldBlock` into
109110
/// `Async::Pending` and either internally retry or convert
110111
/// `Interrupted` into another error kind.
111-
fn poll_read(&mut self, waker: &Waker, buf: &mut [u8])
112+
fn poll_read(self: Pin<&mut Self>, waker: &Waker, buf: &mut [u8])
112113
-> Poll<Result<usize>>;
113114

114115
/// Attempt to read from the `AsyncRead` into `vec` using vectored
@@ -133,7 +134,7 @@ mod if_std {
133134
/// `Interrupted`. Implementations must convert `WouldBlock` into
134135
/// `Async::Pending` and either internally retry or convert
135136
/// `Interrupted` into another error kind.
136-
fn poll_vectored_read(&mut self, waker: &Waker, vec: &mut [&mut IoVec])
137+
fn poll_vectored_read(self: Pin<&mut Self>, waker: &Waker, vec: &mut [&mut IoVec])
137138
-> Poll<Result<usize>>
138139
{
139140
if let Some(ref mut first_iovec) = vec.get_mut(0) {
@@ -168,7 +169,7 @@ mod if_std {
168169
/// `Interrupted`. Implementations must convert `WouldBlock` into
169170
/// `Async::Pending` and either internally retry or convert
170171
/// `Interrupted` into another error kind.
171-
fn poll_write(&mut self, waker: &Waker, buf: &[u8])
172+
fn poll_write(self: Pin<&mut Self>, waker: &Waker, buf: &[u8])
172173
-> Poll<Result<usize>>;
173174

174175
/// Attempt to write bytes from `vec` into the object using vectored
@@ -194,7 +195,7 @@ mod if_std {
194195
/// `Interrupted`. Implementations must convert `WouldBlock` into
195196
/// `Async::Pending` and either internally retry or convert
196197
/// `Interrupted` into another error kind.
197-
fn poll_vectored_write(&mut self, waker: &Waker, vec: &[&IoVec])
198+
fn poll_vectored_write(self: Pin<&mut Self>, waker: &Waker, vec: &[&IoVec])
198199
-> Poll<Result<usize>>
199200
{
200201
if let Some(ref first_iovec) = vec.get(0) {
@@ -221,7 +222,7 @@ mod if_std {
221222
/// `Interrupted`. Implementations must convert `WouldBlock` into
222223
/// `Async::Pending` and either internally retry or convert
223224
/// `Interrupted` into another error kind.
224-
fn poll_flush(&mut self, waker: &Waker) -> Poll<Result<()>>;
225+
fn poll_flush(self: Pin<&mut Self>, waker: &Waker) -> Poll<Result<()>>;
225226

226227
/// Attempt to close the object.
227228
///
@@ -238,7 +239,7 @@ mod if_std {
238239
/// `Interrupted`. Implementations must convert `WouldBlock` into
239240
/// `Async::Pending` and either internally retry or convert
240241
/// `Interrupted` into another error kind.
241-
fn poll_close(&mut self, waker: &Waker) -> Poll<Result<()>>;
242+
fn poll_close(self: Pin<&mut Self>, waker: &Waker) -> Poll<Result<()>>;
242243
}
243244

244245
macro_rules! deref_async_read {
@@ -247,25 +248,25 @@ mod if_std {
247248
(**self).initializer()
248249
}
249250

250-
fn poll_read(&mut self, waker: &Waker, buf: &mut [u8])
251+
fn poll_read(mut self: Pin<&mut Self>, waker: &Waker, buf: &mut [u8])
251252
-> Poll<Result<usize>>
252253
{
253-
(**self).poll_read(waker, buf)
254+
Pin::new(&mut **self).poll_read(waker, buf)
254255
}
255256

256-
fn poll_vectored_read(&mut self, waker: &Waker, vec: &mut [&mut IoVec])
257+
fn poll_vectored_read(mut self: Pin<&mut Self>, waker: &Waker, vec: &mut [&mut IoVec])
257258
-> Poll<Result<usize>>
258259
{
259-
(**self).poll_vectored_read(waker, vec)
260+
Pin::new(&mut **self).poll_vectored_read(waker, vec)
260261
}
261262
}
262263
}
263264

264-
impl<T: ?Sized + AsyncRead> AsyncRead for Box<T> {
265+
impl<T: ?Sized + AsyncRead + Unpin> AsyncRead for Box<T> {
265266
deref_async_read!();
266267
}
267268

268-
impl<'a, T: ?Sized + AsyncRead> AsyncRead for &'a mut T {
269+
impl<'a, T: ?Sized + AsyncRead + Unpin> AsyncRead for &'a mut T {
269270
deref_async_read!();
270271
}
271272

@@ -277,10 +278,10 @@ mod if_std {
277278
Initializer::nop()
278279
}
279280

280-
fn poll_read(&mut self, _: &Waker, buf: &mut [u8])
281+
fn poll_read(mut self: Pin<&mut Self>, _: &Waker, buf: &mut [u8])
281282
-> Poll<Result<usize>>
282283
{
283-
Poll::Ready(StdIo::Read::read(self, buf))
284+
Poll::Ready(StdIo::Read::read(&mut *self, buf))
284285
}
285286
}
286287
}
@@ -293,83 +294,105 @@ mod if_std {
293294
unsafe_delegate_async_read_to_stdio!();
294295
}
295296

296-
impl<T: AsRef<[u8]>> AsyncRead for StdIo::Cursor<T> {
297+
impl<T: AsRef<[u8]> + Unpin> AsyncRead for StdIo::Cursor<T> {
297298
unsafe_delegate_async_read_to_stdio!();
298299
}
299300

300301
macro_rules! deref_async_write {
301302
() => {
302-
fn poll_write(&mut self, waker: &Waker, buf: &[u8])
303+
fn poll_write(mut self: Pin<&mut Self>, waker: &Waker, buf: &[u8])
303304
-> Poll<Result<usize>>
304305
{
305-
(**self).poll_write(waker, buf)
306+
Pin::new(&mut **self).poll_write(waker, buf)
306307
}
307308

308-
fn poll_vectored_write(&mut self, waker: &Waker, vec: &[&IoVec])
309+
fn poll_vectored_write(mut self: Pin<&mut Self>, waker: &Waker, vec: &[&IoVec])
309310
-> Poll<Result<usize>>
310311
{
311-
(**self).poll_vectored_write(waker, vec)
312+
Pin::new(&mut **self).poll_vectored_write(waker, vec)
312313
}
313314

314-
fn poll_flush(&mut self, waker: &Waker) -> Poll<Result<()>> {
315-
(**self).poll_flush(waker)
315+
fn poll_flush(mut self: Pin<&mut Self>, waker: &Waker) -> Poll<Result<()>> {
316+
Pin::new(&mut **self).poll_flush(waker)
316317
}
317318

318-
fn poll_close(&mut self, waker: &Waker) -> Poll<Result<()>> {
319-
(**self).poll_close(waker)
319+
fn poll_close(mut self: Pin<&mut Self>, waker: &Waker) -> Poll<Result<()>> {
320+
Pin::new(&mut **self).poll_close(waker)
320321
}
321322
}
322323
}
323324

324-
impl<T: ?Sized + AsyncWrite> AsyncWrite for Box<T> {
325+
impl<T: ?Sized + AsyncWrite + Unpin> AsyncWrite for Box<T> {
325326
deref_async_write!();
326327
}
327328

328-
impl<'a, T: ?Sized + AsyncWrite> AsyncWrite for &'a mut T {
329+
impl<'a, T: ?Sized + AsyncWrite + Unpin> AsyncWrite for &'a mut T {
329330
deref_async_write!();
330331
}
331332

333+
impl<'a, T: ?Sized + AsyncWrite> AsyncWrite for Pin<&'a mut T> {
334+
fn poll_write(mut self: Pin<&mut Self>, waker: &Waker, buf: &[u8])
335+
-> Poll<Result<usize>>
336+
{
337+
T::poll_write((*self).as_mut(), waker, buf)
338+
}
339+
340+
fn poll_vectored_write(mut self: Pin<&mut Self>, waker: &Waker, vec: &[&IoVec])
341+
-> Poll<Result<usize>>
342+
{
343+
T::poll_vectored_write((*self).as_mut(), waker, vec)
344+
}
345+
346+
fn poll_flush(mut self: Pin<&mut Self>, waker: &Waker) -> Poll<Result<()>> {
347+
T::poll_flush((*self).as_mut(), waker)
348+
}
349+
350+
fn poll_close(mut self: Pin<&mut Self>, waker: &Waker) -> Poll<Result<()>> {
351+
T::poll_close((*self).as_mut(), waker)
352+
}
353+
}
354+
332355
macro_rules! delegate_async_write_to_stdio {
333356
() => {
334-
fn poll_write(&mut self, _: &Waker, buf: &[u8])
357+
fn poll_write(mut self: Pin<&mut Self>, _: &Waker, buf: &[u8])
335358
-> Poll<Result<usize>>
336359
{
337-
Poll::Ready(StdIo::Write::write(self, buf))
360+
Poll::Ready(StdIo::Write::write(&mut *self, buf))
338361
}
339362

340-
fn poll_flush(&mut self, _: &Waker) -> Poll<Result<()>> {
341-
Poll::Ready(StdIo::Write::flush(self))
363+
fn poll_flush(mut self: Pin<&mut Self>, _: &Waker) -> Poll<Result<()>> {
364+
Poll::Ready(StdIo::Write::flush(&mut *self))
342365
}
343366

344-
fn poll_close(&mut self, waker: &Waker) -> Poll<Result<()>> {
367+
fn poll_close(self: Pin<&mut Self>, waker: &Waker) -> Poll<Result<()>> {
345368
self.poll_flush(waker)
346369
}
347370
}
348371
}
349372

350-
impl<T: AsMut<[u8]>> AsyncWrite for StdIo::Cursor<T> {
373+
impl<T: AsMut<[u8]> + Unpin> AsyncWrite for StdIo::Cursor<T> {
351374
fn poll_write(
352-
&mut self,
375+
mut self: Pin<&mut Self>,
353376
_: &Waker,
354377
buf: &[u8],
355378
) -> Poll<Result<usize>> {
356379
let position = self.position();
357380
let result = {
358-
let out = self.get_mut().as_mut();
381+
let out = (&mut *self).get_mut().as_mut();
359382
let pos = cmp::min(out.len() as u64, position) as usize;
360383
StdIo::Write::write(&mut &mut out[pos..], buf)
361384
};
362385
if let Ok(offset) = result {
363-
self.set_position(position + offset as u64);
386+
self.get_mut().set_position(position + offset as u64);
364387
}
365388
Poll::Ready(result)
366389
}
367390

368-
fn poll_flush(&mut self, _: &Waker) -> Poll<Result<()>> {
369-
Poll::Ready(StdIo::Write::flush(&mut self.get_mut().as_mut()))
391+
fn poll_flush(self: Pin<&mut Self>, _: &Waker) -> Poll<Result<()>> {
392+
Poll::Ready(StdIo::Write::flush(&mut self.get_mut().get_mut().as_mut()))
370393
}
371394

372-
fn poll_close(&mut self, waker: &Waker) -> Poll<Result<()>> {
395+
fn poll_close(self: Pin<&mut Self>, waker: &Waker) -> Poll<Result<()>> {
373396
self.poll_flush(waker)
374397
}
375398
}

futures-io/tests/cursor.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@ use futures::Poll;
55
use futures::future::lazy;
66
use futures::io::AsyncWrite;
77
use std::io::Cursor;
8+
use std::pin::Pin;
89

910
#[test]
1011
fn cursor_asyncwrite_asmut() {
1112
let mut cursor = Cursor::new([0; 5]);
1213
futures::executor::block_on(lazy(|ctx| {
13-
assert_matches!(cursor.poll_write(ctx, &[1, 2]), Poll::Ready(Ok(2)));
14-
assert_matches!(cursor.poll_write(ctx, &[3, 4]), Poll::Ready(Ok(2)));
15-
assert_matches!(cursor.poll_write(ctx, &[5, 6]), Poll::Ready(Ok(1)));
16-
assert_matches!(cursor.poll_write(ctx, &[6, 7]), Poll::Ready(Ok(0)));
14+
assert_matches!(Pin::new(&mut cursor).poll_write(ctx, &[1, 2]), Poll::Ready(Ok(2)));
15+
assert_matches!(Pin::new(&mut cursor).poll_write(ctx, &[3, 4]), Poll::Ready(Ok(2)));
16+
assert_matches!(Pin::new(&mut cursor).poll_write(ctx, &[5, 6]), Poll::Ready(Ok(1)));
17+
assert_matches!(Pin::new(&mut cursor).poll_write(ctx, &[6, 7]), Poll::Ready(Ok(0)));
1718
}));
1819
assert_eq!(cursor.into_inner(), [1, 2, 3, 4, 5]);
1920
}

futures-util/src/compat/compat01as03.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ where
201201
mut self: Pin<&mut Self>,
202202
waker: &Waker,
203203
) -> task03::Poll<Option<Self::Item>> {
204-
match self.in_notify(waker, |f| f.poll()) {
204+
match self.in_notify(waker, Stream01::poll) {
205205
Ok(Async01::Ready(Some(t))) => task03::Poll::Ready(Some(Ok(t))),
206206
Ok(Async01::Ready(None)) => task03::Poll::Ready(None),
207207
Ok(Async01::NotReady) => task03::Poll::Pending,
@@ -409,27 +409,27 @@ mod io {
409409
}
410410
}
411411

412-
fn poll_read(&mut self, waker: &task03::Waker, buf: &mut [u8])
412+
fn poll_read(mut self: Pin<&mut Self>, waker: &task03::Waker, buf: &mut [u8])
413413
-> task03::Poll<Result<usize, Error>>
414414
{
415415
poll_01_to_03(self.in_notify(waker, |x| x.poll_read(buf)))
416416
}
417417
}
418418

419419
impl<W: AsyncWrite01> AsyncWrite03 for Compat01As03<W> {
420-
fn poll_write(&mut self, waker: &task03::Waker, buf: &[u8])
420+
fn poll_write(mut self: Pin<&mut Self>, waker: &task03::Waker, buf: &[u8])
421421
-> task03::Poll<Result<usize, Error>>
422422
{
423423
poll_01_to_03(self.in_notify(waker, |x| x.poll_write(buf)))
424424
}
425425

426-
fn poll_flush(&mut self, waker: &task03::Waker)
426+
fn poll_flush(mut self: Pin<&mut Self>, waker: &task03::Waker)
427427
-> task03::Poll<Result<(), Error>>
428428
{
429429
poll_01_to_03(self.in_notify(waker, AsyncWrite01::poll_flush))
430430
}
431431

432-
fn poll_close(&mut self, waker: &task03::Waker)
432+
fn poll_close(mut self: Pin<&mut Self>, waker: &task03::Waker)
433433
-> task03::Poll<Result<(), Error>>
434434
{
435435
poll_01_to_03(self.in_notify(waker, AsyncWrite01::shutdown))

futures-util/src/compat/compat03as01.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,15 @@ mod io {
188188
}
189189
}
190190

191-
impl<R: AsyncRead03> std::io::Read for Compat<R> {
191+
impl<R: AsyncRead03 + Unpin> std::io::Read for Compat<R> {
192192
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
193193
let current = Current::new();
194194
let waker = current.as_waker();
195-
poll_03_to_io(self.inner.poll_read(&waker, buf))
195+
poll_03_to_io(Pin::new(&mut self.inner).poll_read(&waker, buf))
196196
}
197197
}
198198

199-
impl<R: AsyncRead03> AsyncRead01 for Compat<R> {
199+
impl<R: AsyncRead03 + Unpin> AsyncRead01 for Compat<R> {
200200
unsafe fn prepare_uninitialized_buffer(&self, buf: &mut [u8]) -> bool {
201201
let initializer = self.inner.initializer();
202202
let does_init = initializer.should_initialize();
@@ -207,25 +207,25 @@ mod io {
207207
}
208208
}
209209

210-
impl<W: AsyncWrite03> std::io::Write for Compat<W> {
210+
impl<W: AsyncWrite03 + Unpin> std::io::Write for Compat<W> {
211211
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
212212
let current = Current::new();
213213
let waker = current.as_waker();
214-
poll_03_to_io(self.inner.poll_write(&waker, buf))
214+
poll_03_to_io(Pin::new(&mut self.inner).poll_write(&waker, buf))
215215
}
216216

217217
fn flush(&mut self) -> std::io::Result<()> {
218218
let current = Current::new();
219219
let waker = current.as_waker();
220-
poll_03_to_io(self.inner.poll_flush(&waker))
220+
poll_03_to_io(Pin::new(&mut self.inner).poll_flush(&waker))
221221
}
222222
}
223223

224-
impl<W: AsyncWrite03> AsyncWrite01 for Compat<W> {
224+
impl<W: AsyncWrite03 + Unpin> AsyncWrite01 for Compat<W> {
225225
fn shutdown(&mut self) -> std::io::Result<Async01<()>> {
226226
let current = Current::new();
227227
let waker = current.as_waker();
228-
poll_03_to_01(self.inner.poll_close(&waker))
228+
poll_03_to_01(Pin::new(&mut self.inner).poll_close(&waker))
229229
}
230230
}
231231
}

0 commit comments

Comments
 (0)