diff --git a/src/timer.rs b/src/timer.rs index 7d9e45a..d8048ab 100644 --- a/src/timer.rs +++ b/src/timer.rs @@ -1,8 +1,8 @@ // The `timer` module is a copy-paste from the code of `futures-timer`, but // adjusted for WASM. -// +// // Copyright (c) 2014 Alex Crichton -// +// // Permission is hereby granted, free of charge, to any // person obtaining a copy of this software and associated // documentation files (the "Software"), to deal in the @@ -12,11 +12,11 @@ // the Software, and to permit persons to whom the Software // is furnished to do so, subject to the following // conditions: -// +// // The above copyright notice and this permission notice // shall be included in all copies or substantial portions // of the Software. -// +// // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED // TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A @@ -26,203 +26,203 @@ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR // IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. -// - // Apache License - // Version 2.0, January 2004 - // http://www.apache.org/licenses/ -// +// +// Apache License +// Version 2.0, January 2004 +// http://www.apache.org/licenses/ +// // TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -// +// // 1. Definitions. -// - // "License" shall mean the terms and conditions for use, reproduction, - // and distribution as defined by Sections 1 through 9 of this document. -// - // "Licensor" shall mean the copyright owner or entity authorized by - // the copyright owner that is granting the License. -// - // "Legal Entity" shall mean the union of the acting entity and all - // other entities that control, are controlled by, or are under common - // control with that entity. For the purposes of this definition, - // "control" means (i) the power, direct or indirect, to cause the - // direction or management of such entity, whether by contract or - // otherwise, or (ii) ownership of fifty percent (50%) or more of the - // outstanding shares, or (iii) beneficial ownership of such entity. -// - // "You" (or "Your") shall mean an individual or Legal Entity - // exercising permissions granted by this License. -// - // "Source" form shall mean the preferred form for making modifications, - // including but not limited to software source code, documentation - // source, and configuration files. -// - // "Object" form shall mean any form resulting from mechanical - // transformation or translation of a Source form, including but - // not limited to compiled object code, generated documentation, - // and conversions to other media types. -// - // "Work" shall mean the work of authorship, whether in Source or - // Object form, made available under the License, as indicated by a - // copyright notice that is included in or attached to the work - // (an example is provided in the Appendix below). -// - // "Derivative Works" shall mean any work, whether in Source or Object - // form, that is based on (or derived from) the Work and for which the - // editorial revisions, annotations, elaborations, or other modifications - // represent, as a whole, an original work of authorship. For the purposes - // of this License, Derivative Works shall not include works that remain - // separable from, or merely link (or bind by name) to the interfaces of, - // the Work and Derivative Works thereof. -// - // "Contribution" shall mean any work of authorship, including - // the original version of the Work and any modifications or additions - // to that Work or Derivative Works thereof, that is intentionally - // submitted to Licensor for inclusion in the Work by the copyright owner - // or by an individual or Legal Entity authorized to submit on behalf of - // the copyright owner. For the purposes of this definition, "submitted" - // means any form of electronic, verbal, or written communication sent - // to the Licensor or its representatives, including but not limited to - // communication on electronic mailing lists, source code control systems, - // and issue tracking systems that are managed by, or on behalf of, the - // Licensor for the purpose of discussing and improving the Work, but - // excluding communication that is conspicuously marked or otherwise - // designated in writing by the copyright owner as "Not a Contribution." -// - // "Contributor" shall mean Licensor and any individual or Legal Entity - // on behalf of whom a Contribution has been received by Licensor and - // subsequently incorporated within the Work. -// +// +// "License" shall mean the terms and conditions for use, reproduction, +// and distribution as defined by Sections 1 through 9 of this document. +// +// "Licensor" shall mean the copyright owner or entity authorized by +// the copyright owner that is granting the License. +// +// "Legal Entity" shall mean the union of the acting entity and all +// other entities that control, are controlled by, or are under common +// control with that entity. For the purposes of this definition, +// "control" means (i) the power, direct or indirect, to cause the +// direction or management of such entity, whether by contract or +// otherwise, or (ii) ownership of fifty percent (50%) or more of the +// outstanding shares, or (iii) beneficial ownership of such entity. +// +// "You" (or "Your") shall mean an individual or Legal Entity +// exercising permissions granted by this License. +// +// "Source" form shall mean the preferred form for making modifications, +// including but not limited to software source code, documentation +// source, and configuration files. +// +// "Object" form shall mean any form resulting from mechanical +// transformation or translation of a Source form, including but +// not limited to compiled object code, generated documentation, +// and conversions to other media types. +// +// "Work" shall mean the work of authorship, whether in Source or +// Object form, made available under the License, as indicated by a +// copyright notice that is included in or attached to the work +// (an example is provided in the Appendix below). +// +// "Derivative Works" shall mean any work, whether in Source or Object +// form, that is based on (or derived from) the Work and for which the +// editorial revisions, annotations, elaborations, or other modifications +// represent, as a whole, an original work of authorship. For the purposes +// of this License, Derivative Works shall not include works that remain +// separable from, or merely link (or bind by name) to the interfaces of, +// the Work and Derivative Works thereof. +// +// "Contribution" shall mean any work of authorship, including +// the original version of the Work and any modifications or additions +// to that Work or Derivative Works thereof, that is intentionally +// submitted to Licensor for inclusion in the Work by the copyright owner +// or by an individual or Legal Entity authorized to submit on behalf of +// the copyright owner. For the purposes of this definition, "submitted" +// means any form of electronic, verbal, or written communication sent +// to the Licensor or its representatives, including but not limited to +// communication on electronic mailing lists, source code control systems, +// and issue tracking systems that are managed by, or on behalf of, the +// Licensor for the purpose of discussing and improving the Work, but +// excluding communication that is conspicuously marked or otherwise +// designated in writing by the copyright owner as "Not a Contribution." +// +// "Contributor" shall mean Licensor and any individual or Legal Entity +// on behalf of whom a Contribution has been received by Licensor and +// subsequently incorporated within the Work. +// // 2. Grant of Copyright License. Subject to the terms and conditions of - // this License, each Contributor hereby grants to You a perpetual, - // worldwide, non-exclusive, no-charge, royalty-free, irrevocable - // copyright license to reproduce, prepare Derivative Works of, - // publicly display, publicly perform, sublicense, and distribute the - // Work and such Derivative Works in Source or Object form. -// +// this License, each Contributor hereby grants to You a perpetual, +// worldwide, non-exclusive, no-charge, royalty-free, irrevocable +// copyright license to reproduce, prepare Derivative Works of, +// publicly display, publicly perform, sublicense, and distribute the +// Work and such Derivative Works in Source or Object form. +// // 3. Grant of Patent License. Subject to the terms and conditions of - // this License, each Contributor hereby grants to You a perpetual, - // worldwide, non-exclusive, no-charge, royalty-free, irrevocable - // (except as stated in this section) patent license to make, have made, - // use, offer to sell, sell, import, and otherwise transfer the Work, - // where such license applies only to those patent claims licensable - // by such Contributor that are necessarily infringed by their - // Contribution(s) alone or by combination of their Contribution(s) - // with the Work to which such Contribution(s) was submitted. If You - // institute patent litigation against any entity (including a - // cross-claim or counterclaim in a lawsuit) alleging that the Work - // or a Contribution incorporated within the Work constitutes direct - // or contributory patent infringement, then any patent licenses - // granted to You under this License for that Work shall terminate - // as of the date such litigation is filed. -// +// this License, each Contributor hereby grants to You a perpetual, +// worldwide, non-exclusive, no-charge, royalty-free, irrevocable +// (except as stated in this section) patent license to make, have made, +// use, offer to sell, sell, import, and otherwise transfer the Work, +// where such license applies only to those patent claims licensable +// by such Contributor that are necessarily infringed by their +// Contribution(s) alone or by combination of their Contribution(s) +// with the Work to which such Contribution(s) was submitted. If You +// institute patent litigation against any entity (including a +// cross-claim or counterclaim in a lawsuit) alleging that the Work +// or a Contribution incorporated within the Work constitutes direct +// or contributory patent infringement, then any patent licenses +// granted to You under this License for that Work shall terminate +// as of the date such litigation is filed. +// // 4. Redistribution. You may reproduce and distribute copies of the - // Work or Derivative Works thereof in any medium, with or without - // modifications, and in Source or Object form, provided that You - // meet the following conditions: -// - // (a) You must give any other recipients of the Work or - // Derivative Works a copy of this License; and -// - // (b) You must cause any modified files to carry prominent notices - // stating that You changed the files; and -// - // (c) You must retain, in the Source form of any Derivative Works - // that You distribute, all copyright, patent, trademark, and - // attribution notices from the Source form of the Work, - // excluding those notices that do not pertain to any part of - // the Derivative Works; and -// - // (d) If the Work includes a "NOTICE" text file as part of its - // distribution, then any Derivative Works that You distribute must - // include a readable copy of the attribution notices contained - // within such NOTICE file, excluding those notices that do not - // pertain to any part of the Derivative Works, in at least one - // of the following places: within a NOTICE text file distributed - // as part of the Derivative Works; within the Source form or - // documentation, if provided along with the Derivative Works; or, - // within a display generated by the Derivative Works, if and - // wherever such third-party notices normally appear. The contents - // of the NOTICE file are for informational purposes only and - // do not modify the License. You may add Your own attribution - // notices within Derivative Works that You distribute, alongside - // or as an addendum to the NOTICE text from the Work, provided - // that such additional attribution notices cannot be construed - // as modifying the License. -// - // You may add Your own copyright statement to Your modifications and - // may provide additional or different license terms and conditions - // for use, reproduction, or distribution of Your modifications, or - // for any such Derivative Works as a whole, provided Your use, - // reproduction, and distribution of the Work otherwise complies with - // the conditions stated in this License. -// +// Work or Derivative Works thereof in any medium, with or without +// modifications, and in Source or Object form, provided that You +// meet the following conditions: +// +// (a) You must give any other recipients of the Work or +// Derivative Works a copy of this License; and +// +// (b) You must cause any modified files to carry prominent notices +// stating that You changed the files; and +// +// (c) You must retain, in the Source form of any Derivative Works +// that You distribute, all copyright, patent, trademark, and +// attribution notices from the Source form of the Work, +// excluding those notices that do not pertain to any part of +// the Derivative Works; and +// +// (d) If the Work includes a "NOTICE" text file as part of its +// distribution, then any Derivative Works that You distribute must +// include a readable copy of the attribution notices contained +// within such NOTICE file, excluding those notices that do not +// pertain to any part of the Derivative Works, in at least one +// of the following places: within a NOTICE text file distributed +// as part of the Derivative Works; within the Source form or +// documentation, if provided along with the Derivative Works; or, +// within a display generated by the Derivative Works, if and +// wherever such third-party notices normally appear. The contents +// of the NOTICE file are for informational purposes only and +// do not modify the License. You may add Your own attribution +// notices within Derivative Works that You distribute, alongside +// or as an addendum to the NOTICE text from the Work, provided +// that such additional attribution notices cannot be construed +// as modifying the License. +// +// You may add Your own copyright statement to Your modifications and +// may provide additional or different license terms and conditions +// for use, reproduction, or distribution of Your modifications, or +// for any such Derivative Works as a whole, provided Your use, +// reproduction, and distribution of the Work otherwise complies with +// the conditions stated in this License. +// // 5. Submission of Contributions. Unless You explicitly state otherwise, - // any Contribution intentionally submitted for inclusion in the Work - // by You to the Licensor shall be under the terms and conditions of - // this License, without any additional terms or conditions. - // Notwithstanding the above, nothing herein shall supersede or modify - // the terms of any separate license agreement you may have executed - // with Licensor regarding such Contributions. -// +// any Contribution intentionally submitted for inclusion in the Work +// by You to the Licensor shall be under the terms and conditions of +// this License, without any additional terms or conditions. +// Notwithstanding the above, nothing herein shall supersede or modify +// the terms of any separate license agreement you may have executed +// with Licensor regarding such Contributions. +// // 6. Trademarks. This License does not grant permission to use the trade - // names, trademarks, service marks, or product names of the Licensor, - // except as required for reasonable and customary use in describing the - // origin of the Work and reproducing the content of the NOTICE file. -// +// names, trademarks, service marks, or product names of the Licensor, +// except as required for reasonable and customary use in describing the +// origin of the Work and reproducing the content of the NOTICE file. +// // 7. Disclaimer of Warranty. Unless required by applicable law or - // agreed to in writing, Licensor provides the Work (and each - // Contributor provides its Contributions) on an "AS IS" BASIS, - // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - // implied, including, without limitation, any warranties or conditions - // of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - // PARTICULAR PURPOSE. You are solely responsible for determining the - // appropriateness of using or redistributing the Work and assume any - // risks associated with Your exercise of permissions under this License. -// +// agreed to in writing, Licensor provides the Work (and each +// Contributor provides its Contributions) on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +// implied, including, without limitation, any warranties or conditions +// of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +// PARTICULAR PURPOSE. You are solely responsible for determining the +// appropriateness of using or redistributing the Work and assume any +// risks associated with Your exercise of permissions under this License. +// // 8. Limitation of Liability. In no event and under no legal theory, - // whether in tort (including negligence), contract, or otherwise, - // unless required by applicable law (such as deliberate and grossly - // negligent acts) or agreed to in writing, shall any Contributor be - // liable to You for damages, including any direct, indirect, special, - // incidental, or consequential damages of any character arising as a - // result of this License or out of the use or inability to use the - // Work (including but not limited to damages for loss of goodwill, - // work stoppage, computer failure or malfunction, or any and all - // other commercial damages or losses), even if such Contributor - // has been advised of the possibility of such damages. -// +// whether in tort (including negligence), contract, or otherwise, +// unless required by applicable law (such as deliberate and grossly +// negligent acts) or agreed to in writing, shall any Contributor be +// liable to You for damages, including any direct, indirect, special, +// incidental, or consequential damages of any character arising as a +// result of this License or out of the use or inability to use the +// Work (including but not limited to damages for loss of goodwill, +// work stoppage, computer failure or malfunction, or any and all +// other commercial damages or losses), even if such Contributor +// has been advised of the possibility of such damages. +// // 9. Accepting Warranty or Additional Liability. While redistributing - // the Work or Derivative Works thereof, You may choose to offer, - // and charge a fee for, acceptance of support, warranty, indemnity, - // or other liability obligations and/or rights consistent with this - // License. However, in accepting such obligations, You may act only - // on Your own behalf and on Your sole responsibility, not on behalf - // of any other Contributor, and only if You agree to indemnify, - // defend, and hold each Contributor harmless for any liability - // incurred by, or claims asserted against, such Contributor by reason - // of your accepting any such warranty or additional liability. -// +// the Work or Derivative Works thereof, You may choose to offer, +// and charge a fee for, acceptance of support, warranty, indemnity, +// or other liability obligations and/or rights consistent with this +// License. However, in accepting such obligations, You may act only +// on Your own behalf and on Your sole responsibility, not on behalf +// of any other Contributor, and only if You agree to indemnify, +// defend, and hold each Contributor harmless for any liability +// incurred by, or claims asserted against, such Contributor by reason +// of your accepting any such warranty or additional liability. +// // END OF TERMS AND CONDITIONS -// +// // APPENDIX: How to apply the Apache License to your work. -// - // To apply the Apache License to your work, attach the following - // boilerplate notice, with the fields enclosed by brackets "[]" - // replaced with your own identifying information. (Don't include - // the brackets!) The text should be enclosed in the appropriate - // comment syntax for the file format. We also recommend that a - // file or class name and description of purpose be included on the - // same "printed page" as the copyright notice for easier - // identification within third-party archives. -// +// +// To apply the Apache License to your work, attach the following +// boilerplate notice, with the fields enclosed by brackets "[]" +// replaced with your own identifying information. (Don't include +// the brackets!) The text should be enclosed in the appropriate +// comment syntax for the file format. We also recommend that a +// file or class name and description of purpose be included on the +// same "printed page" as the copyright notice for easier +// identification within third-party archives. +// // Copyright [yyyy] [name of copyright owner] -// +// // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at -// - // http://www.apache.org/licenses/LICENSE-2.0 -// +// +// http://www.apache.org/licenses/LICENSE-2.0 +// // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -231,13 +231,13 @@ use crate::Instant; use std::cmp::Ordering; +use std::fmt; use std::mem; use std::pin::Pin; use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering::SeqCst; use std::sync::{Arc, Mutex, Weak}; use std::task::{Context, Poll}; -use std::fmt; use futures::prelude::*; use futures::task::AtomicWaker; @@ -619,7 +619,8 @@ impl Default for TimerHandle { impl fmt::Debug for TimerHandle { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> { - f.debug_struct("TimerHandle").field("inner", &"...").finish() + f.debug_struct("TimerHandle") + .field("inner", &"...") + .finish() } } - diff --git a/src/timer/delay.rs b/src/timer/delay.rs index 17cd334..23f6307 100644 --- a/src/timer/delay.rs +++ b/src/timer/delay.rs @@ -15,9 +15,9 @@ use std::time::Duration; use futures::task::AtomicWaker; -use crate::Instant; use crate::timer::arc_list::Node; use crate::timer::{ScheduledTimer, TimerHandle}; +use crate::Instant; /// A future representing the notification that an elapsed duration has /// occurred. diff --git a/src/timer/global/wasm.rs b/src/timer/global/wasm.rs index e8604df..6891ef1 100644 --- a/src/timer/global/wasm.rs +++ b/src/timer/global/wasm.rs @@ -6,7 +6,7 @@ use std::pin::Pin; use std::sync::Arc; use std::task::Context; use std::time::Duration; -use wasm_bindgen::{JsCast, closure::Closure}; +use wasm_bindgen::{closure::Closure, JsCast}; use crate::{Instant, Timer, TimerHandle}; @@ -26,44 +26,50 @@ pub(crate) fn run() -> TimerHandle { /// processes everything. fn schedule_callback(timer: Arc>, when: Duration) { let window = web_sys::window().expect("Unable to access Window"); - let _ = window.set_timeout_with_callback_and_timeout_and_arguments_0( - &Closure::once_into_js(move || { - let mut timer_lock = timer.lock(); + let _ = window + .set_timeout_with_callback_and_timeout_and_arguments_0( + &Closure::once_into_js(move || { + let mut timer_lock = timer.lock(); - // We start by polling the timer. If any new `Delay` is created, the waker will be used - // to wake up this task pre-emptively. As such, we pass a `Waker` that calls - // `schedule_callback` with a delay of `0`. - let waker = Arc::new(Waker { timer: timer.clone() }).into_waker(); - let _ = Future::poll(Pin::new(&mut *timer_lock), &mut Context::from_waker(&waker)); - - // Notify the timers that are ready. - let now = Instant::now(); - timer_lock.advance_to(now); + // We start by polling the timer. If any new `Delay` is created, the waker will be used + // to wake up this task pre-emptively. As such, we pass a `Waker` that calls + // `schedule_callback` with a delay of `0`. + let waker = Arc::new(Waker { + timer: timer.clone(), + }) + .into_waker(); + let _ = Future::poll(Pin::new(&mut *timer_lock), &mut Context::from_waker(&waker)); - // Each call to `schedule_callback` calls `schedule_callback` again, but also leaves - // the possibility for `schedule_callback` to be called in parallel. Since we don't - // want too many useless callbacks, we... - // TODO: ugh, that's a hack - if Arc::strong_count(&timer) > 20 { - return; - } + // Notify the timers that are ready. + let now = Instant::now(); + timer_lock.advance_to(now); - // We call `schedule_callback` again for the next event. - let sleep_dur = timer_lock.next_event() - .map(|next_event| { - if next_event > now { - next_event - now - } else { - Duration::new(0, 0) - } - }) - .unwrap_or(Duration::from_secs(5)); - drop(timer_lock); - schedule_callback(timer, sleep_dur); + // Each call to `schedule_callback` calls `schedule_callback` again, but also leaves + // the possibility for `schedule_callback` to be called in parallel. Since we don't + // want too many useless callbacks, we... + // TODO: ugh, that's a hack + if Arc::strong_count(&timer) > 20 { + return; + } - }).unchecked_ref(), - i32::try_from(when.as_millis()).unwrap_or(0) - ).unwrap(); + // We call `schedule_callback` again for the next event. + let sleep_dur = timer_lock + .next_event() + .map(|next_event| { + if next_event > now { + next_event - now + } else { + Duration::new(0, 0) + } + }) + .unwrap_or(Duration::from_secs(5)); + drop(timer_lock); + schedule_callback(timer, sleep_dur); + }) + .unchecked_ref(), + i32::try_from(when.as_millis()).unwrap_or(0), + ) + .unwrap(); } struct Waker { diff --git a/src/wasm.rs b/src/wasm.rs index b52cfb1..27d5fe9 100644 --- a/src/wasm.rs +++ b/src/wasm.rs @@ -21,8 +21,8 @@ #![cfg(target_arch = "wasm32")] -use std::cmp::{Eq, PartialEq, Ord, PartialOrd, Ordering}; -use std::ops::{Add, Sub, AddAssign, SubAssign}; +use std::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd}; +use std::ops::{Add, AddAssign, Sub, SubAssign}; use std::time::Duration; #[derive(Debug, Copy, Clone)] @@ -77,7 +77,9 @@ impl Add for Instant { fn add(self, other: Duration) -> Instant { let new_val = self.inner + other.as_millis() as f64; - Instant { inner: new_val as f64 } + Instant { + inner: new_val as f64, + } } } @@ -86,7 +88,9 @@ impl Sub for Instant { fn sub(self, other: Duration) -> Instant { let new_val = self.inner - other.as_millis() as f64; - Instant { inner: new_val as f64 } + Instant { + inner: new_val as f64, + } } } @@ -141,7 +145,7 @@ impl SystemTime { pub fn duration_since(&self, earlier: SystemTime) -> Result { let dur_ms = self.inner - earlier.inner; if dur_ms < 0.0 { - return Err(()) + return Err(()); } Ok(Duration::from_millis(dur_ms as u64)) } @@ -164,7 +168,9 @@ impl Add for SystemTime { fn add(self, other: Duration) -> SystemTime { let new_val = self.inner + other.as_millis() as f64; - SystemTime { inner: new_val as f64 } + SystemTime { + inner: new_val as f64, + } } } @@ -173,7 +179,9 @@ impl Sub for SystemTime { fn sub(self, other: Duration) -> SystemTime { let new_val = self.inner - other.as_millis() as f64; - SystemTime { inner: new_val as f64 } + SystemTime { + inner: new_val as f64, + } } }