First rust programs

This commit is contained in:
Tim Warren 2015-12-10 14:14:30 -05:00
parent 623f62025d
commit 3a5f80e153
14 changed files with 240 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
**/target
**/node_modules

4
dining_philosophers/Cargo.lock generated Normal file
View File

@ -0,0 +1,4 @@
[root]
name = "dining_philosophers"
version = "0.1.0"

View File

@ -0,0 +1,4 @@
[package]
name = "dining_philosophers"
version = "0.1.0"
authors = ["Tim Warren <twarren@nexient.com>"]

View File

@ -0,0 +1,65 @@
use std::thread;
use std::sync::{Mutex, Arc}; // Arc == atomic reference count
struct Philosopher {
name: String,
left: usize,
right: usize,
}
impl Philosopher {
fn new(name: &str, left: usize, right: usize) -> Philosopher {
Philosopher {
name: name.to_string(),
left: left,
right: right,
}
}
fn eat(&self, table: &Table) {
let _left = table.forks[self.left].lock().unwrap();
thread::sleep_ms(150);
let _right = table.forks[self.right].lock().unwrap();
println!("{} is eating.", self.name);
thread::sleep_ms(1000);
println!("{} is done eating.", self.name);
}
}
struct Table {
forks: Vec<Mutex<()>>,
}
fn main() {
let table = Arc::new(Table { forks: vec![
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
Mutex::new(()),
]});
let philosophers = vec![
Philosopher::new("Judith Butler", 0, 1),
Philosopher::new("Gilles Deleuze", 1, 2),
Philosopher::new("Karl Marx", 2, 3),
Philosopher::new("Emma Goldman", 3, 4),
Philosopher::new("Michel Foucault", 0, 4), // Left-handed to prevent deadlock
];
let handles: Vec<_> = philosophers.into_iter().map(|p| {
// This increments the refernce count
let table = table.clone();
thread::spawn(move || {
p.eat(&table);
})
}).collect();
for h in handles {
h.join().unwrap();
}
}

4
embed/Cargo.lock generated Normal file
View File

@ -0,0 +1,4 @@
[root]
name = "embed"
version = "0.1.0"

8
embed/Cargo.toml Normal file
View File

@ -0,0 +1,8 @@
[package]
name = "embed"
version = "0.1.0"
authors = ["Tim Warren <twarren@nexient.com>"]
[lib]
name = "embed"
crate-type = ["dylib"]

11
embed/embed.js Normal file
View File

@ -0,0 +1,11 @@
'use strict';
let ffi = require('ffi');
let lib = ffi.Library('target/release/libembed', {
process: ['void', []]
});
lib.process();
console.log("done!");

7
embed/embed.py Normal file
View File

@ -0,0 +1,7 @@
from ctypes import cdll
lib = cdll.LoadLibrary("target/release/libembed.dylib")
lib.process()
print("done!")

11
embed/embed.rb Normal file
View File

@ -0,0 +1,11 @@
require 'ffi'
module Hello
extend FFI::Library
ffi_lib 'target/release/libembed.dylib'
attach_function :process, [], :void
end
Hello.process
puts 'done!'

19
embed/pure-ruby-embed.rb Normal file
View File

@ -0,0 +1,19 @@
threads = []
10.times do
threads << Thread.new do
count = 0
5_000_000.times do
count += 1
end
count # return
end
end
threads.each do |t|
puts "Thread finished with count=#{t.value}"
end
puts "done!"

19
embed/src/lib.rs Normal file
View File

@ -0,0 +1,19 @@
use std::thread;
#[no_mangle]
pub extern fn process() {
let handles: Vec<_> = (0..10).map(|_| {
thread::spawn(|| {
let mut x = 0;
for _ in 0..5_000_000 {
x += 1
}
x // return
})
}).collect();
for h in handles {
println!("Thread finished with count={}",
h.join().map_err(|_| "Could not join a thread").unwrap());
}
}

41
guessing_game/Cargo.lock generated Normal file
View File

@ -0,0 +1,41 @@
[root]
name = "guessing_game"
version = "0.1.0"
dependencies = [
"rand 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "advapi32-sys"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "libc"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "rand"
version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"advapi32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "winapi"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi-build"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"

7
guessing_game/Cargo.toml Normal file
View File

@ -0,0 +1,7 @@
[package]
name = "guessing_game"
version = "0.1.0"
authors = ["Tim Warren <twarren@nexient.com>"]
[dependencies]
rand = "0.3.0"

38
guessing_game/src/main.rs Normal file
View File

@ -0,0 +1,38 @@
extern crate rand;
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
// Infinite loop
loop {
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.ok()
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
}