mirror of
https://github.com/chromium/crashpad.git
synced 2024-12-29 00:32:35 +08:00
1aa478d161
This change was partially scripted and partially done manually with vim regex + manually placing the deleted constructors. The script change looked for destructors in the public: section of a class, if that existed the deleted constructors would go before the destructor. For manual placement I looked for any constructor in the public: section of the corresponding class. If there wasn't one, then it would ideally have gone as the first entry except below enums, classes and typedefs. This may not have been perfect, but is hopefully good enough. Fingers crossed. #include "base/macros.h" is removed from files that don't use ignore_result, which is the only other thing defined in base/macros.h. Bug: chromium:1010217 Change-Id: I099526255a40b1ac1264904b4ece2f3f503c9418 Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/3171034 Reviewed-by: Mark Mentovai <mark@chromium.org> Commit-Queue: Peter Boström <pbos@chromium.org>
120 lines
4.2 KiB
C++
120 lines
4.2 KiB
C++
// Copyright 2017 The Crashpad Authors. All rights reserved.
|
||
//
|
||
// 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.
|
||
|
||
#ifndef CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_
|
||
#define CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_
|
||
|
||
|
||
#include <sys/mman.h>
|
||
#include <sys/types.h>
|
||
|
||
#include "util/misc/from_pointer_cast.h"
|
||
|
||
namespace crashpad {
|
||
|
||
//! \brief Maintains a memory-mapped region created by `mmap()`.
|
||
//!
|
||
//! On destruction, any memory-mapped region managed by an object of this class
|
||
//! will be released by calling `munmap()`.
|
||
class ScopedMmap {
|
||
public:
|
||
//! \brief Constructs this object.
|
||
//!
|
||
//! \param can_log `true` if methods of this class may log messages.
|
||
explicit ScopedMmap(bool can_log = true);
|
||
|
||
ScopedMmap(const ScopedMmap&) = delete;
|
||
ScopedMmap& operator=(const ScopedMmap&) = delete;
|
||
|
||
~ScopedMmap();
|
||
|
||
//! \brief Releases the memory-mapped region by calling `munmap()`.
|
||
//!
|
||
//! \return `true` on success. `false` on failure, with a message logged.
|
||
bool Reset();
|
||
|
||
//! \brief Releases any existing memory-mapped region and sets the object to
|
||
//! maintain an already-established mapping.
|
||
//!
|
||
//! If \a addr and \a len indicate a region that overlaps with the existing
|
||
//! memory-mapped region, only the portion of the existing memory-mapped
|
||
//! region that does not overlap the new region, if any, will be released.
|
||
//!
|
||
//! \param[in] addr The base address of the existing memory-mapped region to
|
||
//! maintain.
|
||
//! \param[in] len The size of the existing memory-mapped region to maintain.
|
||
//!
|
||
//! \return `true` on success. `false` on failure, with a message logged.
|
||
bool ResetAddrLen(void* addr, size_t len);
|
||
|
||
//! \brief Releases any existing memory-mapped region and establishes a new
|
||
//! one by calling `mmap()`.
|
||
//!
|
||
//! The parameters to this method are passed directly to `mmap()`.
|
||
//!
|
||
//! \return `true` on success. `false` on failure, with a message logged. A
|
||
//! message will also be logged on failure to release any existing
|
||
//! memory-mapped region, but this will not preclude `mmap()` from being
|
||
//! called or a new mapping from being established, and if such a call to
|
||
//! `mmap()` is successful, this method will return `true`.
|
||
bool ResetMmap(void* addr,
|
||
size_t len,
|
||
int prot,
|
||
int flags,
|
||
int fd,
|
||
off_t offset);
|
||
|
||
//! \brief Sets the protection of the memory-mapped region by calling
|
||
//! `mprotect()`.
|
||
//!
|
||
//! \a prot is passed directly to `mprotect()`.
|
||
//!
|
||
//! \return `true` on success. `false` on failure, with a message logged.
|
||
bool Mprotect(int prot);
|
||
|
||
//! \brief Returns the base address of the memory-mapped region and releases
|
||
//! ownership.
|
||
void* release();
|
||
|
||
//! \return Whether this object is managing a valid memory-mapped region.
|
||
bool is_valid() const { return addr_ != MAP_FAILED; }
|
||
|
||
//! \brief Returns the base address of the memory-mapped region.
|
||
void* addr() const { return addr_; }
|
||
|
||
//! \brief Returns the base address of the memory-mapped region, casted to
|
||
//! a type of the caller’s choosing.
|
||
template <typename T>
|
||
T addr_as() const {
|
||
return FromPointerCast<T>(addr_);
|
||
}
|
||
|
||
//! \brief Returns the size of the memory-mapped region.
|
||
//!
|
||
//! This is the value originally passed to ResetAddrLen() or ResetMmap(), or
|
||
//! after Reset(), `0`. It may not be a round number of pages. Providing the
|
||
//! passed-in value is intended to ease tracking the intended lengths of
|
||
//! memory-mapped regions backed by files whose sizes are not whole pages.
|
||
size_t len() const { return len_; }
|
||
|
||
private:
|
||
void* addr_ = MAP_FAILED;
|
||
size_t len_ = 0;
|
||
bool can_log_;
|
||
};
|
||
|
||
} // namespace crashpad
|
||
|
||
#endif // CRASHPAD_UTIL_POSIX_SCOPED_MMAP_H_
|