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