use irid_syscall::{ffi::io::{IO_LENGTH, IO_TRY_ACQUIRE}, io::{FileDescriptor, OpenFlags, close, open}};
use crate::{io::{self, convert_error}, path::Path};
#[derive(Debug)]
pub struct SemaphoreFile {
desc: FileDescriptor
}
impl SemaphoreFile {
pub fn open_read(path: impl AsRef<Path>) -> Result<Self, io::Error> {
Ok(SemaphoreFile {
desc: open(path.as_ref().as_str(), OpenFlags::READ | OpenFlags::CHANNEL | OpenFlags::DATALESS | OpenFlags::CREATE)
.map_err(convert_error)?
})
}
pub fn open(path: impl AsRef<Path>) -> Result<Self, io::Error> {
Ok(SemaphoreFile {
desc: open(path.as_ref().as_str(), OpenFlags::READ | OpenFlags::WRITE | OpenFlags::CHANNEL | OpenFlags::DATALESS | OpenFlags::CREATE)
.map_err(convert_error)?
})
}
pub fn acquire(&self) -> Result<(), io::Error> {
irid_syscall::io::read(self.desc, &mut [0]).map_err(convert_error)?;
Ok(())
}
pub fn release(&self) -> Result<(), io::Error> {
irid_syscall::io::write(self.desc, &[1]).map_err(convert_error)?;
Ok(())
}
pub fn set_permits(&self, value: usize) -> Result<(), io::Error> {
irid_syscall::io::set_file_config::<u64>(self.desc, IO_LENGTH, value as u64).map_err(convert_error)?;
Ok(())
}
}
impl Drop for SemaphoreFile {
fn drop(&mut self) {
close(self.desc).expect("failed to close notify file")
}
}