[runtime] Enhancement: Base Number for QDs
@@ -6,15 +6,15 @@ mod qresult;
mod qtoken;
mod qtype;
-//==============================================================================
+//======================================================================================================================
// Imports
-//==============================================================================
+//======================================================================================================================
use ::slab::Slab;
-//==============================================================================
-// Imports
-//==============================================================================
+//======================================================================================================================
+// Exports
+//======================================================================================================================
pub use self::{
qdesc::QDesc,
@@ -23,54 +23,69 @@ pub use self::{
qtype::QType,
};
-//==============================================================================
+//======================================================================================================================
// Structures
-//==============================================================================
+//======================================================================================================================
-/// IO Queue Table
+/// I/O queue descriptors table.
pub struct IoQueueTable {
+ // TODO: Store a QType in the slab.
table: Slab<u32>,
}
-//==============================================================================
-// Associate Functions
-//==============================================================================
+//======================================================================================================================
+// Associated Functions
+//======================================================================================================================
-/// Associate Functions for IO Queue Tables
+/// Associated functions for I/O queue descriptors tables.
impl IoQueueTable {
- /// Creates an IO queue table.
+ /// Offset for I/O queue descriptors.
+ ///
+ /// When Demikernel is interposing system calls of the underlying OS
+ /// this offset enables us to distinguish I/O queue descriptors from
+ /// file descriptors.
+ const BASE_QD: usize = 1_000_000;
+
+ /// Creates an I/O queue descriptors table.
pub fn new() -> Self {
Self { table: Slab::new() }
}
- /// Allocates a new entry in the target [IoQueueTable].
+ /// Allocates a new entry in the target I/O queue descriptors table.
pub fn alloc(&mut self, qtype: u32) -> QDesc {
- let ix: usize = self.table.insert(qtype);
- QDesc::from(ix)
+ let idx: usize = self.table.insert(qtype);
+ QDesc::from(idx + Self::BASE_QD)
}
- /// Gets the file associated with an IO queue descriptor.
+ /// Gets the entry associated with an I/O queue descriptor.
pub fn get(&self, qd: QDesc) -> Option<u32> {
- if !self.table.contains(qd.into()) {
- return None;
+ let idx: usize = self.get_index(qd)? as usize;
+ self.table.get(idx).cloned()
}
- self.table.get(qd.into()).cloned()
+ /// Releases the entry associated with an I/O queue descriptor.
+ pub fn free(&mut self, qd: QDesc) -> Option<u32> {
+ let idx: usize = self.get_index(qd)?;
+ Some(self.table.remove(idx))
}
- /// Releases an entry in the target [IoQueueTable].
- pub fn free(&mut self, qd: QDesc) -> Option<u32> {
- if !self.table.contains(qd.into()) {
+ /// Gets the index in the I/O queue descriptors table to which a given I/O queue descriptor refers to.
+ fn get_index(&self, qd: QDesc) -> Option<usize> {
+ if Into::<usize>::into(qd) < Self::BASE_QD {
+ None
+ } else {
+ let rawqd: usize = Into::<usize>::into(qd) - Self::BASE_QD;
+ if !self.table.contains(rawqd) {
return None;
}
-
- Some(self.table.remove(qd.into()))
+ Some(rawqd)
+ }
}
}
-//==============================================================================
+//======================================================================================================================
// Unit Tests
-//==============================================================================
+//======================================================================================================================
#[cfg(test)]
mod tests {
