-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Proposed refactoring to implement core::io #2262
Comments
One problem I see with the |
Yes, good point! They'd be different traits, but they have to be.
std::io::Error may store a heap-allocated Box<Error>, which is a great
feature that has been stabilized, but is impossible on a microcontroller
with no heap.
It would be easy to add wrappers that map between std::io and core::io,
losing some data on errors converted to core::io::Error, of course. Then
code designed mostly for no_std can simply use core::io and still
ergonomically interoperate with std::io code.
With this templated approach library authors can easily opt-in to writing
for both std and no_std environments by creating their own feature flags to
swap between std::io or core::io in their API. That's the use case I'd
imagined.
…On 28 Dec 2017 8:46 a.m., "Tim Neumann" ***@***.***> wrote:
One problem I see with the include! approach is that std::io::Read and
core::io::Read would be different traits, making APIs using either
incompatible with each other.
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<#2262 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AAm2kp4rmbmr7xdEPt-NCj-PNjPnrCR0ks5tE1VegaJpZM4RMDvQ>
.
|
I like the blanket impl I propose here https://internals.rust-lang.org/t/refactoring-std-for-ultimate-portability/4301/3 to connect the two traits. |
@Ericson2314 Yes! I Read that thread with great interest. I agree the platform abstraction layer sounds like a great approach. I didn't feel up to the task of starting that work and was looking for a quicker fix that could be improved later. Edit: misread your post. Yes, it should be possible to rewrite std::io as a concrete layer on top of a generic core::io layer with some wrapper structs to convert between the two, and make it all low-cost. I would be interested in prototyping that approach instead of what I proposed here. |
There’s also methods like |
@fluffysquirrels I think you closed by mistake? @SimonSapin Indeed, I imagine we'd want an |
I was thinking the linked page may be more appropriate, but now I see your comments were on a forum, not an issue tracker. My mistake. Regarding |
Relevant GitHub issues raised in the portability working group: rust-lang-nursery/portability-wg#4 |
@fluffysquirrels Sure, fine to continue this elsewhere. Thanks again for kicking off the discussion :). |
Continued in rust-lang-nursery/portability-wg#12 (comment) |
1548: Add kernel::debug::IoWrite trait and remove unsound str::from_utf8_unchecked (fix #1449) r=ppannuto a=gendx ### Pull Request Overview This pull request adds a new `IoWrite` trait in the kernel, to write arbitrary bytes instead of UTF-8 strings (fixes #1449). Until now, the `flush` function was using `str::from_utf8_unchecked`, even though the bytes are actually not UTF-8 (even with only UTF-8 input, the underlying ring buffer may wrap-around in the middle on a UTF-8 character). In practice, the underlying implementations work byte-by-byte to send debug output, so a more general trait to write byte slices can be plugged in. This `IoWrite` trait is similar to `std::io::Write`, except that the latter doesn't exist in `no_std` (because `std::io::Error` isn't compatible - see rust-lang/rust#68315 and rust-lang/rfcs#2262). ### Testing Strategy This pull request was tested by Travis. ### TODO or Help Wanted This pull request still needs support for byte-by-byte writing on the arty-e21 board. I'm not even sure the current `debug!` macro is what we want to do in a panic handler. ### Documentation Updated - [x] Updated the relevant files in `/docs`, or no updates are required. ### Formatting - [x] Ran `make formatall`. Co-authored-by: Guillaume Endignoux <[email protected]>
What's the situation of this? |
Label: T-libs
There have of course been several efforts to refactor std::io to make it usable without std as core::io or similar.
Some links to prior art from a few hours of searching:
::std::error
to::core::error
rust#33149From what I can see all efforts are currently stalled, but I'd like to make progress on using std::io in a no_std environment. My use case is a crate I'm writing that uses std::io::{Read, Write}, and I want it to build with std and when no_std.
As mentioned in https://internals.rust-lang.org/t/refactoring-std-for-ultimate-portability/4301, there are circular dependencies between std::io and the rest of std.
I have an idea that I've not seen mentioned: use conditional compilation in the std::io module to enable use without std. Steps required in more detail:
The ideal solution, as proposed in https://internals.rust-lang.org/t/refactoring-std-for-ultimate-portability/4301, is probably a careful refactoring to decouple std, but that seems like a lot of work, which has already stalled once. A templated approach allows quick progress and can be eradicated progressively as more parts of std::io are refactored out of std.
I'm willing to work on a prototype branch or more formal RFC if there is interest from the libs team.
The text was updated successfully, but these errors were encountered: