From ca87219e01ca3f842d8c3988ed3bacc8dbaf916c Mon Sep 17 00:00:00 2001
From: Anders Nilsson <anders.nilsson@control.lth.se>
Date: Thu, 19 Nov 2015 13:53:35 +0100
Subject: [PATCH] Added membed tutorial

---
 .gitignore       |  3 +++
 embed/Cargo.lock |  4 ++++
 embed/Cargo.toml |  8 ++++++++
 embed/embed.js   |  9 +++++++++
 embed/embed.py   |  7 +++++++
 embed/embed.rb   | 11 +++++++++++
 embed/src/lib.rs | 19 +++++++++++++++++++
 embed/toy.rb     | 18 ++++++++++++++++++
 8 files changed, 79 insertions(+)
 create mode 100644 embed/Cargo.lock
 create mode 100644 embed/Cargo.toml
 create mode 100644 embed/embed.js
 create mode 100644 embed/embed.py
 create mode 100644 embed/embed.rb
 create mode 100644 embed/src/lib.rs
 create mode 100644 embed/toy.rb

diff --git a/.gitignore b/.gitignore
index eb5a316..2273413 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,4 @@
 target
+*~
+
+embed/node_modules
diff --git a/embed/Cargo.lock b/embed/Cargo.lock
new file mode 100644
index 0000000..eefe950
--- /dev/null
+++ b/embed/Cargo.lock
@@ -0,0 +1,4 @@
+[root]
+name = "embed"
+version = "0.1.0"
+
diff --git a/embed/Cargo.toml b/embed/Cargo.toml
new file mode 100644
index 0000000..7d419e4
--- /dev/null
+++ b/embed/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "embed"
+version = "0.1.0"
+authors = ["Anders Nilsson <anders.nilsson@control.lth.se>"]
+
+[lib]
+name ="embed"
+crate-type = ["dylib"]
diff --git a/embed/embed.js b/embed/embed.js
new file mode 100644
index 0000000..a7eafb2
--- /dev/null
+++ b/embed/embed.js
@@ -0,0 +1,9 @@
+var ffi = require('ffi');
+
+var lib = ffi.Library('../target/release/libembed', {
+  'process': ['void', []]
+});
+
+lib.process();
+
+console.log("done!");
diff --git a/embed/embed.py b/embed/embed.py
new file mode 100644
index 0000000..0c05960
--- /dev/null
+++ b/embed/embed.py
@@ -0,0 +1,7 @@
+from ctypes import cdll
+
+lib = cdll.LoadLibrary("../target/release/libembed.so")
+
+lib.process()
+
+print("done!")
diff --git a/embed/embed.rb b/embed/embed.rb
new file mode 100644
index 0000000..964bceb
--- /dev/null
+++ b/embed/embed.rb
@@ -0,0 +1,11 @@
+require 'ffi'
+
+module Hello
+  extend FFI::Library
+  ffi_lib '../target/release/libembed.so'
+  attach_function :process, [], :void
+end
+
+Hello.process
+
+puts 'done!'
diff --git a/embed/src/lib.rs b/embed/src/lib.rs
new file mode 100644
index 0000000..b9f454c
--- /dev/null
+++ b/embed/src/lib.rs
@@ -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..15_000_000) {
+                x += 1
+            }
+            x
+        })
+    }).collect();
+
+    for h in handles {
+        println!("Thread finished with count={}",h.join().map_err(|_|"Could not join a thread!").unwrap());
+    }
+    println!("done!");
+}
diff --git a/embed/toy.rb b/embed/toy.rb
new file mode 100644
index 0000000..ff109a0
--- /dev/null
+++ b/embed/toy.rb
@@ -0,0 +1,18 @@
+threads = []
+
+10.times do
+  threads << Thread.new do
+    count = 0
+
+    15_000_000.times do
+      count += 1
+    end
+
+    count
+  end
+end
+
+threads.each do |t|
+  puts "Thread finished with count=#{t.value}"
+end
+puts "done!"
-- 
GitLab