mergeWithExistingSpan merges free span [start, end] with adjacent existing free spans (both backward and forward).
(start, end common.Pgid)
| 220 | |
| 221 | // mergeWithExistingSpan merges free span [start, end] with adjacent existing free spans (both backward and forward). |
| 222 | func (f *hashMap) mergeWithExistingSpan(start, end common.Pgid) { |
| 223 | prev := start - 1 |
| 224 | next := end + 1 |
| 225 | |
| 226 | preSize, mergeWithPrev := f.backwardMap[prev] |
| 227 | nextSize, mergeWithNext := f.forwardMap[next] |
| 228 | newStart := start |
| 229 | newSize := uint64(end - start + 1) |
| 230 | |
| 231 | if mergeWithPrev { |
| 232 | // merge with previous span |
| 233 | prevStart := prev + 1 - common.Pgid(preSize) |
| 234 | f.delSpan(prevStart, preSize) |
| 235 | |
| 236 | newStart -= common.Pgid(preSize) |
| 237 | newSize += preSize |
| 238 | } |
| 239 | |
| 240 | if mergeWithNext { |
| 241 | // merge with next span |
| 242 | f.delSpan(next, nextSize) |
| 243 | newSize += nextSize |
| 244 | } |
| 245 | |
| 246 | f.addSpan(newStart, newSize) |
| 247 | } |
| 248 | |
| 249 | // idsFromFreemaps get all free page IDs from f.freemaps. |
| 250 | // used by test only. |