duke@435: /* duke@435: * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved. duke@435: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: * duke@435: * This code is free software; you can redistribute it and/or modify it duke@435: * under the terms of the GNU General Public License version 2 only, as duke@435: * published by the Free Software Foundation. duke@435: * duke@435: * This code is distributed in the hope that it will be useful, but WITHOUT duke@435: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: * version 2 for more details (a copy is included in the LICENSE file that duke@435: * accompanied this code). duke@435: * duke@435: * You should have received a copy of the GNU General Public License version duke@435: * 2 along with this work; if not, write to the Free Software Foundation, duke@435: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: * duke@435: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@435: * CA 95054 USA or visit www.sun.com if you need additional information or duke@435: * have any questions. duke@435: * duke@435: */ duke@435: duke@435: duke@435: // Contains two virtual spaces that each can individually span duke@435: // most of the reserved region but committed parts of which duke@435: // cannot overlap. duke@435: // duke@435: // +-------+ <--- high_boundary for H duke@435: // | | duke@435: // | H | duke@435: // | | duke@435: // | | duke@435: // | | duke@435: // --------- <--- low for H duke@435: // | | duke@435: // ========= <--- low_boundary for H, high_boundary for L duke@435: // | | duke@435: // | | duke@435: // | | duke@435: // --------- <--- high for L duke@435: // | | duke@435: // | L | duke@435: // | | duke@435: // | | duke@435: // | | duke@435: // +-------+ <--- low_boundary for L duke@435: // duke@435: // Each virtual space in the AdjoiningVirtualSpaces grows and shrink duke@435: // within its reserved region (between the low_boundary and the duke@435: // boundary) independently. If L want to grow above its high_boundary, duke@435: // then the high_boundary of L and the low_boundary of H must be duke@435: // moved up consistently. AdjoiningVirtualSpaces provide the duke@435: // interfaces for moving the this boundary. duke@435: duke@435: class AdjoiningVirtualSpaces { duke@435: // space at the high end and the low end, respectively duke@435: PSVirtualSpace* _high; duke@435: PSVirtualSpace* _low; duke@435: duke@435: // The reserved space spanned by the two spaces. duke@435: ReservedSpace _reserved_space; duke@435: duke@435: // The minimum byte size for the low space. It will not duke@435: // be shrunk below this value. duke@435: size_t _min_low_byte_size; duke@435: // Same for the high space duke@435: size_t _min_high_byte_size; duke@435: duke@435: const size_t _alignment; duke@435: duke@435: public: duke@435: // Allocates two virtual spaces that will be located at the duke@435: // high and low ends. Does no initialization. duke@435: AdjoiningVirtualSpaces(ReservedSpace rs, duke@435: size_t min_low_byte_size, duke@435: size_t min_high_byte_size, duke@435: size_t alignment); duke@435: duke@435: // accessors duke@435: PSVirtualSpace* high() { return _high; } duke@435: PSVirtualSpace* low() { return _low; } duke@435: ReservedSpace reserved_space() { return _reserved_space; } duke@435: size_t min_low_byte_size() { return _min_low_byte_size; } duke@435: size_t min_high_byte_size() { return _min_high_byte_size; } duke@435: size_t alignment() const { return _alignment; } duke@435: duke@435: // move boundary between the two spaces up duke@435: bool adjust_boundary_up(size_t size_in_bytes); duke@435: // and down duke@435: bool adjust_boundary_down(size_t size_in_bytes); duke@435: duke@435: // Maximum byte size for the high space. duke@435: size_t high_byte_size_limit() { duke@435: return _reserved_space.size() - _min_low_byte_size; duke@435: } duke@435: // Maximum byte size for the low space. duke@435: size_t low_byte_size_limit() { duke@435: return _reserved_space.size() - _min_high_byte_size; duke@435: } duke@435: duke@435: // Sets the boundaries for the virtual spaces and commits and duke@435: // initial size; duke@435: void initialize(size_t max_low_byte_size, duke@435: size_t init_low_byte_size, duke@435: size_t init_high_byte_size); duke@435: };