mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
Flesh out a page size accessor in the new API.
Implement the old API in terms of the new one. This simplifies the implementation on Windows which can now re-use the self_process's once initialization. llvm-svn: 171330
This commit is contained in:
parent
fab9a81b1d
commit
13b537a99b
@ -89,7 +89,27 @@ class self_process : public process {
|
||||
public:
|
||||
virtual id_type get_id();
|
||||
|
||||
/// \name Process configuration (sysconf on POSIX)
|
||||
/// @{
|
||||
|
||||
/// \brief Get the virtual memory page size.
|
||||
///
|
||||
/// Query the operating system for this process's page size.
|
||||
size_t page_size() const { return PageSize; };
|
||||
|
||||
/// @}
|
||||
|
||||
private:
|
||||
/// \name Cached process state.
|
||||
/// @{
|
||||
|
||||
/// \brief Cached page size, this cannot vary during the life of the process.
|
||||
size_t PageSize;
|
||||
|
||||
/// @}
|
||||
|
||||
/// \brief Constructor, used by \c process::get_self() only.
|
||||
self_process();
|
||||
};
|
||||
|
||||
|
||||
|
@ -55,6 +55,14 @@ self_process::~self_process() {
|
||||
#endif
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Implementations of legacy functions in terms of the new self_process object.
|
||||
|
||||
unsigned Process::GetPageSize() {
|
||||
return process::get_self()->page_size();
|
||||
}
|
||||
|
||||
|
||||
// Include the platform-specific parts of this class.
|
||||
#ifdef LLVM_ON_UNIX
|
||||
#include "Unix/Process.inc"
|
||||
|
@ -49,10 +49,7 @@ process::id_type self_process::get_id() {
|
||||
return getpid();
|
||||
}
|
||||
|
||||
|
||||
unsigned
|
||||
Process::GetPageSize()
|
||||
{
|
||||
static unsigned getPageSize() {
|
||||
#if defined(__CYGWIN__)
|
||||
// On Cygwin, getpagesize() returns 64k but the page size for the purposes of
|
||||
// memory protection and mmap() is 4k.
|
||||
@ -68,6 +65,12 @@ Process::GetPageSize()
|
||||
return static_cast<unsigned>(page_size);
|
||||
}
|
||||
|
||||
// This constructor guaranteed to be run exactly once on a single thread, and
|
||||
// sets up various process invariants that can be queried cheaply from then on.
|
||||
self_process::self_process() : PageSize(getPageSize()) {
|
||||
}
|
||||
|
||||
|
||||
size_t Process::GetMallocUsage() {
|
||||
#if defined(HAVE_MALLINFO)
|
||||
struct mallinfo mi;
|
||||
|
@ -43,11 +43,9 @@ process::id_type self_process::get_id() {
|
||||
return GetCurrentProcess();
|
||||
}
|
||||
|
||||
|
||||
// This function retrieves the page size using GetSystemInfo and is present
|
||||
// solely so it can be called once in Process::GetPageSize to initialize the
|
||||
// static variable PageSize.
|
||||
inline unsigned GetPageSizeOnce() {
|
||||
// solely so it can be called once to initialize the self_process member below.
|
||||
static unsigned getPageSize() {
|
||||
// NOTE: A 32-bit application running under WOW64 is supposed to use
|
||||
// GetNativeSystemInfo. However, this interface is not present prior
|
||||
// to Windows XP so to use it requires dynamic linking. It is not clear
|
||||
@ -58,12 +56,12 @@ inline unsigned GetPageSizeOnce() {
|
||||
return static_cast<unsigned>(info.dwPageSize);
|
||||
}
|
||||
|
||||
unsigned
|
||||
Process::GetPageSize() {
|
||||
static const unsigned PageSize = GetPageSizeOnce();
|
||||
return PageSize;
|
||||
// This constructor guaranteed to be run exactly once on a single thread, and
|
||||
// sets up various process invariants that can be queried cheaply from then on.
|
||||
self_process::self_process() : PageSize(getPageSize()) {
|
||||
}
|
||||
|
||||
|
||||
size_t
|
||||
Process::GetMallocUsage()
|
||||
{
|
||||
|
@ -28,6 +28,8 @@ TEST(ProcessTest, SelfProcess) {
|
||||
#elif defined(LLVM_ON_WIN32)
|
||||
EXPECT_EQ(GetCurrentProcess(), process::get_self()->get_id());
|
||||
#endif
|
||||
|
||||
EXPECT_LT(1u, process::get_self()->page_size());
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
|
Loading…
Reference in New Issue
Block a user