From 6f56bad98768674e740624bf50e7f28a9cb08be8 Mon Sep 17 00:00:00 2001 From: lrlna Date: Sat, 5 Jan 2019 15:36:16 +0100 Subject: [PATCH 1/6] gen_machine_id wasm compatible --- Cargo.toml | 4 +++- src/lib.rs | 4 +++- src/oid.rs | 13 ++++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index f7b4e98b..dd0be8b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,11 +29,13 @@ serde = "1.0" serde_json = { version = "1.0", features = ["preserve_order"] } time = "0.1" linked-hash-map = "0.5" -hostname = "0.1" hex = "0.3" md5 = "0.3" try_from = "0.2" +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +hostname = "0.1" + [dev-dependencies] assert_matches = "1.2" serde_derive = "1.0" diff --git a/src/lib.rs b/src/lib.rs index c7b672e8..f493df4e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,7 +45,6 @@ extern crate byteorder; extern crate chrono; extern crate hex; -extern crate hostname; extern crate libc; extern crate linked_hash_map; extern crate rand; @@ -56,6 +55,9 @@ extern crate md5; extern crate time; extern crate try_from; +#[cfg(not(target_arch = "wasm32"))] +extern crate hostname; + pub use self::bson::{Array, Bson, Document, TimeStamp, UtcDateTime}; pub use self::decoder::{decode_document, decode_document_utf8_lossy, from_bson, Decoder, DecoderError, DecoderResult}; pub use self::encoder::{encode_document, to_bson, Encoder, EncoderError, EncoderResult}; diff --git a/src/oid.rs b/src/oid.rs index ec1fbb4c..6e7c05e0 100644 --- a/src/oid.rs +++ b/src/oid.rs @@ -6,13 +6,16 @@ use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT}; use std::{error, fmt, io, result}; use byteorder::{BigEndian, ByteOrder, LittleEndian}; -use md5; use hex::{self, FromHexError}; use rand::{thread_rng, Rng}; +#[cfg(not(target_arch = "wasm32"))] +use md5; +#[cfg(not(target_arch = "wasm32"))] use hostname::get_hostname; + use time; const TIMESTAMP_SIZE: usize = 4; @@ -197,6 +200,7 @@ impl ObjectId { // Generates a new machine id represented as an MD5-hashed 3-byte-encoded hostname string. // Represented in Little Endian. + #[cfg(not(target_arch = "wasm32"))] fn gen_machine_id() -> Result<[u8; 3]> { // Short-circuit if machine id has already been calculated. // Since the generated machine id is not variable, arising race conditions @@ -230,6 +234,13 @@ impl ObjectId { Ok(vec) } + #[cfg(target_arch = "wasm32")] + fn gen_machine_id() -> Result<[u8; 3]> { + let mut rng = rand::thread_rng(); + let vec: [u8; 3] = [ rng.gen(), rng.gen(), rng.gen() ]; + Ok(vec) + } + // Gets the process ID and returns it as a 2-byte array. // Represented in Little Endian. fn gen_process_id() -> [u8; 2] { From 420b194e3802975c23dd88695317acff932ab6f1 Mon Sep 17 00:00:00 2001 From: lrlna Date: Sat, 5 Jan 2019 15:58:25 +0100 Subject: [PATCH 2/6] gen_process_id wasm compatible --- src/oid.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/oid.rs b/src/oid.rs index 6e7c05e0..72e7acc1 100644 --- a/src/oid.rs +++ b/src/oid.rs @@ -1,7 +1,5 @@ //! ObjectId -use libc; - use std::sync::atomic::{AtomicUsize, Ordering, ATOMIC_USIZE_INIT}; use std::{error, fmt, io, result}; @@ -11,10 +9,12 @@ use hex::{self, FromHexError}; use rand::{thread_rng, Rng}; -#[cfg(not(target_arch = "wasm32"))] -use md5; #[cfg(not(target_arch = "wasm32"))] use hostname::get_hostname; +#[cfg(not(target_arch = "wasm32"))] +use libc; +#[cfg(not(target_arch = "wasm32"))] +use md5; use time; @@ -31,6 +31,7 @@ const COUNTER_OFFSET: usize = PROCESS_ID_OFFSET + PROCESS_ID_SIZE; const MAX_U24: usize = 0xFFFFFF; static OID_COUNTER: AtomicUsize = ATOMIC_USIZE_INIT; +#[cfg(not(target_arch = "wasm32"))] static mut MACHINE_BYTES: Option<[u8; 3]> = None; /// Errors that can occur during OID construction and generation. @@ -234,15 +235,17 @@ impl ObjectId { Ok(vec) } + // In case of wasm compilation generates a random 3-byte array. #[cfg(target_arch = "wasm32")] fn gen_machine_id() -> Result<[u8; 3]> { let mut rng = rand::thread_rng(); - let vec: [u8; 3] = [ rng.gen(), rng.gen(), rng.gen() ]; + let vec: [u8; 3] = [rng.gen(), rng.gen(), rng.gen()]; Ok(vec) } // Gets the process ID and returns it as a 2-byte array. // Represented in Little Endian. + #[cfg(not(target_arch = "wasm32"))] fn gen_process_id() -> [u8; 2] { let pid = unsafe { libc::getpid() as u16 }; let mut buf: [u8; 2] = [0; 2]; @@ -250,6 +253,14 @@ impl ObjectId { buf } + // In case of wasm return a random 2-byte array. + #[cfg(target_arch = "wasm32")] + fn gen_process_id() -> [u8; 2] { + let mut rng = rand::thread_rng(); + let vec: [u8; 2] = [rng.gen(), rng.gen()]; + vec + } + // Gets an incremental 3-byte count. // Represented in Big Endian. fn gen_count() -> Result<[u8; 3]> { @@ -290,6 +301,7 @@ impl fmt::Debug for ObjectId { } #[test] +#[cfg(not(target_arch = "wasm32"))] fn pid_generation() { let pid = unsafe { libc::getpid() as u16 }; let generated = ObjectId::gen_process_id(); From f6eead902bacb348047985a5b597c2ee2394b413 Mon Sep 17 00:00:00 2001 From: lrlna Date: Sat, 5 Jan 2019 16:03:08 +0100 Subject: [PATCH 3/6] add caching to wasm32 --- src/oid.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/oid.rs b/src/oid.rs index 72e7acc1..348a7fb6 100644 --- a/src/oid.rs +++ b/src/oid.rs @@ -31,7 +31,6 @@ const COUNTER_OFFSET: usize = PROCESS_ID_OFFSET + PROCESS_ID_SIZE; const MAX_U24: usize = 0xFFFFFF; static OID_COUNTER: AtomicUsize = ATOMIC_USIZE_INIT; -#[cfg(not(target_arch = "wasm32"))] static mut MACHINE_BYTES: Option<[u8; 3]> = None; /// Errors that can occur during OID construction and generation. @@ -238,8 +237,19 @@ impl ObjectId { // In case of wasm compilation generates a random 3-byte array. #[cfg(target_arch = "wasm32")] fn gen_machine_id() -> Result<[u8; 3]> { + // Short-circuit if machine id has already been calculated. + // Since the generated machine id is not variable, arising race conditions + // will have the same MACHINE_BYTES result. + unsafe { + if let Some(bytes) = MACHINE_BYTES.as_ref() { + return Ok(bytes.clone()); + } + } + let mut rng = rand::thread_rng(); let vec: [u8; 3] = [rng.gen(), rng.gen(), rng.gen()]; + + unsafe { MACHINE_BYTES = Some(vec) }; Ok(vec) } @@ -301,7 +311,7 @@ impl fmt::Debug for ObjectId { } #[test] -#[cfg(not(target_arch = "wasm32"))] +#[cfg(not(target_arch = "wasm33"))] fn pid_generation() { let pid = unsafe { libc::getpid() as u16 }; let generated = ObjectId::gen_process_id(); From 28a8bed371d941f80a44f87791cd734692e1a373 Mon Sep 17 00:00:00 2001 From: lrlna Date: Sat, 5 Jan 2019 16:05:31 +0100 Subject: [PATCH 4/6] add a travis check for wasm target --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 6e6daa6c..10effe1d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,6 +14,7 @@ sudo: false script: - cargo build -v + - cargo check --target wasm32-unknown-unknown - cargo test -v --no-fail-fast - cargo test -v --no-fail-fast --features u2i - cd serde-tests && cargo test -v --no-fail-fast From e4f09e78f201f95f2b8427b7eda36f794715e7e2 Mon Sep 17 00:00:00 2001 From: lrlna Date: Sat, 5 Jan 2019 16:21:09 +0100 Subject: [PATCH 5/6] move libc to target not wasm32 deps --- Cargo.toml | 1 + src/lib.rs | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index dd0be8b1..1cb18add 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,7 @@ try_from = "0.2" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] hostname = "0.1" +libc = "0.2" [dev-dependencies] assert_matches = "1.2" diff --git a/src/lib.rs b/src/lib.rs index f493df4e..f74e3438 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,7 +45,6 @@ extern crate byteorder; extern crate chrono; extern crate hex; -extern crate libc; extern crate linked_hash_map; extern crate rand; extern crate serde; @@ -57,6 +56,8 @@ extern crate try_from; #[cfg(not(target_arch = "wasm32"))] extern crate hostname; +#[cfg(not(target_arch = "wasm32"))] +extern crate libc; pub use self::bson::{Array, Bson, Document, TimeStamp, UtcDateTime}; pub use self::decoder::{decode_document, decode_document_utf8_lossy, from_bson, Decoder, DecoderError, DecoderResult}; From 3b98bf498c2fa16f60184f654ba633b093e5a82a Mon Sep 17 00:00:00 2001 From: lrlna Date: Sat, 5 Jan 2019 16:32:41 +0100 Subject: [PATCH 6/6] add rustup target to travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 10effe1d..a790b7c1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ env: sudo: false script: + - rustup target add wasm32-unknown-unknown - cargo build -v - cargo check --target wasm32-unknown-unknown - cargo test -v --no-fail-fast