Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 17 additions & 21 deletions src/fd/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ mod eventfd;
pub(crate) mod socket;
pub(crate) mod stdio;

pub(crate) const STDIN_FILENO: FileDescriptor = 0;
pub(crate) const STDOUT_FILENO: FileDescriptor = 1;
pub(crate) const STDERR_FILENO: FileDescriptor = 2;
pub(crate) const STDIN_FILENO: RawFd = 0;
pub(crate) const STDOUT_FILENO: RawFd = 1;
pub(crate) const STDERR_FILENO: RawFd = 2;

#[cfg(any(feature = "net", feature = "vsock"))]
#[derive(Debug)]
Expand All @@ -48,7 +48,7 @@ pub(crate) enum SocketOption {
TcpNoDelay,
}

pub(crate) type FileDescriptor = i32;
pub(crate) type RawFd = i32;

bitflags! {
/// Options for opening files
Expand Down Expand Up @@ -332,7 +332,7 @@ pub(crate) trait ObjectInterface: Sync + Send {
}
}

pub(crate) fn read(fd: FileDescriptor, buf: &mut [u8]) -> io::Result<usize> {
pub(crate) fn read(fd: RawFd, buf: &mut [u8]) -> io::Result<usize> {
let obj = get_object(fd)?;

if buf.is_empty() {
Expand All @@ -342,19 +342,19 @@ pub(crate) fn read(fd: FileDescriptor, buf: &mut [u8]) -> io::Result<usize> {
block_on(async { obj.read().await.read(buf).await }, None)
}

pub(crate) fn lseek(fd: FileDescriptor, offset: isize, whence: SeekWhence) -> io::Result<isize> {
pub(crate) fn lseek(fd: RawFd, offset: isize, whence: SeekWhence) -> io::Result<isize> {
let obj = get_object(fd)?;

block_on(async { obj.read().await.lseek(offset, whence).await }, None)
}

pub(crate) fn chmod(fd: FileDescriptor, mode: AccessPermission) -> io::Result<()> {
pub(crate) fn chmod(fd: RawFd, mode: AccessPermission) -> io::Result<()> {
let obj = get_object(fd)?;

block_on(async { obj.read().await.chmod(mode).await }, None)
}

pub(crate) fn write(fd: FileDescriptor, buf: &[u8]) -> io::Result<usize> {
pub(crate) fn write(fd: RawFd, buf: &[u8]) -> io::Result<usize> {
let obj = get_object(fd)?;

if buf.is_empty() {
Expand All @@ -364,7 +364,7 @@ pub(crate) fn write(fd: FileDescriptor, buf: &[u8]) -> io::Result<usize> {
block_on(async { obj.read().await.write(buf).await }, None)
}

pub(crate) fn truncate(fd: FileDescriptor, length: usize) -> io::Result<()> {
pub(crate) fn truncate(fd: RawFd, length: usize) -> io::Result<()> {
let obj = get_object(fd)?;
block_on(async { obj.read().await.truncate(length).await }, None)
}
Expand Down Expand Up @@ -416,7 +416,7 @@ pub fn poll(fds: &mut [PollFd], timeout: Option<Duration>) -> io::Result<u64> {
result
}

pub fn fstat(fd: FileDescriptor) -> io::Result<FileAttr> {
pub fn fstat(fd: RawFd) -> io::Result<FileAttr> {
let obj = get_object(fd)?;
block_on(async { obj.read().await.fstat().await }, None)
}
Expand All @@ -439,45 +439,41 @@ pub fn fstat(fd: FileDescriptor) -> io::Result<FileAttr> {
/// `EFD_NONBLOCK`: Set the file descriptor in non-blocking mode
/// `EFD_SEMAPHORE`: Provide semaphore-like semantics for reads
/// from the new file descriptor.
pub fn eventfd(initval: u64, flags: EventFlags) -> io::Result<FileDescriptor> {
pub fn eventfd(initval: u64, flags: EventFlags) -> io::Result<RawFd> {
let obj = self::eventfd::EventFd::new(initval, flags);

let fd = core_scheduler().insert_object(Arc::new(async_lock::RwLock::new(obj)))?;

Ok(fd)
}

pub(crate) fn get_object(
fd: FileDescriptor,
) -> io::Result<Arc<async_lock::RwLock<dyn ObjectInterface>>> {
pub(crate) fn get_object(fd: RawFd) -> io::Result<Arc<async_lock::RwLock<dyn ObjectInterface>>> {
core_scheduler().get_object(fd)
}

pub(crate) fn insert_object(
obj: Arc<async_lock::RwLock<dyn ObjectInterface>>,
) -> io::Result<FileDescriptor> {
) -> io::Result<RawFd> {
core_scheduler().insert_object(obj)
}

// The dup system call allocates a new file descriptor that refers
// to the same open file description as the descriptor oldfd. The new
// file descriptor number is guaranteed to be the lowest-numbered
// file descriptor that was unused in the calling process.
pub(crate) fn dup_object(fd: FileDescriptor) -> io::Result<FileDescriptor> {
pub(crate) fn dup_object(fd: RawFd) -> io::Result<RawFd> {
core_scheduler().dup_object(fd)
}

pub(crate) fn dup_object2(fd1: FileDescriptor, fd2: FileDescriptor) -> io::Result<FileDescriptor> {
pub(crate) fn dup_object2(fd1: RawFd, fd2: RawFd) -> io::Result<RawFd> {
core_scheduler().dup_object2(fd1, fd2)
}

pub(crate) fn remove_object(
fd: FileDescriptor,
) -> io::Result<Arc<async_lock::RwLock<dyn ObjectInterface>>> {
pub(crate) fn remove_object(fd: RawFd) -> io::Result<Arc<async_lock::RwLock<dyn ObjectInterface>>> {
core_scheduler().remove_object(fd)
}

pub(crate) fn isatty(fd: FileDescriptor) -> io::Result<bool> {
pub(crate) fn isatty(fd: RawFd) -> io::Result<bool> {
let obj = get_object(fd)?;
block_on(async { obj.read().await.isatty().await }, None)
}
8 changes: 4 additions & 4 deletions src/fs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -472,7 +472,7 @@ pub fn truncate(name: &str, size: usize) -> io::Result<()> {
})
}

pub fn open(name: &str, flags: OpenOption, mode: AccessPermission) -> io::Result<FileDescriptor> {
pub fn open(name: &str, flags: OpenOption, mode: AccessPermission) -> io::Result<RawFd> {
// mode is 0x777 (0b0111_0111_0111), when flags | O_CREAT, else 0
// flags is bitmask of O_DEC_* defined above.
// (taken from rust stdlib/sys hermit target )
Expand Down Expand Up @@ -522,12 +522,12 @@ pub fn umask(new_mask: AccessPermission) -> AccessPermission {
}

/// Open a directory to read the directory entries
pub(crate) fn opendir(name: &str) -> io::Result<FileDescriptor> {
pub(crate) fn opendir(name: &str) -> io::Result<RawFd> {
let obj = FILESYSTEM.get().ok_or(Errno::Inval)?.opendir(name)?;
insert_object(obj)
}

use crate::fd::{self, FileDescriptor};
use crate::fd::{self, RawFd};

pub fn file_attributes(path: &str) -> io::Result<FileAttr> {
FILESYSTEM.get().ok_or(Errno::Inval)?.lstat(path)
Expand Down Expand Up @@ -571,7 +571,7 @@ pub fn metadata(path: &str) -> io::Result<Metadata> {

#[derive(Debug)]
pub struct File {
fd: FileDescriptor,
fd: RawFd,
path: String,
}

Expand Down
44 changes: 17 additions & 27 deletions src/scheduler/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ use crate::arch::switch::switch_to_task;
use crate::arch::switch::{switch_to_fpu_owner, switch_to_task};
use crate::arch::{get_processor_count, interrupts};
use crate::errno::Errno;
use crate::fd::{FileDescriptor, ObjectInterface};
use crate::fd::{ObjectInterface, RawFd};
use crate::kernel::scheduler::TaskStacks;
use crate::scheduler::task::*;
use crate::{arch, io};
Expand Down Expand Up @@ -218,11 +218,8 @@ struct NewTask {
prio: Priority,
core_id: CoreId,
stacks: TaskStacks,
object_map: Arc<
RwSpinLock<
HashMap<FileDescriptor, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>,
>,
>,
object_map:
Arc<RwSpinLock<HashMap<RawFd, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>>>,
}

impl From<NewTask> for Task {
Expand Down Expand Up @@ -459,11 +456,8 @@ impl PerCoreScheduler {
#[inline]
pub fn get_current_task_object_map(
&self,
) -> Arc<
RwSpinLock<
HashMap<FileDescriptor, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>,
>,
> {
) -> Arc<RwSpinLock<HashMap<RawFd, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>>>
{
without_interrupts(|| self.current_task.borrow().object_map.clone())
}

Expand All @@ -472,7 +466,7 @@ impl PerCoreScheduler {
#[inline]
pub fn get_object(
&self,
fd: FileDescriptor,
fd: RawFd,
) -> io::Result<Arc<async_lock::RwLock<dyn ObjectInterface>>> {
without_interrupts(|| {
let current_task = self.current_task.borrow();
Expand All @@ -487,7 +481,7 @@ impl PerCoreScheduler {
#[cfg_attr(not(target_arch = "x86_64"), expect(dead_code))]
pub fn recreate_objmap(&self) -> io::Result<()> {
let mut map = HashMap::<
FileDescriptor,
RawFd,
Arc<async_lock::RwLock<dyn ObjectInterface>>,
RandomState,
>::with_hasher(RandomState::with_seeds(0, 0, 0, 0));
Expand Down Expand Up @@ -515,17 +509,17 @@ impl PerCoreScheduler {
pub fn insert_object(
&self,
obj: Arc<async_lock::RwLock<dyn ObjectInterface>>,
) -> io::Result<FileDescriptor> {
) -> io::Result<RawFd> {
without_interrupts(|| {
let current_task = self.current_task.borrow();
let mut object_map = current_task.object_map.write();

let new_fd = || -> io::Result<FileDescriptor> {
let mut fd: FileDescriptor = 0;
let new_fd = || -> io::Result<RawFd> {
let mut fd: RawFd = 0;
loop {
if !object_map.contains_key(&fd) {
break Ok(fd);
} else if fd == FileDescriptor::MAX {
} else if fd == RawFd::MAX {
break Err(Errno::Overflow);
}

Expand All @@ -541,19 +535,19 @@ impl PerCoreScheduler {

/// Duplicate a IO interface and returns a new file descriptor as
/// identifier to the new copy
pub fn dup_object(&self, fd: FileDescriptor) -> io::Result<FileDescriptor> {
pub fn dup_object(&self, fd: RawFd) -> io::Result<RawFd> {
without_interrupts(|| {
let current_task = self.current_task.borrow();
let mut object_map = current_task.object_map.write();

let obj = (*(object_map.get(&fd).ok_or(Errno::Inval)?)).clone();

let new_fd = || -> io::Result<FileDescriptor> {
let mut fd: FileDescriptor = 0;
let new_fd = || -> io::Result<RawFd> {
let mut fd: RawFd = 0;
loop {
if !object_map.contains_key(&fd) {
break Ok(fd);
} else if fd == FileDescriptor::MAX {
} else if fd == RawFd::MAX {
break Err(Errno::Overflow);
}

Expand All @@ -572,11 +566,7 @@ impl PerCoreScheduler {
})
}

pub fn dup_object2(
&self,
fd1: FileDescriptor,
fd2: FileDescriptor,
) -> io::Result<FileDescriptor> {
pub fn dup_object2(&self, fd1: RawFd, fd2: RawFd) -> io::Result<RawFd> {
without_interrupts(|| {
let current_task = self.current_task.borrow();
let mut object_map = current_task.object_map.write();
Expand All @@ -596,7 +586,7 @@ impl PerCoreScheduler {
/// Remove a IO interface, which is named by the file descriptor
pub fn remove_object(
&self,
fd: FileDescriptor,
fd: RawFd,
) -> io::Result<Arc<async_lock::RwLock<dyn ObjectInterface>>> {
without_interrupts(|| {
let current_task = self.current_task.borrow();
Expand Down
21 changes: 6 additions & 15 deletions src/scheduler/task/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use self::tls::Tls;
use crate::arch::core_local::*;
use crate::arch::scheduler::TaskStacks;
use crate::fd::stdio::*;
use crate::fd::{FileDescriptor, ObjectInterface, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO};
use crate::fd::{ObjectInterface, RawFd, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO};
use crate::scheduler::CoreId;
use crate::{arch, env};

Expand Down Expand Up @@ -389,11 +389,8 @@ pub(crate) struct Task {
/// Stack of the task
pub stacks: TaskStacks,
/// Mapping between file descriptor and the referenced IO interface
pub object_map: Arc<
RwSpinLock<
HashMap<FileDescriptor, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>,
>,
>,
pub object_map:
Arc<RwSpinLock<HashMap<RawFd, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>>>,
/// Task Thread-Local-Storage (TLS)
#[cfg(not(feature = "common-os"))]
pub tls: Option<Tls>,
Expand All @@ -415,9 +412,7 @@ impl Task {
task_prio: Priority,
stacks: TaskStacks,
object_map: Arc<
RwSpinLock<
HashMap<FileDescriptor, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>,
>,
RwSpinLock<HashMap<RawFd, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>>,
>,
) -> Task {
debug!("Creating new task {tid} on core {core_id}");
Expand Down Expand Up @@ -446,19 +441,15 @@ impl Task {
static OBJECT_MAP: OnceCell<
Arc<
RwSpinLock<
HashMap<
FileDescriptor,
Arc<async_lock::RwLock<dyn ObjectInterface>>,
RandomState,
>,
HashMap<RawFd, Arc<async_lock::RwLock<dyn ObjectInterface>>, RandomState>,
>,
>,
> = OnceCell::new();

if core_id == 0 {
OBJECT_MAP
.set(Arc::new(RwSpinLock::new(HashMap::<
FileDescriptor,
RawFd,
Arc<async_lock::RwLock<dyn ObjectInterface>>,
RandomState,
>::with_hasher(
Expand Down
Loading