130 131 // Insert after current segment 132 insert_segment(current + 1, segment.start(), segment.size(), segment.is_committed()); 133 return; 134 } 135 } 136 137 if (_segments.length() > 0 && is_mergable(segment, _segments.at(0))) { 138 // Merge with start of first segment 139 const size_t start = segment.start(); 140 const size_t size = segment.size() + _segments.at(0).size(); 141 replace_segment(0, start, size, segment.is_committed()); 142 return; 143 } 144 145 // Insert before first segment 146 insert_segment(0, segment.start(), segment.size(), segment.is_committed()); 147 } 148 149 bool ZPhysicalMemory::commit_segment(int index, size_t size) { 150 ZPhysicalMemorySegment& segment = _segments.at(index); 151 152 assert(size <= segment.size(), "Invalid size"); 153 assert(!segment.is_committed(), "Invalid state"); 154 155 if (size == segment.size()) { 156 // Completely committed 157 segment.set_committed(true); 158 return true; 159 } 160 161 if (size > 0) { 162 // Partially committed, split segment 163 insert_segment(index + 1, segment.start() + size, segment.size() - size, false /* committed */); 164 replace_segment(index, segment.start(), size, true /* committed */); 165 } 166 167 return false; 168 } 169 170 bool ZPhysicalMemory::uncommit_segment(int index, size_t size) { 171 ZPhysicalMemorySegment& segment = _segments.at(index); 172 173 assert(size <= segment.size(), "Invalid size"); 174 assert(segment.is_committed(), "Invalid state"); 175 176 if (size == segment.size()) { 177 // Completely uncommitted 178 segment.set_committed(false); 179 return true; 180 } 181 182 if (size > 0) { 183 // Partially uncommitted, split segment 184 insert_segment(index + 1, segment.start() + size, segment.size() - size, true /* committed */); 185 replace_segment(index, segment.start(), size, false /* committed */); 186 } 187 188 return false; 189 } 190 191 ZPhysicalMemory ZPhysicalMemory::split(size_t size) { 192 ZPhysicalMemory pmem; 193 int nsegments = 0; 194 195 for (int i = 0; i < _segments.length(); i++) { 196 const ZPhysicalMemorySegment& segment = _segments.at(i); 197 if (pmem.size() < size) { 198 if (pmem.size() + segment.size() <= size) { 199 // Transfer segment 200 pmem.add_segment(segment); 201 } else { 202 // Split segment 203 const size_t split_size = size - pmem.size(); 204 pmem.add_segment(ZPhysicalMemorySegment(segment.start(), split_size, segment.is_committed())); 205 _segments.at_put(nsegments++, ZPhysicalMemorySegment(segment.start() + split_size, segment.size() - split_size, segment.is_committed())); | 130 131 // Insert after current segment 132 insert_segment(current + 1, segment.start(), segment.size(), segment.is_committed()); 133 return; 134 } 135 } 136 137 if (_segments.length() > 0 && is_mergable(segment, _segments.at(0))) { 138 // Merge with start of first segment 139 const size_t start = segment.start(); 140 const size_t size = segment.size() + _segments.at(0).size(); 141 replace_segment(0, start, size, segment.is_committed()); 142 return; 143 } 144 145 // Insert before first segment 146 insert_segment(0, segment.start(), segment.size(), segment.is_committed()); 147 } 148 149 bool ZPhysicalMemory::commit_segment(int index, size_t size) { 150 assert(size <= _segments.at(index).size(), "Invalid size"); 151 assert(!_segments.at(index).is_committed(), "Invalid state"); 152 153 if (size == _segments.at(index).size()) { 154 // Completely committed 155 _segments.at(index).set_committed(true); 156 return true; 157 } 158 159 if (size > 0) { 160 // Partially committed, split segment 161 insert_segment(index + 1, _segments.at(index).start() + size, _segments.at(index).size() - size, false /* committed */); 162 replace_segment(index, _segments.at(index).start(), size, true /* committed */); 163 } 164 165 return false; 166 } 167 168 bool ZPhysicalMemory::uncommit_segment(int index, size_t size) { 169 assert(size <= _segments.at(index).size(), "Invalid size"); 170 assert(_segments.at(index).is_committed(), "Invalid state"); 171 172 if (size == _segments.at(index).size()) { 173 // Completely uncommitted 174 _segments.at(index).set_committed(false); 175 return true; 176 } 177 178 if (size > 0) { 179 // Partially uncommitted, split segment 180 insert_segment(index + 1, _segments.at(index).start() + size, _segments.at(index).size() - size, true /* committed */); 181 replace_segment(index, _segments.at(index).start(), size, false /* committed */); 182 } 183 184 return false; 185 } 186 187 ZPhysicalMemory ZPhysicalMemory::split(size_t size) { 188 ZPhysicalMemory pmem; 189 int nsegments = 0; 190 191 for (int i = 0; i < _segments.length(); i++) { 192 const ZPhysicalMemorySegment& segment = _segments.at(i); 193 if (pmem.size() < size) { 194 if (pmem.size() + segment.size() <= size) { 195 // Transfer segment 196 pmem.add_segment(segment); 197 } else { 198 // Split segment 199 const size_t split_size = size - pmem.size(); 200 pmem.add_segment(ZPhysicalMemorySegment(segment.start(), split_size, segment.is_committed())); 201 _segments.at_put(nsegments++, ZPhysicalMemorySegment(segment.start() + split_size, segment.size() - split_size, segment.is_committed())); |