< prev index next >

src/hotspot/share/gc/z/zPhysicalMemory.cpp

Print this page




 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()));


< prev index next >