Kaynağa Gözat

Moved Omq to it's own crate.

Kyle Fredrickson 1 yıl önce
ebeveyn
işleme
ec5b903056

+ 8 - 1
baseline/Cargo.lock

@@ -6,7 +6,7 @@ version = 3
 name = "baseline"
 version = "0.1.0"
 dependencies = [
- "otils",
+ "omq",
 ]
 
 [[package]]
@@ -15,6 +15,13 @@ version = "1.0.98"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f"
 
+[[package]]
+name = "omq"
+version = "0.1.0"
+dependencies = [
+ "otils",
+]
+
 [[package]]
 name = "otils"
 version = "0.1.0"

+ 1 - 1
baseline/Cargo.toml

@@ -4,7 +4,7 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
-otils = { path = "../otils" }
+omq = { path = "../omq" }
 
 [package.metadata.fortanix-sgx]
 stack-size=0x400000

+ 1 - 5
baseline/src/main.rs

@@ -1,8 +1,4 @@
-#![feature(test)]
-
-mod omq;
-use crate::omq::{Fetch, Omq, Send};
-// use crate::types::{fetch::Fetch, send::Send};
+use omq::{Fetch, Omq, Send};
 
 fn main() {
     let mut o = Omq::new();

+ 0 - 96
baseline/src/omq/mod.rs

@@ -1,96 +0,0 @@
-mod types;
-use otils::ObliviousOps;
-pub use types::{Fetch, Request, Send};
-
-#[derive(Debug)]
-pub struct Omq {
-    message_store: Vec<Request>,
-}
-
-impl Omq {
-    pub fn new() -> Self {
-        Omq {
-            message_store: Vec::new(),
-        }
-    }
-
-    fn update_store(&mut self, fetches: Vec<Fetch>, fetch_sum: usize) {
-        let mut size = (self.message_store.len() + fetches.len() + fetch_sum).next_power_of_two();
-
-        size -= self.message_store.len();
-        self.message_store.reserve(size);
-
-        size -= fetch_sum + fetches.len();
-        for fetch in fetches.iter() {
-            self.message_store
-                .extend(Request::dummies(fetch.receiver, fetch.volume));
-        }
-
-        self.message_store.extend(
-            fetches
-                .into_iter()
-                .map(|x| <Fetch as Into<Request>>::into(x)),
-        );
-
-        self.message_store.extend(Request::dummies(-1, size)); // TODO this is hacky
-    }
-
-    pub fn batch_send(&mut self, sends: Vec<Send>) {
-        let requests = sends
-            .into_iter()
-            .map(|send| <Send as Into<Request>>::into(send));
-        self.message_store.extend(requests);
-    }
-
-    pub fn batch_fetch(&mut self, fetches: Vec<Fetch>) -> Vec<Send> {
-        let final_size = self.message_store.len();
-        let fetch_sum = fetches.iter().fold(0, |acc, f| acc + f.volume) as usize;
-        self.update_store(fetches, fetch_sum);
-
-        otils::osort(&mut self.message_store[..], 8);
-
-        let mut user_sum: isize = 0;
-        let mut prev_user: i64 = -1;
-        for request in self.message_store.iter_mut() {
-            let same_user = prev_user == request.receiver;
-            user_sum = isize::oselect(same_user, user_sum, 0);
-
-            let fetch_more = user_sum > 0;
-            request.mark = u32::oselect(request.is_fetch(), 0, u32::oselect(fetch_more, 1, 0));
-
-            prev_user = request.receiver;
-            user_sum += isize::oselect(
-                request.is_fetch(),
-                request.volume as isize,
-                isize::oselect(fetch_more, -1, 0),
-            );
-        }
-
-        otils::ocompact(&mut self.message_store[..], |r| r.should_deliver(), 8);
-        let deliver = self.message_store[0..fetch_sum].to_vec();
-
-        otils::ocompact(&mut self.message_store[..], |r| r.should_defer(), 8);
-        self.message_store.truncate(final_size);
-
-        deliver.into_iter().map(|x| x.into()).collect()
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-
-    extern crate test;
-    use test::Bencher;
-
-    #[bench]
-    fn bench_fetch(b: &mut Bencher) {
-        let mut o = Omq::new();
-        let sends: Vec<Send> = (0..0x100000)
-            .map(|x| Send::new(0, x.try_into().unwrap()))
-            .collect();
-        o.batch_send(sends);
-
-        b.iter(|| o.batch_fetch(vec![Fetch::new(0, 0x80000)]));
-    }
-}

+ 23 - 0
omq/Cargo.lock

@@ -0,0 +1,23 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "cc"
+version = "1.0.98"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f"
+
+[[package]]
+name = "omq"
+version = "0.1.0"
+dependencies = [
+ "otils",
+]
+
+[[package]]
+name = "otils"
+version = "0.1.0"
+dependencies = [
+ "cc",
+]

+ 1 - 0
omq/Cargo.toml

@@ -4,3 +4,4 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
+otils = { path = "../otils" }

+ 90 - 6
omq/src/lib.rs

@@ -1,14 +1,98 @@
-pub fn add(left: usize, right: usize) -> usize {
-    left + right
+#![feature(test)]
+
+mod types;
+use otils::ObliviousOps;
+pub use types::{Fetch, Request, Send};
+
+#[derive(Debug)]
+pub struct Omq {
+    message_store: Vec<Request>,
+}
+
+impl Omq {
+    pub fn new() -> Self {
+        Omq {
+            message_store: Vec::new(),
+        }
+    }
+
+    fn update_store(&mut self, fetches: Vec<Fetch>, fetch_sum: usize) {
+        let mut size = (self.message_store.len() + fetches.len() + fetch_sum).next_power_of_two();
+
+        size -= self.message_store.len();
+        self.message_store.reserve(size);
+
+        size -= fetch_sum + fetches.len();
+        for fetch in fetches.iter() {
+            self.message_store
+                .extend(Request::dummies(fetch.receiver, fetch.volume));
+        }
+
+        self.message_store.extend(
+            fetches
+                .into_iter()
+                .map(|x| <Fetch as Into<Request>>::into(x)),
+        );
+
+        self.message_store.extend(Request::dummies(-1, size)); // TODO this is hacky
+    }
+
+    pub fn batch_send(&mut self, sends: Vec<Send>) {
+        let requests = sends
+            .into_iter()
+            .map(|send| <Send as Into<Request>>::into(send));
+        self.message_store.extend(requests);
+    }
+
+    pub fn batch_fetch(&mut self, fetches: Vec<Fetch>) -> Vec<Send> {
+        let final_size = self.message_store.len();
+        let fetch_sum = fetches.iter().fold(0, |acc, f| acc + f.volume) as usize;
+        self.update_store(fetches, fetch_sum);
+
+        otils::osort(&mut self.message_store[..], 8);
+
+        let mut user_sum: isize = 0;
+        let mut prev_user: i64 = -1;
+        for request in self.message_store.iter_mut() {
+            let same_user = prev_user == request.receiver;
+            user_sum = isize::oselect(same_user, user_sum, 0);
+
+            let fetch_more = user_sum > 0;
+            request.mark = u32::oselect(request.is_fetch(), 0, u32::oselect(fetch_more, 1, 0));
+
+            prev_user = request.receiver;
+            user_sum += isize::oselect(
+                request.is_fetch(),
+                request.volume as isize,
+                isize::oselect(fetch_more, -1, 0),
+            );
+        }
+
+        otils::ocompact(&mut self.message_store[..], |r| r.should_deliver(), 8);
+        let deliver = self.message_store[0..fetch_sum].to_vec();
+
+        otils::ocompact(&mut self.message_store[..], |r| r.should_defer(), 8);
+        self.message_store.truncate(final_size);
+
+        deliver.into_iter().map(|x| x.into()).collect()
+    }
 }
 
 #[cfg(test)]
 mod tests {
     use super::*;
 
-    #[test]
-    fn it_works() {
-        let result = add(2, 2);
-        assert_eq!(result, 4);
+    extern crate test;
+    use test::Bencher;
+
+    #[bench]
+    fn bench_fetch(b: &mut Bencher) {
+        let mut o = Omq::new();
+        let sends: Vec<Send> = (0..0x100000)
+            .map(|x| Send::new(0, x.try_into().unwrap()))
+            .collect();
+        o.batch_send(sends);
+
+        b.iter(|| o.batch_fetch(vec![Fetch::new(0, 0x80000)]));
     }
 }

+ 0 - 0
baseline/src/omq/types/fetch.rs → omq/src/types/fetch.rs


+ 0 - 0
baseline/src/omq/types/mod.rs → omq/src/types/mod.rs


+ 1 - 1
baseline/src/omq/types/request.rs → omq/src/types/request.rs

@@ -1,4 +1,4 @@
-use crate::omq::{Fetch, Send};
+use crate::{Fetch, Send};
 use otils::ObliviousOps;
 use std::{cmp::Ordering, time::UNIX_EPOCH};
 

+ 1 - 1
baseline/src/omq/types/send.rs → omq/src/types/send.rs

@@ -1,5 +1,5 @@
 // use crate::types::Request;
-use crate::omq::Request;
+use crate::Request;
 
 #[derive(Debug)]
 pub struct Send {