Orbital (#16)
* Port previous ethernet scheme
* Add ipd
* Fix initfs rebuilds, use QEMU user networking addresses in ipd
* Add tcp/udp, netutils, dns, and network config
* Add fsync to network driver
* Add dns, router, subnet by default
* Fix e1000 driver. Make ethernet and IP non-blocking to avoid deadlocks
* Add orbital server, WIP
* Add futex
* Add orbutils and orbital
* Update libstd, orbutils, and orbital
Move ANSI key encoding to vesad
* Add orbital assets
* Update orbital
* Update to add login manager
* Add blocking primitives, block for most things except waitpid, update orbital
* Wait in waitpid and IRQ, improvements for other waits
* Fevent in root scheme
* WIP: Switch to using fevent
* Reorganize
* Event based e1000d driver
* Superuser-only access to some network schemes, display, and disk
* Superuser root and irq schemes
* Fix orbital
2016-10-14 01:21:42 +02:00
|
|
|
use collections::vec_deque::VecDeque;
|
|
|
|
use spin::Mutex;
|
|
|
|
|
|
|
|
use sync::WaitCondition;
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct WaitQueue<T> {
|
|
|
|
pub inner: Mutex<VecDeque<T>>,
|
|
|
|
pub condition: WaitCondition,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> WaitQueue<T> {
|
|
|
|
pub fn new() -> WaitQueue<T> {
|
|
|
|
WaitQueue {
|
|
|
|
inner: Mutex::new(VecDeque::new()),
|
|
|
|
condition: WaitCondition::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn clone(&self) -> WaitQueue<T> where T: Clone {
|
|
|
|
WaitQueue {
|
|
|
|
inner: Mutex::new(self.inner.lock().clone()),
|
|
|
|
condition: WaitCondition::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn is_empty(&self) -> bool {
|
|
|
|
self.inner.lock().is_empty()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn receive(&self) -> T {
|
|
|
|
loop {
|
|
|
|
if let Some(value) = self.inner.lock().pop_front() {
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
self.condition.wait();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-10-20 20:31:39 +02:00
|
|
|
pub fn receive_into(&self, buf: &mut [T], block: bool) -> usize {
|
Orbital (#16)
* Port previous ethernet scheme
* Add ipd
* Fix initfs rebuilds, use QEMU user networking addresses in ipd
* Add tcp/udp, netutils, dns, and network config
* Add fsync to network driver
* Add dns, router, subnet by default
* Fix e1000 driver. Make ethernet and IP non-blocking to avoid deadlocks
* Add orbital server, WIP
* Add futex
* Add orbutils and orbital
* Update libstd, orbutils, and orbital
Move ANSI key encoding to vesad
* Add orbital assets
* Update orbital
* Update to add login manager
* Add blocking primitives, block for most things except waitpid, update orbital
* Wait in waitpid and IRQ, improvements for other waits
* Fevent in root scheme
* WIP: Switch to using fevent
* Reorganize
* Event based e1000d driver
* Superuser-only access to some network schemes, display, and disk
* Superuser root and irq schemes
* Fix orbital
2016-10-14 01:21:42 +02:00
|
|
|
let mut i = 0;
|
|
|
|
|
2016-10-20 20:31:39 +02:00
|
|
|
if i < buf.len() && block {
|
Orbital (#16)
* Port previous ethernet scheme
* Add ipd
* Fix initfs rebuilds, use QEMU user networking addresses in ipd
* Add tcp/udp, netutils, dns, and network config
* Add fsync to network driver
* Add dns, router, subnet by default
* Fix e1000 driver. Make ethernet and IP non-blocking to avoid deadlocks
* Add orbital server, WIP
* Add futex
* Add orbutils and orbital
* Update libstd, orbutils, and orbital
Move ANSI key encoding to vesad
* Add orbital assets
* Update orbital
* Update to add login manager
* Add blocking primitives, block for most things except waitpid, update orbital
* Wait in waitpid and IRQ, improvements for other waits
* Fevent in root scheme
* WIP: Switch to using fevent
* Reorganize
* Event based e1000d driver
* Superuser-only access to some network schemes, display, and disk
* Superuser root and irq schemes
* Fix orbital
2016-10-14 01:21:42 +02:00
|
|
|
buf[i] = self.receive();
|
|
|
|
i += 1;
|
|
|
|
}
|
|
|
|
|
2016-10-20 20:31:39 +02:00
|
|
|
{
|
|
|
|
let mut inner = self.inner.lock();
|
|
|
|
while i < buf.len() {
|
|
|
|
if let Some(value) = inner.pop_front() {
|
|
|
|
buf[i] = value;
|
|
|
|
i += 1;
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
Orbital (#16)
* Port previous ethernet scheme
* Add ipd
* Fix initfs rebuilds, use QEMU user networking addresses in ipd
* Add tcp/udp, netutils, dns, and network config
* Add fsync to network driver
* Add dns, router, subnet by default
* Fix e1000 driver. Make ethernet and IP non-blocking to avoid deadlocks
* Add orbital server, WIP
* Add futex
* Add orbutils and orbital
* Update libstd, orbutils, and orbital
Move ANSI key encoding to vesad
* Add orbital assets
* Update orbital
* Update to add login manager
* Add blocking primitives, block for most things except waitpid, update orbital
* Wait in waitpid and IRQ, improvements for other waits
* Fevent in root scheme
* WIP: Switch to using fevent
* Reorganize
* Event based e1000d driver
* Superuser-only access to some network schemes, display, and disk
* Superuser root and irq schemes
* Fix orbital
2016-10-14 01:21:42 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
i
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn send(&self, value: T) -> usize {
|
|
|
|
let len = {
|
|
|
|
let mut inner = self.inner.lock();
|
|
|
|
inner.push_back(value);
|
|
|
|
inner.len()
|
|
|
|
};
|
|
|
|
self.condition.notify();
|
|
|
|
len
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn send_from(&self, buf: &[T]) -> usize where T: Copy {
|
|
|
|
let len = {
|
|
|
|
let mut inner = self.inner.lock();
|
|
|
|
inner.extend(buf.iter());
|
|
|
|
inner.len()
|
|
|
|
};
|
|
|
|
self.condition.notify();
|
|
|
|
len
|
|
|
|
}
|
|
|
|
}
|