13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_ZONE_INL_H_
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_ZONE_INL_H_
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h"
93ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_USE_ADDRESS_SANITIZER
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #include <sanitizer/asan_interface.h>
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  #define ASAN_UNPOISON_MEMORY_REGION(start, size) ((void) 0)
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/counters.h"
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/isolate.h"
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h"
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kASanRedzoneBytes = 24;  // Must be a multiple of 8.
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Zone::excess_allocation() {
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return segment_bytes_allocated_ > kExcessLimit;
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Zone::adjust_segment_bytes_allocated(int delta) {
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  segment_bytes_allocated_ += delta;
3444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  isolate_->counters()->zone_segment_bytes()->Set(segment_bytes_allocated_);
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
386ded16be15dd865a9b21ea304d5273c8be299c87Steve Blocktemplate <typename Config>
396ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockZoneSplayTree<Config>::~ZoneSplayTree() {
406ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // Reset the root to avoid unneeded iteration over all tree nodes
416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // in the destructor.  For a zone-allocated tree, nodes will be
426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  // freed by the Zone.
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SplayTree<Config, ZoneAllocationPolicy>::ResetRoot();
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid* ZoneObject::operator new(size_t size, Zone* zone) {
488b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return zone->New(static_cast<int>(size));
498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void* ZoneAllocationPolicy::New(size_t size) {
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(zone_);
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return zone_->New(static_cast<int>(size));
54257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
55257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
56257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
57257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtemplate <typename T>
58257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid* ZoneList<T>::operator new(size_t size, Zone* zone) {
59257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return zone->New(static_cast<int>(size));
60257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
61257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
62257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <typename T>
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid* ZoneSplayTree<T>::operator new(size_t size, Zone* zone) {
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return zone->New(static_cast<int>(size));
6644f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
6744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
6844f0eee88ff00398ff7f715fab053374d808c90dSteve Block
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_ZONE_INL_H_
72