v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
active-system-pages.cc
Go to the documentation of this file.
1// Copyright 2022 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <climits>
8
9#include "src/base/bits.h"
10#include "src/base/macros.h"
11
12namespace heap {
13namespace base {
14
15size_t ActiveSystemPages::Init(size_t header_size, size_t page_size_bits,
16 size_t user_page_size) {
17#if DEBUG
18 size_t page_size = 1 << page_size_bits;
19 DCHECK_LE(RoundUp(user_page_size, page_size) >> page_size_bits,
21#endif // DEBUG
22 Clear();
23 return Add(0, header_size, page_size_bits);
24}
25
26size_t ActiveSystemPages::Add(uintptr_t start, uintptr_t end,
27 size_t page_size_bits) {
28 const size_t page_size = 1 << page_size_bits;
29
31 DCHECK_LE(end, kMaxPages * page_size);
32
33 // Make sure we actually get the bitcount as argument.
34 DCHECK_LT(page_size_bits, sizeof(uintptr_t) * CHAR_BIT);
35
36 const uintptr_t start_page_bit =
37 RoundDown(start, page_size) >> page_size_bits;
38 const uintptr_t end_page_bit = RoundUp(end, page_size) >> page_size_bits;
39 DCHECK_LE(start_page_bit, end_page_bit);
40
41 const uintptr_t bits = end_page_bit - start_page_bit;
42 DCHECK_LE(bits, kMaxPages);
43 const bitset_t mask = bits == kMaxPages
44 ? int64_t{-1}
45 : ((uint64_t{1} << bits) - 1) << start_page_bit;
46 const bitset_t added_pages = ~value_ & mask;
47 value_ |= mask;
48 return added_pages.count();
49}
50
52 DCHECK_EQ(~value_ & updated_value.value_, 0);
53 const bitset_t removed_pages(value_ & ~updated_value.value_);
54 value_ = updated_value.value_;
55 return removed_pages.count();
56}
57
59 const size_t removed_pages = value_.count();
60 value_ = 0;
61 return removed_pages;
62}
63
64size_t ActiveSystemPages::Size(size_t page_size_bits) const {
65 // Make sure we don't get the full page size as argument.
66 DCHECK_LT(page_size_bits, sizeof(uintptr_t) * CHAR_BIT);
67 return value_.count() * (size_t{1} << page_size_bits);
68}
69
70} // namespace base
71} // namespace heap
V8_EXPORT_PRIVATE size_t Add(size_t start, size_t end, size_t page_size_bits)
static constexpr size_t kMaxPages
std::bitset< kMaxPages > bitset_t
V8_EXPORT_PRIVATE size_t Reduce(ActiveSystemPages updated_value)
V8_EXPORT_PRIVATE size_t Init(size_t header_size, size_t page_size_bits, size_t user_page_size)
V8_EXPORT_PRIVATE size_t Clear()
V8_EXPORT_PRIVATE size_t Size(size_t page_size_bits) const
int start
int end
uint32_t const mask
#define DCHECK_LE(v1, v2)
Definition logging.h:490
#define DCHECK_LT(v1, v2)
Definition logging.h:489
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
constexpr T RoundUp(T x, intptr_t m)
Definition macros.h:387
constexpr T RoundDown(T x, intptr_t m)
Definition macros.h:371