This is an API that allows types to indicate that they can be passed buffers of uninitialized memory which can improve performance.
75 lines
2.0 KiB
Rust
75 lines
2.0 KiB
Rust
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
use io;
|
|
use sys::{cvt, syscall};
|
|
use sys::fd::FileDesc;
|
|
|
|
pub struct Stdin(());
|
|
pub struct Stdout(());
|
|
pub struct Stderr(());
|
|
|
|
impl Stdin {
|
|
pub fn new() -> io::Result<Stdin> { Ok(Stdin(())) }
|
|
|
|
pub fn read(&self, data: &mut [u8]) -> io::Result<usize> {
|
|
let fd = FileDesc::new(0);
|
|
let ret = fd.read(data);
|
|
fd.into_raw();
|
|
ret
|
|
}
|
|
}
|
|
|
|
impl Stdout {
|
|
pub fn new() -> io::Result<Stdout> { Ok(Stdout(())) }
|
|
|
|
pub fn write(&self, data: &[u8]) -> io::Result<usize> {
|
|
let fd = FileDesc::new(1);
|
|
let ret = fd.write(data);
|
|
fd.into_raw();
|
|
ret
|
|
}
|
|
|
|
pub fn flush(&self) -> io::Result<()> {
|
|
cvt(syscall::fsync(1)).and(Ok(()))
|
|
}
|
|
}
|
|
|
|
impl Stderr {
|
|
pub fn new() -> io::Result<Stderr> { Ok(Stderr(())) }
|
|
|
|
pub fn write(&self, data: &[u8]) -> io::Result<usize> {
|
|
let fd = FileDesc::new(2);
|
|
let ret = fd.write(data);
|
|
fd.into_raw();
|
|
ret
|
|
}
|
|
|
|
pub fn flush(&self) -> io::Result<()> {
|
|
cvt(syscall::fsync(2)).and(Ok(()))
|
|
}
|
|
}
|
|
|
|
// FIXME: right now this raw stderr handle is used in a few places because
|
|
// std::io::stderr_raw isn't exposed, but once that's exposed this impl
|
|
// should go away
|
|
impl io::Write for Stderr {
|
|
fn write(&mut self, data: &[u8]) -> io::Result<usize> {
|
|
Stderr::write(self, data)
|
|
}
|
|
|
|
fn flush(&mut self) -> io::Result<()> {
|
|
Stderr::flush(self)
|
|
}
|
|
}
|
|
|
|
pub const EBADF_ERR: i32 = ::sys::syscall::EBADF;
|
|
pub const STDIN_BUF_SIZE: usize = ::sys_common::io::DEFAULT_BUF_SIZE;
|