From 1109819ab6e15aa503e42fbfdd5ada94f34848d2 Mon Sep 17 00:00:00 2001 From: Nicolas Stalder Date: Sun, 31 Jan 2021 12:50:49 +0100 Subject: [PATCH] Prepare for release --- .github/workflows/ci.yml | 24 +++++ .gitignore | 3 + Cargo.toml | 20 ++-- LICENSE-APACHE | 201 +++++++++++++++++++++++++++++++++++++++ LICENSE-MIT | 25 +++++ README.md | 21 ++++ src/lib.rs | 6 +- src/macros.rs | 18 ++-- src/main2.rs | 56 ----------- 9 files changed, 292 insertions(+), 82 deletions(-) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 LICENSE-APACHE create mode 100644 LICENSE-MIT create mode 100644 README.md delete mode 100644 src/main2.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..fdb8cc2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@master + - name: Build + run: cargo build --verbose + - name: Run tests + run: cargo test --verbose + - name: Run example + run: cargo run + + - name: Build Documentation + run: cargo doc --no-deps + - name: Deploy Docs + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./target/doc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f4f0664 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target +Cargo.lock +**/*.bin diff --git a/Cargo.toml b/Cargo.toml index 2e188ea..475b699 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,20 +1,16 @@ [package] name = "interchange" -version = "0.0.0-unreleased" +version = "0.1.0" authors = ["Nicolas Stalder "] edition = "2018" +description = "Request/response mechanism for embedded development, using atomics" +repository = "https://github.com/trussed-dev/interchange" +readme = "README.md" +license = "Apache-2.0 OR MIT" +documentation = "https://docs.rs/interchange" +keywords = ["cortex-m", "nxp", "lpc"] +categories = ["development-tools", "embedded"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[lib] -path = "src/lib.rs" - -[[bin]] -name = "main" -path = "src/main.rs" - -# [[bin]] -# name = "main2" -# path = "src/main2.rs" - [dependencies] diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 0000000..cd482d8 --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,201 @@ +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. + +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. + +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. + +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. + +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. + +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. + +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. + +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. + +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. + +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. + +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 + +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. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..1b92736 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,25 @@ +Copyright (c) 2020 SoloKeys + +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 +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +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 +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d72524d --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ +# interchange + +[github](https://github.com/trussed-dev/interchange) +[docs.rs](https://docs.rs/interchange) +[main](https://trussed-dev.github.io/interchange/interchange/index.html) +[build status](https://github.com/trussed-dev/interchange/actions?query=branch%3Amain) + +#### License + + +Licensed under either of Apache License, Version +2.0 or MIT license at your option. + + +
+ + +Unless you explicitly state otherwise, any contribution intentionally submitted +for inclusion in this crate by you, as defined in the Apache-2.0 license, shall +be dual licensed as above, without any additional terms or conditions. + diff --git a/src/lib.rs b/src/lib.rs index 92d1006..216d4e9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -157,9 +157,9 @@ pub trait Interchange: Sized { type RESPONSE: Clone; /// This is the constructor for a `(Requester, Responder)` pair. /// - /// The first time it is called in the program, it constructs - /// singleton static resources, thereafter, `None` is returned. - fn claim(i: usize) -> Option<(Requester, Responder)>; + /// Returns singleton static instances until all that were allocated are + /// used up, thereafter, `None` is returned. + fn claim() -> Option<(Requester, Responder)>; #[doc(hidden)] unsafe fn rq_ref(&self) -> &Self::REQUEST; diff --git a/src/macros.rs b/src/macros.rs index 58983eb..5407247 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -81,18 +81,14 @@ macro_rules! interchange { type REQUEST = $REQUEST; type RESPONSE = $RESPONSE; - // needs to be a global singleton - fn claim(i: usize) -> Option<($crate::Requester, $crate::Responder)> { - use core::sync::atomic::{AtomicBool, Ordering}; - // static CLAIMED: [AtomicBool; $N] = [AtomicBool::new(false); $N]; - static CLAIMED: [bool; $N] = [false; $N];//AtomicBool::new(false); $N]; - if unsafe { core::mem::transmute::(CLAIMED[i]) } - .compare_exchange_weak(false, true, Ordering::AcqRel, Ordering::Acquire) - .is_ok() - { - Some(Self::split(i)) - } else { + fn claim() -> Option<($crate::Requester, $crate::Responder)> { + use core::sync::atomic::{AtomicUsize, Ordering}; + static LAST_CLAIMED: AtomicUsize = AtomicUsize::new(0); + let index = LAST_CLAIMED.fetch_add(1, Ordering::SeqCst); + if index > $N { None + } else { + Some(Self::split(index)) } } diff --git a/src/main2.rs b/src/main2.rs deleted file mode 100644 index 62d386f..0000000 --- a/src/main2.rs +++ /dev/null @@ -1,56 +0,0 @@ -use interchange::scratch::*; - -pub fn test_happy_path(rq: &mut Requester, rp: &mut Responder) { - assert!(rq.state() == State::Idle); - - let request = Request::This(1, 2); - assert!(rq.request(request).is_ok()); - - let request = rp.request().unwrap(); - println!("rp got request: {:?}", &request); - - let response = Response::There(-1); - assert!(!rp.is_canceled()); - assert!(rp.respond(response).is_ok()); - - let response = rq.response().unwrap(); - println!("rq got response: {:?}", &response); - -} - -pub fn test_early_cancel(rq: &mut Requester, rp: &mut Responder) { - assert!(rq.state() == State::Idle); - - let request = Request::This(1, 2); - assert!(rq.request(request).is_ok()); - - println!("responder could cancel: {:?}", &rq.cancel().unwrap().unwrap()); - - assert!(rp.request().is_none()); - assert!(State::Idle == rq.state()); -} - -pub fn test_later_cancel(rq: &mut Requester, rp: &mut Responder) { - assert!(rq.state() == State::Idle); - - let request = Request::This(1, 2); - assert!(rq.request(request).is_ok()); - - let request = rp.request().unwrap(); - println!("rp got request: {:?}", &request); - - println!("responder could cancel: {:?}", &rq.cancel().unwrap().is_none()); - - assert!(rp.is_canceled()); - assert!(rp.acknowledge_cancel().is_ok()); - assert!(State::Idle == rq.state()); -} - -pub fn main() { - let (mut requester, mut responder) = claim().unwrap(); - - test_happy_path(&mut requester, &mut responder); - test_early_cancel(&mut requester, &mut responder); - test_later_cancel(&mut requester, &mut responder); - -}