Giter Club home page Giter Club logo

Comments (9)

gdesmott avatar gdesmott commented on June 21, 2024

I can give this a shot. Can you please explain a bit how this should be implemented and the API you are looking for? I'm not yet familiar with the async traits.

from gio.

gdesmott avatar gdesmott commented on June 21, 2024

Shouldn't AsyncBufRead be implemented on PollableInputStream instead as it's the one implementing AsyncRead?

from gio.

sdroege avatar sdroege commented on June 21, 2024

No, and that one also only has an adapter that you can get from it to have an AsyncRead. We can't implement it directly on our types :)

AsyncBufRead (unlike AsyncRead) can be implemented for the normal input streams. AsyncRead requires an API where the buffers are owned by the caller while AsyncBufRead allows the buffer to be owned by the callee. You could have an adapter that contains a vec and then hands out immutable slices to that vec whenever a read has finished (because g_input_stream_read() requires ownership of the buffer it is impossible to implement AsyncRead on it).

from gio.

gdesmott avatar gdesmott commented on June 21, 2024

it is impossible to implement AsyncRead on it

But AsyncBufRead has a trait bound on AsyncRead so the adapter will have to implement both traits. How will this work then?

from gio.

sdroege avatar sdroege commented on June 21, 2024

Ah I missed that. You would implement AsyncRead indirectly then, with a copy from the internal buffer into the caller-provided buffer.

from gio.

gdesmott avatar gdesmott commented on June 21, 2024

Here is what I have so far for AsyncRead: gdesmott@be9f0ad

Problem is the test is calling poll_read() once which is returning Pending but then seems stuck.
Isn't the Poll from read_async_future supposed to wake up cx once its ready which would trigger a new poll from the executioner?

First time I'm actually writing futures code so I may have miss something. :)

from gio.

sdroege avatar sdroege commented on June 21, 2024

Answered there in the commit :)

from gio.

gdesmott avatar gdesmott commented on June 21, 2024

poll_read() receives a Pin<&mut Self> but I'm not able to get a &mut InputStreamAsyncBufRead out of it as my type doesn't implement Unpin. Is that normal?

As a result, I'm trying to workaround this immutability by wrapping the state in a Refcell. I kinda works except when performing state switches as I need to deconstruct the state enum while it's borrowed, see gdesmott@84bd74d#diff-463b53a4eb9782d0f3c7dfb895572516R393

error[E0507]: cannot move out of dereference of `std::cell::RefMut<'_, input_stream::State>`
   --> src/input_stream.rs:393:15
    |
393 |         match *state {
    |               ^^^^^^ help: consider borrowing here: `&*state`
394 |             State::Waiting { buffer: buffer } => {
    |                                      ------
    |                                      |
    |                                      data moved here
    |                                      move occurs because `buffer` has type `std::vec::Vec<u8>`, which does not implement the `Copy` trait

Is there a better pattern to handle all this? Or should I just implement Unpin on InputStreamAsyncBufRead? I'm still not very clear on its exact semantic.

from gio.

sdroege avatar sdroege commented on June 21, 2024

You might want to use the pin_project crate for this, or require Unpin. Various existing future implementations in the futures crate can probably be taken here as examples. There are IIRC a few that also have multiple states, for example and_then :)

from gio.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.