зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1770894 - Force update memmap2 to 0.3. r=emilio
Differential Revision: https://phabricator.services.mozilla.com/D147255
This commit is contained in:
Родитель
4d1c26ec5d
Коммит
f686964c71
|
@ -219,7 +219,7 @@ dependencies = [
|
||||||
"iovec",
|
"iovec",
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"memmap2 0.2.3",
|
"memmap2 0.2.999",
|
||||||
"mio 0.6.23",
|
"mio 0.6.23",
|
||||||
"mio-named-pipes",
|
"mio-named-pipes",
|
||||||
"mio-uds",
|
"mio-uds",
|
||||||
|
@ -278,7 +278,7 @@ dependencies = [
|
||||||
"iovec",
|
"iovec",
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
"memmap2 0.2.3",
|
"memmap2 0.2.999",
|
||||||
"mio 0.8.0",
|
"mio 0.8.0",
|
||||||
"scopeguard",
|
"scopeguard",
|
||||||
"serde",
|
"serde",
|
||||||
|
@ -3018,7 +3018,7 @@ source = "git+https://github.com/jfkthame/mapped_hyph.git?rev=746743227485a83123
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arrayref",
|
"arrayref",
|
||||||
"log",
|
"log",
|
||||||
"memmap2 0.2.3",
|
"memmap2 0.2.999",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3068,11 +3068,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memmap2"
|
name = "memmap2"
|
||||||
version = "0.2.3"
|
version = "0.2.999"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"memmap2 0.3.1",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -3166,7 +3164,7 @@ dependencies = [
|
||||||
"byteorder",
|
"byteorder",
|
||||||
"goblin",
|
"goblin",
|
||||||
"libc",
|
"libc",
|
||||||
"memmap2 0.2.3",
|
"memmap2 0.2.999",
|
||||||
"memoffset 0.5.6",
|
"memoffset 0.5.6",
|
||||||
"nix",
|
"nix",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
|
|
|
@ -108,6 +108,9 @@ itertools = { path = "build/rust/itertools" }
|
||||||
# Patch redox_users to an empty crate
|
# Patch redox_users to an empty crate
|
||||||
redox_users = { path = "build/rust/redox_users" }
|
redox_users = { path = "build/rust/redox_users" }
|
||||||
|
|
||||||
|
# Patch memmap2 0.2 to 0.3
|
||||||
|
memmap2 = { path = "build/rust/memmap2" }
|
||||||
|
|
||||||
# Patch autocfg to hide rustc output. Workaround for https://github.com/cuviper/autocfg/issues/30
|
# Patch autocfg to hide rustc output. Workaround for https://github.com/cuviper/autocfg/issues/30
|
||||||
autocfg = { path = "third_party/rust/autocfg" }
|
autocfg = { path = "third_party/rust/autocfg" }
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "memmap2"
|
||||||
|
version = "0.2.999"
|
||||||
|
edition = "2018"
|
||||||
|
license = "MPL-2.0"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
memmap2 = "0.3"
|
|
@ -0,0 +1,5 @@
|
||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
pub use memmap2::*;
|
|
@ -81,7 +81,6 @@ TOLERATED_DUPES = {
|
||||||
"crossbeam-utils": 3,
|
"crossbeam-utils": 3,
|
||||||
"futures": 2,
|
"futures": 2,
|
||||||
"libloading": 2,
|
"libloading": 2,
|
||||||
"memmap2": 2,
|
|
||||||
"memoffset": 2,
|
"memoffset": 2,
|
||||||
"mio": 2,
|
"mio": 2,
|
||||||
"pin-project-lite": 2,
|
"pin-project-lite": 2,
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
{"files":{"CHANGELOG.md":"e365ce6fa5522d987eba49f65cb456b0459157fd57cdb255543cbc7534a73976","Cargo.lock":"2845110e68e42db3500fb871e6869890c74eeb5d9896407597e2002e9df771c1","Cargo.toml":"47e1e62ecbc842ab36a59d6c693ce4fadf5d676a6cada6fd313ee48c865771c2","LICENSE-APACHE":"04ea4849dba9dcae07113850c6f1b1a69052c625210639914eee352023f750ad","LICENSE-MIT":"e9116f7228fce981d81aa680ae1add0cfb8122c35d801c4664d3d674ad0beda8","README.md":"4e70c39451ff48d9b60e2a0db4754fefc2fe349149b4baf4747ca3556ac7ae15","examples/cat.rs":"ab0b575d19662e2d5b6c7cea2756b57530e495d56acdb4fd2b56c0ba4d768dfd","src/lib.rs":"72336fe793cd220b48b6e064ba258767d9521ed7ec47f0692b2cbbc3181c0e79","src/stub.rs":"f64675e86e590aa5aea779a60c22153fe4ab47a3d021b74f6dd697227e9971b1","src/unix.rs":"11f1f7c628827ad4d84564586b2718b046b5aae8d6b70bed3a2b715f1bb39ef4","src/windows.rs":"bca08b6db9a81ebb22517f92b9c38660d5ec3f8681cd9322f723ce2d715c1886"},"package":"723e3ebdcdc5c023db1df315364573789f8857c11b631a2fdfad7c00f5c046b4"}
|
|
|
@ -1,47 +0,0 @@
|
||||||
# Change Log
|
|
||||||
All notable changes to this project will be documented in this file.
|
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
|
||||||
and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
||||||
|
|
||||||
## [Unreleased]
|
|
||||||
|
|
||||||
## [0.2.3] - 2021-05-24
|
|
||||||
### Added
|
|
||||||
- Allow compilation on unsupported platform.
|
|
||||||
The code will panic on access just like in `std`.
|
|
||||||
[@jcaesar](https://github.com/jcaesar)
|
|
||||||
|
|
||||||
## [0.2.2] - 2021-04-03
|
|
||||||
### Added
|
|
||||||
- `MmapOptions::populate`. [@adamreichold](https://github.com/adamreichold)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Fix alignment computation for `flush_async` to match `flush`.
|
|
||||||
[@adamreichold](https://github.com/adamreichold)
|
|
||||||
|
|
||||||
## [0.2.1] - 2021-02-08
|
|
||||||
### Added
|
|
||||||
- `MmapOptions::map_raw` and `MmapRaw`. [@diwic](https://github.com/diwic)
|
|
||||||
|
|
||||||
## [0.2.0] - 2020-12-19
|
|
||||||
### Changed
|
|
||||||
- MSRV is 1.31 now (edition 2018).
|
|
||||||
- Make anonymous memory maps private by default on unix. [@CensoredUsername](https://github.com/CensoredUsername)
|
|
||||||
- Add `map_copy_read_only`. [@zserik](https://github.com/zserik)
|
|
||||||
|
|
||||||
## 0.1.0 - 2020-01-18
|
|
||||||
### Added
|
|
||||||
- Fork [memmap-rs](https://github.com/danburkert/memmap-rs).
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Use `LICENSE-APACHE` instead of `README.md` for some tests since it's immutable.
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
- `winapi` dependency. [memmap-rs/pull/89](https://github.com/danburkert/memmap-rs/pull/89)
|
|
||||||
|
|
||||||
[Unreleased]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.2.3...HEAD
|
|
||||||
[0.2.3]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.2.2...v0.2.3
|
|
||||||
[0.2.2]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.2.1...v0.2.2
|
|
||||||
[0.2.1]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.2.0...v0.2.1
|
|
||||||
[0.2.0]: https://github.com/RazrFalcon/memmap2-rs/compare/v0.1.0...v0.2.0
|
|
|
@ -1,99 +0,0 @@
|
||||||
# This file is automatically @generated by Cargo.
|
|
||||||
# It is not intended for manual editing.
|
|
||||||
[[package]]
|
|
||||||
name = "fuchsia-cprng"
|
|
||||||
version = "0.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "libc"
|
|
||||||
version = "0.2.94"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "memmap2"
|
|
||||||
version = "0.2.3"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
"tempdir",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand"
|
|
||||||
version = "0.4.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
|
|
||||||
dependencies = [
|
|
||||||
"fuchsia-cprng",
|
|
||||||
"libc",
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
"rdrand",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.3.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.4.2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rand_core"
|
|
||||||
version = "0.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rdrand"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
|
||||||
dependencies = [
|
|
||||||
"rand_core 0.3.1",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "remove_dir_all"
|
|
||||||
version = "0.5.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
|
|
||||||
dependencies = [
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tempdir"
|
|
||||||
version = "0.3.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
|
|
||||||
dependencies = [
|
|
||||||
"rand",
|
|
||||||
"remove_dir_all",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi"
|
|
||||||
version = "0.3.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
|
|
||||||
dependencies = [
|
|
||||||
"winapi-i686-pc-windows-gnu",
|
|
||||||
"winapi-x86_64-pc-windows-gnu",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-i686-pc-windows-gnu"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winapi-x86_64-pc-windows-gnu"
|
|
||||||
version = "0.4.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
|
|
@ -1,26 +0,0 @@
|
||||||
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
|
|
||||||
#
|
|
||||||
# When uploading crates to the registry Cargo will automatically
|
|
||||||
# "normalize" Cargo.toml files for maximal compatibility
|
|
||||||
# with all versions of Cargo and also rewrite `path` dependencies
|
|
||||||
# to registry (e.g., crates.io) dependencies
|
|
||||||
#
|
|
||||||
# If you believe there's an error in this file please file an
|
|
||||||
# issue against the rust-lang/cargo repository. If you're
|
|
||||||
# editing this file be aware that the upstream Cargo.toml
|
|
||||||
# will likely look very different (and much more reasonable)
|
|
||||||
|
|
||||||
[package]
|
|
||||||
edition = "2018"
|
|
||||||
name = "memmap2"
|
|
||||||
version = "0.2.3"
|
|
||||||
authors = ["Dan Burkert <dan@danburkert.com>", "Evgeniy Reizner <razrfalcon@gmail.com>"]
|
|
||||||
description = "Cross-platform Rust API for memory-mapped file IO"
|
|
||||||
documentation = "https://docs.rs/memmap2"
|
|
||||||
keywords = ["mmap", "memory-map", "io", "file"]
|
|
||||||
license = "MIT/Apache-2.0"
|
|
||||||
repository = "https://github.com/RazrFalcon/memmap2-rs"
|
|
||||||
[dev-dependencies.tempdir]
|
|
||||||
version = "0.3"
|
|
||||||
[target."cfg(unix)".dependencies.libc]
|
|
||||||
version = "0.2"
|
|
|
@ -1,201 +0,0 @@
|
||||||
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 [2015] [Dan Burkert]
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,26 +0,0 @@
|
||||||
Copyright (c) 2020 Evgeniy Reizner
|
|
||||||
Copyright (c) 2015 Dan Burkert
|
|
||||||
|
|
||||||
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.
|
|
|
@ -1,33 +0,0 @@
|
||||||
# memmap2
|
|
||||||
![Build Status](https://github.com/RazrFalcon/memmap2-rs/workflows/Rust/badge.svg)
|
|
||||||
[![Crates.io](https://img.shields.io/crates/v/memmap2.svg)](https://crates.io/crates/memmap2)
|
|
||||||
[![Documentation](https://docs.rs/memmap2/badge.svg)](https://docs.rs/memmap2)
|
|
||||||
[![Rust 1.31+](https://img.shields.io/badge/rust-1.31+-orange.svg)](https://www.rust-lang.org)
|
|
||||||
|
|
||||||
A Rust library for cross-platform memory mapped IO.
|
|
||||||
|
|
||||||
This is a **fork** of the [memmap-rs](https://github.com/danburkert/memmap-rs) crate.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- [x] file-backed memory maps
|
|
||||||
- [x] anonymous memory maps
|
|
||||||
- [x] synchronous and asynchronous flushing
|
|
||||||
- [x] copy-on-write memory maps
|
|
||||||
- [x] read-only memory maps
|
|
||||||
- [x] stack support (`MAP_STACK` on unix)
|
|
||||||
- [x] executable memory maps
|
|
||||||
- [ ] huge page support
|
|
||||||
|
|
||||||
A list of supported/tested targets can be found in [Actions](https://github.com/RazrFalcon/memmap2-rs/actions).
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
`memmap2` is primarily distributed under the terms of both the MIT license and the
|
|
||||||
Apache License (Version 2.0).
|
|
||||||
|
|
||||||
See [LICENSE-APACHE](LICENSE-APACHE), [LICENSE-MIT](LICENSE-MIT) for details.
|
|
||||||
|
|
||||||
Copyright (c) 2020 Evgeniy Reizner
|
|
||||||
|
|
||||||
Copyright (c) 2015 Dan Burkert
|
|
|
@ -1,23 +0,0 @@
|
||||||
extern crate memmap2;
|
|
||||||
|
|
||||||
use std::env;
|
|
||||||
use std::fs::File;
|
|
||||||
use std::io::{self, Write};
|
|
||||||
|
|
||||||
use memmap2::Mmap;
|
|
||||||
|
|
||||||
/// Output a file's contents to stdout. The file path must be provided as the first process
|
|
||||||
/// argument.
|
|
||||||
fn main() {
|
|
||||||
let path = env::args()
|
|
||||||
.nth(1)
|
|
||||||
.expect("supply a single path as the program argument");
|
|
||||||
|
|
||||||
let file = File::open(path).expect("failed to open the file");
|
|
||||||
|
|
||||||
let mmap = unsafe { Mmap::map(&file).expect("failed to map the file") };
|
|
||||||
|
|
||||||
io::stdout()
|
|
||||||
.write_all(&mmap[..])
|
|
||||||
.expect("failed to output the file contents");
|
|
||||||
}
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,76 +0,0 @@
|
||||||
use std::fs::File;
|
|
||||||
use std::io;
|
|
||||||
|
|
||||||
pub struct MmapInner {
|
|
||||||
// Private member to prevent external construction
|
|
||||||
// (might be nice to change the type to ! once that's stable)
|
|
||||||
__: (),
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MmapInner {
|
|
||||||
fn new() -> io::Result<MmapInner> {
|
|
||||||
Err(io::Error::new(
|
|
||||||
io::ErrorKind::Other,
|
|
||||||
"platform not supported",
|
|
||||||
))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map(_: usize, _: &File, _: u64) -> io::Result<MmapInner> {
|
|
||||||
MmapInner::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_exec(_: usize, _: &File, _: u64) -> io::Result<MmapInner> {
|
|
||||||
MmapInner::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_mut(_: usize, _: &File, _: u64) -> io::Result<MmapInner> {
|
|
||||||
MmapInner::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_copy(_: usize, _: &File, _: u64) -> io::Result<MmapInner> {
|
|
||||||
MmapInner::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_copy_read_only(_: usize, _: &File, _: u64) -> io::Result<MmapInner> {
|
|
||||||
MmapInner::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_anon(_: usize, _: bool) -> io::Result<MmapInner> {
|
|
||||||
MmapInner::new()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn flush(&self, _: usize, _: usize) -> io::Result<()> {
|
|
||||||
unreachable!("self unconstructable");
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn flush_async(&self, _: usize, _: usize) -> io::Result<()> {
|
|
||||||
unreachable!("self unconstructable");
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_read_only(&mut self) -> io::Result<()> {
|
|
||||||
unreachable!("self unconstructable");
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_exec(&mut self) -> io::Result<()> {
|
|
||||||
unreachable!("self unconstructable");
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_mut(&mut self) -> io::Result<()> {
|
|
||||||
unreachable!("self unconstructable");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn ptr(&self) -> *const u8 {
|
|
||||||
unreachable!("self unconstructable");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn mut_ptr(&mut self) -> *mut u8 {
|
|
||||||
unreachable!("self unconstructable");
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn len(&self) -> usize {
|
|
||||||
unreachable!("self unconstructable");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,235 +0,0 @@
|
||||||
extern crate libc;
|
|
||||||
|
|
||||||
use std::fs::File;
|
|
||||||
use std::os::unix::io::{AsRawFd, RawFd};
|
|
||||||
use std::{io, ptr};
|
|
||||||
|
|
||||||
#[cfg(any(
|
|
||||||
all(target_os = "linux", not(target_arch = "mips")),
|
|
||||||
target_os = "freebsd",
|
|
||||||
target_os = "android"
|
|
||||||
))]
|
|
||||||
const MAP_STACK: libc::c_int = libc::MAP_STACK;
|
|
||||||
|
|
||||||
#[cfg(not(any(
|
|
||||||
all(target_os = "linux", not(target_arch = "mips")),
|
|
||||||
target_os = "freebsd",
|
|
||||||
target_os = "android"
|
|
||||||
)))]
|
|
||||||
const MAP_STACK: libc::c_int = 0;
|
|
||||||
|
|
||||||
#[cfg(any(target_os = "linux", target_os = "android"))]
|
|
||||||
const MAP_POPULATE: libc::c_int = libc::MAP_POPULATE;
|
|
||||||
|
|
||||||
#[cfg(not(any(target_os = "linux", target_os = "android")))]
|
|
||||||
const MAP_POPULATE: libc::c_int = 0;
|
|
||||||
|
|
||||||
pub struct MmapInner {
|
|
||||||
ptr: *mut libc::c_void,
|
|
||||||
len: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MmapInner {
|
|
||||||
/// Creates a new `MmapInner`.
|
|
||||||
///
|
|
||||||
/// This is a thin wrapper around the `mmap` sytem call.
|
|
||||||
fn new(
|
|
||||||
len: usize,
|
|
||||||
prot: libc::c_int,
|
|
||||||
flags: libc::c_int,
|
|
||||||
file: RawFd,
|
|
||||||
offset: u64,
|
|
||||||
) -> io::Result<MmapInner> {
|
|
||||||
let alignment = offset % page_size() as u64;
|
|
||||||
let aligned_offset = offset - alignment;
|
|
||||||
let aligned_len = len + alignment as usize;
|
|
||||||
if aligned_len == 0 {
|
|
||||||
// Normally the OS would catch this, but it segfaults under QEMU.
|
|
||||||
return Err(io::Error::new(
|
|
||||||
io::ErrorKind::InvalidInput,
|
|
||||||
"memory map must have a non-zero length",
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let ptr = libc::mmap(
|
|
||||||
ptr::null_mut(),
|
|
||||||
aligned_len as libc::size_t,
|
|
||||||
prot,
|
|
||||||
flags,
|
|
||||||
file,
|
|
||||||
aligned_offset as libc::off_t,
|
|
||||||
);
|
|
||||||
|
|
||||||
if ptr == libc::MAP_FAILED {
|
|
||||||
Err(io::Error::last_os_error())
|
|
||||||
} else {
|
|
||||||
Ok(MmapInner {
|
|
||||||
ptr: ptr.offset(alignment as isize),
|
|
||||||
len,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map(len: usize, file: &File, offset: u64, populate: bool) -> io::Result<MmapInner> {
|
|
||||||
let populate = if populate { MAP_POPULATE } else { 0 };
|
|
||||||
MmapInner::new(
|
|
||||||
len,
|
|
||||||
libc::PROT_READ,
|
|
||||||
libc::MAP_SHARED | populate,
|
|
||||||
file.as_raw_fd(),
|
|
||||||
offset,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_exec(len: usize, file: &File, offset: u64, populate: bool) -> io::Result<MmapInner> {
|
|
||||||
let populate = if populate { MAP_POPULATE } else { 0 };
|
|
||||||
MmapInner::new(
|
|
||||||
len,
|
|
||||||
libc::PROT_READ | libc::PROT_EXEC,
|
|
||||||
libc::MAP_SHARED | populate,
|
|
||||||
file.as_raw_fd(),
|
|
||||||
offset,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_mut(len: usize, file: &File, offset: u64, populate: bool) -> io::Result<MmapInner> {
|
|
||||||
let populate = if populate { MAP_POPULATE } else { 0 };
|
|
||||||
MmapInner::new(
|
|
||||||
len,
|
|
||||||
libc::PROT_READ | libc::PROT_WRITE,
|
|
||||||
libc::MAP_SHARED | populate,
|
|
||||||
file.as_raw_fd(),
|
|
||||||
offset,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_copy(len: usize, file: &File, offset: u64, populate: bool) -> io::Result<MmapInner> {
|
|
||||||
let populate = if populate { MAP_POPULATE } else { 0 };
|
|
||||||
MmapInner::new(
|
|
||||||
len,
|
|
||||||
libc::PROT_READ | libc::PROT_WRITE,
|
|
||||||
libc::MAP_PRIVATE | populate,
|
|
||||||
file.as_raw_fd(),
|
|
||||||
offset,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_copy_read_only(
|
|
||||||
len: usize,
|
|
||||||
file: &File,
|
|
||||||
offset: u64,
|
|
||||||
populate: bool,
|
|
||||||
) -> io::Result<MmapInner> {
|
|
||||||
let populate = if populate { MAP_POPULATE } else { 0 };
|
|
||||||
MmapInner::new(
|
|
||||||
len,
|
|
||||||
libc::PROT_READ,
|
|
||||||
libc::MAP_PRIVATE | populate,
|
|
||||||
file.as_raw_fd(),
|
|
||||||
offset,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Open an anonymous memory map.
|
|
||||||
pub fn map_anon(len: usize, stack: bool) -> io::Result<MmapInner> {
|
|
||||||
let stack = if stack { MAP_STACK } else { 0 };
|
|
||||||
MmapInner::new(
|
|
||||||
len,
|
|
||||||
libc::PROT_READ | libc::PROT_WRITE,
|
|
||||||
libc::MAP_PRIVATE | libc::MAP_ANON | stack,
|
|
||||||
-1,
|
|
||||||
0,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn flush(&self, offset: usize, len: usize) -> io::Result<()> {
|
|
||||||
let alignment = (self.ptr as usize + offset) % page_size();
|
|
||||||
let offset = offset as isize - alignment as isize;
|
|
||||||
let len = len + alignment;
|
|
||||||
let result =
|
|
||||||
unsafe { libc::msync(self.ptr.offset(offset), len as libc::size_t, libc::MS_SYNC) };
|
|
||||||
if result == 0 {
|
|
||||||
Ok(())
|
|
||||||
} else {
|
|
||||||
Err(io::Error::last_os_error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn flush_async(&self, offset: usize, len: usize) -> io::Result<()> {
|
|
||||||
let alignment = (self.ptr as usize + offset) % page_size();
|
|
||||||
let offset = offset as isize - alignment as isize;
|
|
||||||
let len = len + alignment;
|
|
||||||
let result =
|
|
||||||
unsafe { libc::msync(self.ptr.offset(offset), len as libc::size_t, libc::MS_ASYNC) };
|
|
||||||
if result == 0 {
|
|
||||||
Ok(())
|
|
||||||
} else {
|
|
||||||
Err(io::Error::last_os_error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn mprotect(&mut self, prot: libc::c_int) -> io::Result<()> {
|
|
||||||
unsafe {
|
|
||||||
let alignment = self.ptr as usize % page_size();
|
|
||||||
let ptr = self.ptr.offset(-(alignment as isize));
|
|
||||||
let len = self.len + alignment;
|
|
||||||
if libc::mprotect(ptr, len, prot) == 0 {
|
|
||||||
Ok(())
|
|
||||||
} else {
|
|
||||||
Err(io::Error::last_os_error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_read_only(&mut self) -> io::Result<()> {
|
|
||||||
self.mprotect(libc::PROT_READ)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_exec(&mut self) -> io::Result<()> {
|
|
||||||
self.mprotect(libc::PROT_READ | libc::PROT_EXEC)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_mut(&mut self) -> io::Result<()> {
|
|
||||||
self.mprotect(libc::PROT_READ | libc::PROT_WRITE)
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn ptr(&self) -> *const u8 {
|
|
||||||
self.ptr as *const u8
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn mut_ptr(&mut self) -> *mut u8 {
|
|
||||||
self.ptr as *mut u8
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn len(&self) -> usize {
|
|
||||||
self.len
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for MmapInner {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
let alignment = self.ptr as usize % page_size();
|
|
||||||
unsafe {
|
|
||||||
assert!(
|
|
||||||
libc::munmap(
|
|
||||||
self.ptr.offset(-(alignment as isize)),
|
|
||||||
(self.len + alignment) as libc::size_t
|
|
||||||
) == 0,
|
|
||||||
"unable to unmap mmap: {}",
|
|
||||||
io::Error::last_os_error()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl Sync for MmapInner {}
|
|
||||||
unsafe impl Send for MmapInner {}
|
|
||||||
|
|
||||||
fn page_size() -> usize {
|
|
||||||
unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize }
|
|
||||||
}
|
|
|
@ -1,436 +0,0 @@
|
||||||
#![allow(non_camel_case_types)]
|
|
||||||
#![allow(non_snake_case)]
|
|
||||||
|
|
||||||
use std::fs::File;
|
|
||||||
use std::os::raw::c_void;
|
|
||||||
use std::os::windows::io::{AsRawHandle, RawHandle};
|
|
||||||
use std::{io, mem, ptr};
|
|
||||||
|
|
||||||
type BOOL = i32;
|
|
||||||
type WORD = u16;
|
|
||||||
type DWORD = u32;
|
|
||||||
type WCHAR = u16;
|
|
||||||
type HANDLE = *mut c_void;
|
|
||||||
type LPVOID = *mut c_void;
|
|
||||||
type LPCVOID = *const c_void;
|
|
||||||
type ULONG_PTR = usize;
|
|
||||||
type SIZE_T = ULONG_PTR;
|
|
||||||
type LPCWSTR = *const WCHAR;
|
|
||||||
type PDWORD = *mut DWORD;
|
|
||||||
type DWORD_PTR = ULONG_PTR;
|
|
||||||
type LPSECURITY_ATTRIBUTES = *mut SECURITY_ATTRIBUTES;
|
|
||||||
type LPSYSTEM_INFO = *mut SYSTEM_INFO;
|
|
||||||
|
|
||||||
const INVALID_HANDLE_VALUE: HANDLE = -1isize as HANDLE;
|
|
||||||
|
|
||||||
const STANDARD_RIGHTS_REQUIRED: DWORD = 0x000F0000;
|
|
||||||
|
|
||||||
const SECTION_QUERY: DWORD = 0x0001;
|
|
||||||
const SECTION_MAP_WRITE: DWORD = 0x0002;
|
|
||||||
const SECTION_MAP_READ: DWORD = 0x0004;
|
|
||||||
const SECTION_MAP_EXECUTE: DWORD = 0x0008;
|
|
||||||
const SECTION_EXTEND_SIZE: DWORD = 0x0010;
|
|
||||||
const SECTION_MAP_EXECUTE_EXPLICIT: DWORD = 0x0020;
|
|
||||||
const SECTION_ALL_ACCESS: DWORD = STANDARD_RIGHTS_REQUIRED
|
|
||||||
| SECTION_QUERY
|
|
||||||
| SECTION_MAP_WRITE
|
|
||||||
| SECTION_MAP_READ
|
|
||||||
| SECTION_MAP_EXECUTE
|
|
||||||
| SECTION_EXTEND_SIZE;
|
|
||||||
|
|
||||||
const PAGE_READONLY: DWORD = 0x02;
|
|
||||||
const PAGE_READWRITE: DWORD = 0x04;
|
|
||||||
const PAGE_WRITECOPY: DWORD = 0x08;
|
|
||||||
const PAGE_EXECUTE_READ: DWORD = 0x20;
|
|
||||||
const PAGE_EXECUTE_READWRITE: DWORD = 0x40;
|
|
||||||
const PAGE_EXECUTE_WRITECOPY: DWORD = 0x80;
|
|
||||||
|
|
||||||
const FILE_MAP_WRITE: DWORD = SECTION_MAP_WRITE;
|
|
||||||
const FILE_MAP_READ: DWORD = SECTION_MAP_READ;
|
|
||||||
const FILE_MAP_ALL_ACCESS: DWORD = SECTION_ALL_ACCESS;
|
|
||||||
const FILE_MAP_EXECUTE: DWORD = SECTION_MAP_EXECUTE_EXPLICIT;
|
|
||||||
const FILE_MAP_COPY: DWORD = 0x00000001;
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
struct SECURITY_ATTRIBUTES {
|
|
||||||
nLength: DWORD,
|
|
||||||
lpSecurityDescriptor: LPVOID,
|
|
||||||
bInheritHandle: BOOL,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
struct SYSTEM_INFO_u_s {
|
|
||||||
wProcessorArchitecture: WORD,
|
|
||||||
wReserved: WORD,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
struct SYSTEM_INFO_u([u32; 1]);
|
|
||||||
|
|
||||||
#[repr(C)]
|
|
||||||
#[derive(Clone, Copy)]
|
|
||||||
struct SYSTEM_INFO {
|
|
||||||
u: SYSTEM_INFO_u,
|
|
||||||
dwPageSize: DWORD,
|
|
||||||
lpMinimumApplicationAddress: LPVOID,
|
|
||||||
lpMaximumApplicationAddress: LPVOID,
|
|
||||||
dwActiveProcessorMask: DWORD_PTR,
|
|
||||||
dwNumberOfProcessors: DWORD,
|
|
||||||
dwProcessorType: DWORD,
|
|
||||||
dwAllocationGranularity: DWORD,
|
|
||||||
wProcessorLevel: WORD,
|
|
||||||
wProcessorRevision: WORD,
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "system" {
|
|
||||||
fn CloseHandle(hObject: HANDLE) -> BOOL;
|
|
||||||
|
|
||||||
fn CreateFileMappingW(
|
|
||||||
hFile: HANDLE,
|
|
||||||
lpFileMappingAttributes: LPSECURITY_ATTRIBUTES,
|
|
||||||
flProtect: DWORD,
|
|
||||||
dwMaximumSizeHigh: DWORD,
|
|
||||||
dwMaximumSizeLow: DWORD,
|
|
||||||
lpName: LPCWSTR,
|
|
||||||
) -> HANDLE;
|
|
||||||
|
|
||||||
fn FlushViewOfFile(lpBaseAddress: LPCVOID, dwNumberOfBytesToFlush: SIZE_T) -> BOOL;
|
|
||||||
|
|
||||||
fn UnmapViewOfFile(lpBaseAddress: LPCVOID) -> BOOL;
|
|
||||||
|
|
||||||
fn MapViewOfFile(
|
|
||||||
hFileMappingObject: HANDLE,
|
|
||||||
dwDesiredAccess: DWORD,
|
|
||||||
dwFileOffsetHigh: DWORD,
|
|
||||||
dwFileOffsetLow: DWORD,
|
|
||||||
dwNumberOfBytesToMap: SIZE_T,
|
|
||||||
) -> LPVOID;
|
|
||||||
|
|
||||||
fn VirtualProtect(
|
|
||||||
lpAddress: LPVOID,
|
|
||||||
dwSize: SIZE_T,
|
|
||||||
flNewProtect: DWORD,
|
|
||||||
lpflOldProtect: PDWORD,
|
|
||||||
) -> BOOL;
|
|
||||||
|
|
||||||
fn GetSystemInfo(lpSystemInfo: LPSYSTEM_INFO);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct MmapInner {
|
|
||||||
file: Option<File>,
|
|
||||||
ptr: *mut c_void,
|
|
||||||
len: usize,
|
|
||||||
copy: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MmapInner {
|
|
||||||
/// Creates a new `MmapInner`.
|
|
||||||
///
|
|
||||||
/// This is a thin wrapper around the `CreateFileMappingW` and `MapViewOfFile` system calls.
|
|
||||||
pub fn new(
|
|
||||||
file: &File,
|
|
||||||
protect: DWORD,
|
|
||||||
access: DWORD,
|
|
||||||
offset: u64,
|
|
||||||
len: usize,
|
|
||||||
copy: bool,
|
|
||||||
) -> io::Result<MmapInner> {
|
|
||||||
let alignment = offset % allocation_granularity() as u64;
|
|
||||||
let aligned_offset = offset - alignment as u64;
|
|
||||||
let aligned_len = len + alignment as usize;
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let handle = CreateFileMappingW(
|
|
||||||
file.as_raw_handle(),
|
|
||||||
ptr::null_mut(),
|
|
||||||
protect,
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
ptr::null(),
|
|
||||||
);
|
|
||||||
if handle.is_null() {
|
|
||||||
return Err(io::Error::last_os_error());
|
|
||||||
}
|
|
||||||
|
|
||||||
let ptr = MapViewOfFile(
|
|
||||||
handle,
|
|
||||||
access,
|
|
||||||
(aligned_offset >> 16 >> 16) as DWORD,
|
|
||||||
(aligned_offset & 0xffffffff) as DWORD,
|
|
||||||
aligned_len as SIZE_T,
|
|
||||||
);
|
|
||||||
CloseHandle(handle);
|
|
||||||
|
|
||||||
if ptr.is_null() {
|
|
||||||
Err(io::Error::last_os_error())
|
|
||||||
} else {
|
|
||||||
Ok(MmapInner {
|
|
||||||
file: Some(file.try_clone()?),
|
|
||||||
ptr: ptr.offset(alignment as isize),
|
|
||||||
len: len as usize,
|
|
||||||
copy,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map(len: usize, file: &File, offset: u64, _populate: bool) -> io::Result<MmapInner> {
|
|
||||||
let write = protection_supported(file.as_raw_handle(), PAGE_READWRITE);
|
|
||||||
let exec = protection_supported(file.as_raw_handle(), PAGE_EXECUTE_READ);
|
|
||||||
let mut access = FILE_MAP_READ;
|
|
||||||
let protection = match (write, exec) {
|
|
||||||
(true, true) => {
|
|
||||||
access |= FILE_MAP_WRITE | FILE_MAP_EXECUTE;
|
|
||||||
PAGE_EXECUTE_READWRITE
|
|
||||||
}
|
|
||||||
(true, false) => {
|
|
||||||
access |= FILE_MAP_WRITE;
|
|
||||||
PAGE_READWRITE
|
|
||||||
}
|
|
||||||
(false, true) => {
|
|
||||||
access |= FILE_MAP_EXECUTE;
|
|
||||||
PAGE_EXECUTE_READ
|
|
||||||
}
|
|
||||||
(false, false) => PAGE_READONLY,
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut inner = MmapInner::new(file, protection, access, offset, len, false)?;
|
|
||||||
if write || exec {
|
|
||||||
inner.make_read_only()?;
|
|
||||||
}
|
|
||||||
Ok(inner)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_exec(
|
|
||||||
len: usize,
|
|
||||||
file: &File,
|
|
||||||
offset: u64,
|
|
||||||
_populate: bool,
|
|
||||||
) -> io::Result<MmapInner> {
|
|
||||||
let write = protection_supported(file.as_raw_handle(), PAGE_READWRITE);
|
|
||||||
let mut access = FILE_MAP_READ | FILE_MAP_EXECUTE;
|
|
||||||
let protection = if write {
|
|
||||||
access |= FILE_MAP_WRITE;
|
|
||||||
PAGE_EXECUTE_READWRITE
|
|
||||||
} else {
|
|
||||||
PAGE_EXECUTE_READ
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut inner = MmapInner::new(file, protection, access, offset, len, false)?;
|
|
||||||
if write {
|
|
||||||
inner.make_exec()?;
|
|
||||||
}
|
|
||||||
Ok(inner)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_mut(len: usize, file: &File, offset: u64, _populate: bool) -> io::Result<MmapInner> {
|
|
||||||
let exec = protection_supported(file.as_raw_handle(), PAGE_EXECUTE_READ);
|
|
||||||
let mut access = FILE_MAP_READ | FILE_MAP_WRITE;
|
|
||||||
let protection = if exec {
|
|
||||||
access |= FILE_MAP_EXECUTE;
|
|
||||||
PAGE_EXECUTE_READWRITE
|
|
||||||
} else {
|
|
||||||
PAGE_READWRITE
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut inner = MmapInner::new(file, protection, access, offset, len, false)?;
|
|
||||||
if exec {
|
|
||||||
inner.make_mut()?;
|
|
||||||
}
|
|
||||||
Ok(inner)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_copy(
|
|
||||||
len: usize,
|
|
||||||
file: &File,
|
|
||||||
offset: u64,
|
|
||||||
_populate: bool,
|
|
||||||
) -> io::Result<MmapInner> {
|
|
||||||
let exec = protection_supported(file.as_raw_handle(), PAGE_EXECUTE_READWRITE);
|
|
||||||
let mut access = FILE_MAP_COPY;
|
|
||||||
let protection = if exec {
|
|
||||||
access |= FILE_MAP_EXECUTE;
|
|
||||||
PAGE_EXECUTE_WRITECOPY
|
|
||||||
} else {
|
|
||||||
PAGE_WRITECOPY
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut inner = MmapInner::new(file, protection, access, offset, len, true)?;
|
|
||||||
if exec {
|
|
||||||
inner.make_mut()?;
|
|
||||||
}
|
|
||||||
Ok(inner)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_copy_read_only(
|
|
||||||
len: usize,
|
|
||||||
file: &File,
|
|
||||||
offset: u64,
|
|
||||||
_populate: bool,
|
|
||||||
) -> io::Result<MmapInner> {
|
|
||||||
let write = protection_supported(file.as_raw_handle(), PAGE_READWRITE);
|
|
||||||
let exec = protection_supported(file.as_raw_handle(), PAGE_EXECUTE_READ);
|
|
||||||
let mut access = FILE_MAP_COPY;
|
|
||||||
let protection = if exec {
|
|
||||||
access |= FILE_MAP_EXECUTE;
|
|
||||||
PAGE_EXECUTE_WRITECOPY
|
|
||||||
} else {
|
|
||||||
PAGE_WRITECOPY
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut inner = MmapInner::new(file, protection, access, offset, len, true)?;
|
|
||||||
if write || exec {
|
|
||||||
inner.make_read_only()?;
|
|
||||||
}
|
|
||||||
Ok(inner)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn map_anon(len: usize, _stack: bool) -> io::Result<MmapInner> {
|
|
||||||
unsafe {
|
|
||||||
// Create a mapping and view with maximum access permissions, then use `VirtualProtect`
|
|
||||||
// to set the actual `Protection`. This way, we can set more permissive protection later
|
|
||||||
// on.
|
|
||||||
// Also see https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537.aspx
|
|
||||||
|
|
||||||
let handle = CreateFileMappingW(
|
|
||||||
INVALID_HANDLE_VALUE,
|
|
||||||
ptr::null_mut(),
|
|
||||||
PAGE_EXECUTE_READWRITE,
|
|
||||||
(len >> 16 >> 16) as DWORD,
|
|
||||||
(len & 0xffffffff) as DWORD,
|
|
||||||
ptr::null(),
|
|
||||||
);
|
|
||||||
if handle.is_null() {
|
|
||||||
return Err(io::Error::last_os_error());
|
|
||||||
}
|
|
||||||
let access = FILE_MAP_ALL_ACCESS | FILE_MAP_EXECUTE;
|
|
||||||
let ptr = MapViewOfFile(handle, access, 0, 0, len as SIZE_T);
|
|
||||||
CloseHandle(handle);
|
|
||||||
|
|
||||||
if ptr.is_null() {
|
|
||||||
return Err(io::Error::last_os_error());
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut old = 0;
|
|
||||||
let result = VirtualProtect(ptr, len as SIZE_T, PAGE_READWRITE, &mut old);
|
|
||||||
if result != 0 {
|
|
||||||
Ok(MmapInner {
|
|
||||||
file: None,
|
|
||||||
ptr,
|
|
||||||
len: len as usize,
|
|
||||||
copy: false,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
Err(io::Error::last_os_error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn flush(&self, offset: usize, len: usize) -> io::Result<()> {
|
|
||||||
self.flush_async(offset, len)?;
|
|
||||||
if let Some(ref file) = self.file {
|
|
||||||
file.sync_data()?;
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn flush_async(&self, offset: usize, len: usize) -> io::Result<()> {
|
|
||||||
let result = unsafe { FlushViewOfFile(self.ptr.add(offset), len as SIZE_T) };
|
|
||||||
if result != 0 {
|
|
||||||
Ok(())
|
|
||||||
} else {
|
|
||||||
Err(io::Error::last_os_error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn virtual_protect(&mut self, protect: DWORD) -> io::Result<()> {
|
|
||||||
unsafe {
|
|
||||||
let alignment = self.ptr as usize % allocation_granularity();
|
|
||||||
let ptr = self.ptr.offset(-(alignment as isize));
|
|
||||||
let aligned_len = self.len as SIZE_T + alignment as SIZE_T;
|
|
||||||
|
|
||||||
let mut old = 0;
|
|
||||||
let result = VirtualProtect(ptr, aligned_len, protect, &mut old);
|
|
||||||
|
|
||||||
if result != 0 {
|
|
||||||
Ok(())
|
|
||||||
} else {
|
|
||||||
Err(io::Error::last_os_error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_read_only(&mut self) -> io::Result<()> {
|
|
||||||
self.virtual_protect(PAGE_READONLY)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_exec(&mut self) -> io::Result<()> {
|
|
||||||
if self.copy {
|
|
||||||
self.virtual_protect(PAGE_EXECUTE_WRITECOPY)
|
|
||||||
} else {
|
|
||||||
self.virtual_protect(PAGE_EXECUTE_READ)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn make_mut(&mut self) -> io::Result<()> {
|
|
||||||
if self.copy {
|
|
||||||
self.virtual_protect(PAGE_WRITECOPY)
|
|
||||||
} else {
|
|
||||||
self.virtual_protect(PAGE_READWRITE)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn ptr(&self) -> *const u8 {
|
|
||||||
self.ptr as *const u8
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn mut_ptr(&mut self) -> *mut u8 {
|
|
||||||
self.ptr as *mut u8
|
|
||||||
}
|
|
||||||
|
|
||||||
#[inline]
|
|
||||||
pub fn len(&self) -> usize {
|
|
||||||
self.len
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Drop for MmapInner {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
let alignment = self.ptr as usize % allocation_granularity();
|
|
||||||
unsafe {
|
|
||||||
let ptr = self.ptr.offset(-(alignment as isize));
|
|
||||||
assert!(
|
|
||||||
UnmapViewOfFile(ptr) != 0,
|
|
||||||
"unable to unmap mmap: {}",
|
|
||||||
io::Error::last_os_error()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
unsafe impl Sync for MmapInner {}
|
|
||||||
unsafe impl Send for MmapInner {}
|
|
||||||
|
|
||||||
fn protection_supported(handle: RawHandle, protection: DWORD) -> bool {
|
|
||||||
unsafe {
|
|
||||||
let handle = CreateFileMappingW(handle, ptr::null_mut(), protection, 0, 0, ptr::null());
|
|
||||||
if handle.is_null() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
CloseHandle(handle);
|
|
||||||
true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn allocation_granularity() -> usize {
|
|
||||||
unsafe {
|
|
||||||
let mut info = mem::zeroed();
|
|
||||||
GetSystemInfo(&mut info);
|
|
||||||
info.dwAllocationGranularity as usize
|
|
||||||
}
|
|
||||||
}
|
|
Загрузка…
Ссылка в новой задаче