diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ebdba0fe..fbffddff 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,11 +7,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - run: rm rust-toolchain - uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: nightly + toolchain: nightly-2020-04-06 override: true components: rustfmt, clippy - name: Check code format @@ -30,7 +29,7 @@ jobs: - uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: nightly-2020-03-23 + toolchain: nightly-2020-04-06 components: rust-src, llvm-tools-preview - name: Cache QEMU diff --git a/kernel/Cargo.lock b/kernel/Cargo.lock index 09cd418a..535f2e45 100644 --- a/kernel/Cargo.lock +++ b/kernel/Cargo.lock @@ -107,7 +107,7 @@ dependencies = [ [[package]] name = "buddy_system_allocator" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rustversion 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -331,7 +331,7 @@ name = "rboot" version = "0.1.2" dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "uefi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "uefi 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "x86_64 0.9.6 (registry+https://github.com/rust-lang/crates.io-index)", "xmas-elf 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -349,7 +349,7 @@ dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "bitmap-allocator 0.1.0 (git+https://github.com/rcore-os/bitmap-allocator)", "bitvec 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)", - "buddy_system_allocator 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "buddy_system_allocator 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", "compression 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "device_tree 1.0.3 (git+https://github.com/rcore-os/device_tree-rs)", @@ -580,7 +580,7 @@ dependencies = [ [[package]] name = "uefi" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -728,7 +728,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" "checksum bitmap-allocator 0.1.0 (git+https://github.com/rcore-os/bitmap-allocator)" = "" "checksum bitvec 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1fe4300c1d7a9ea6f3e3f39c10b39862bb79e1175c0572b6b49539a30e5562f5" -"checksum buddy_system_allocator 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "09072aa89a810228c822e132e4639ff17bab014ba5b2dce5270a6331ff1963ca" +"checksum buddy_system_allocator 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9e953b958d83e13a44b1ead5b6aaa2a5f854bd5170239a66b606e030a14d018f" "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" "checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" "checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" @@ -780,7 +780,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6d2783fe2d6b8c1101136184eb41be8b1ad379e4657050b8aaff0c79ee7575f9" "checksum uart_16550 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "58fc0bc8ff1beb1436e8c4ce9c4b47f6f6c1376b56fb91505fabeef13743eb33" "checksum ucs2 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "85061f4e43545a613c0da6b87725bf23f8da8613cf2473719c4f71a270c4ce8a" -"checksum uefi 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "36c63ddfef80d9e7f1318917f6c05135b3b98027e973a9e9f0a6aebe87b95934" +"checksum uefi 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5cec6a2850639f588cc8042140b5deaa2f2170c23db5adb08f4316fa04cdb4a0" "checksum uefi-macros 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7d4a1b0215dc72e83d8d501b3275eb59477d3b595be8861abfb8ab110180955" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" "checksum usize_conversions 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f70329e2cbe45d6c97a5112daad40c34cd9a4e18edb5a2a18fefeb584d8d25e5" diff --git a/kernel/Cargo.toml b/kernel/Cargo.toml index 7163b8e1..5111467c 100644 --- a/kernel/Cargo.toml +++ b/kernel/Cargo.toml @@ -55,7 +55,7 @@ bitflags = "1.2" bit_field = "0.10" volatile = "0.2" bitvec = { version = "0.17", default-features = false, features = ["alloc"] } -buddy_system_allocator = "0.3" +buddy_system_allocator = "0.3.9" pci = { git = "https://github.com/rcore-os/pci-rs" } device_tree = { git = "https://github.com/rcore-os/device_tree-rs" } isomorphic_drivers = { git = "https://github.com/rcore-os/isomorphic_drivers", features = ["log"] } diff --git a/kernel/src/sync/mod.rs b/kernel/src/sync/mod.rs index 7e16fe06..8f52efe5 100644 --- a/kernel/src/sync/mod.rs +++ b/kernel/src/sync/mod.rs @@ -17,9 +17,6 @@ //! 完全照搬`std::sync::Semaphore`,std中已经废弃。 //! 貌似在Rust中并不常用,一般都用`Mutex`。 //! -//! * `mpsc`: 消息传递通道。 -//! 多生产者-单消费者的FIFO队列。用于在线程间传递数据。 -//! //! * `test`: 测试。 //! 目前分别用`Mutex`和`Condvar`(Monitor)实现了哲学家就餐问题。 //! @@ -55,7 +52,6 @@ pub use self::mutex::*; pub use self::semaphore::*; mod condvar; -pub mod mpsc; mod mutex; mod semaphore; pub mod test; diff --git a/kernel/src/sync/mpsc.rs b/kernel/src/sync/mpsc.rs deleted file mode 100644 index 0a9159e7..00000000 --- a/kernel/src/sync/mpsc.rs +++ /dev/null @@ -1,145 +0,0 @@ -use super::Condvar; -use super::SpinLock as Mutex; -use alloc::{collections::VecDeque, sync::Arc, sync::Weak}; - -struct Channel { - deque: Mutex>, - pushed: Condvar, -} - -impl Default for Channel { - fn default() -> Self { - Channel { - deque: Mutex::<_>::default(), - pushed: Condvar::default(), - } - } -} - -/// The receiving half of Rust's channel (or sync_channel) type. -/// This half can only be owned by one thread. -/// -/// Messages sent to the channel can be retrieved using recv. -pub struct Receiver { - inner: Arc>, -} - -unsafe impl Send for Receiver {} - -impl !Sync for Receiver {} - -#[derive(Debug)] -pub struct RecvError; - -impl Receiver { - /// Attempts to wait for a value on this receiver, - /// returning an error if the corresponding channel has hung up. - pub fn recv(&self) -> Result { - let mut deque = self.inner.deque.lock(); - while deque.is_empty() { - deque = self.inner.pushed.wait(deque); - } - Ok(deque.pop_front().unwrap()) - } -} - -/// The sending-half of Rust's asynchronous channel type. -/// This half can only be owned by one thread, but it can be cloned to send to other threads. -/// -/// Messages can be sent through this channel with send. -#[derive(Clone)] -pub struct Sender { - inner: Weak>, -} - -unsafe impl Send for Sender {} - -impl !Sync for Sender {} - -#[derive(Debug)] -pub struct SendError(pub T); - -impl Sender { - /// Attempts to send a value on this channel, - /// returning it back if it could not be sent. - pub fn send(&self, t: T) -> Result<(), SendError> { - match self.inner.upgrade() { - None => Err(SendError(t)), - Some(inner) => { - let mut deque = inner.deque.lock(); - deque.push_back(t); - inner.pushed.notify_one(); - Ok(()) - } - } - } -} - -/// Creates a new asynchronous channel, returning the sender/receiver halves. -pub fn channel() -> (Sender, Receiver) { - let channel = Arc::new(Channel::::default()); - let sender = Sender { - inner: Arc::downgrade(&channel), - }; - let receiver = Receiver { inner: channel }; - (sender, receiver) -} - -pub mod test { - //! Copied from std::mpsc::test - - use super::*; - use crate::thread; - use alloc::boxed::Box; - - fn smoke() { - let (tx, rx) = channel::(); - tx.send(1).unwrap(); - assert_eq!(rx.recv().unwrap(), 1); - } - - fn drop_full() { - let (tx, _rx) = channel::>(); - tx.send(Box::new(1)).unwrap(); - } - - fn drop_full_shared() { - let (tx, _rx) = channel::>(); - drop(tx.clone()); - drop(tx.clone()); - tx.send(Box::new(1)).unwrap(); - } - - fn smoke_shared() { - let (tx, rx) = channel::(); - tx.send(1).unwrap(); - assert_eq!(rx.recv().unwrap(), 1); - let tx = tx.clone(); - tx.send(1).unwrap(); - assert_eq!(rx.recv().unwrap(), 1); - } - - fn smoke_threads() { - let (tx, rx) = channel::(); - let _t = thread::spawn(move || { - tx.send(1).unwrap(); - }); - assert_eq!(rx.recv().unwrap(), 1); - } - - fn smoke_port_gone() { - let (tx, rx) = channel::(); - drop(rx); - assert!(tx.send(1).is_err()); - } - - pub fn test_all() { - smoke(); - drop_full(); - drop_full_shared(); - smoke_shared(); - smoke_threads(); - smoke_port_gone(); - println!("mpsc test end"); - } -} diff --git a/rboot b/rboot index 33a2d215..048fa09b 160000 --- a/rboot +++ b/rboot @@ -1 +1 @@ -Subproject commit 33a2d215957b704a26dab52484d75d47dbb49bdb +Subproject commit 048fa09b6b9614ceee52f8d7a8e4587ae3ca61e8 diff --git a/rust-toolchain b/rust-toolchain index d6c11b15..8bd4ff0a 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1 +1 @@ -nightly-2020-03-23 +nightly-2020-04-06