|
|
@@ -166,12 +166,16 @@ func (f *freelist) read(p *page) {
|
|
|
}
|
|
|
|
|
|
// Copy the list of page ids from the freelist.
|
|
|
- ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count]
|
|
|
- f.ids = make([]pgid, len(ids))
|
|
|
- copy(f.ids, ids)
|
|
|
+ if count == 0 {
|
|
|
+ f.ids = nil
|
|
|
+ } else {
|
|
|
+ ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count]
|
|
|
+ f.ids = make([]pgid, len(ids))
|
|
|
+ copy(f.ids, ids)
|
|
|
|
|
|
- // Make sure they're sorted.
|
|
|
- sort.Sort(pgids(f.ids))
|
|
|
+ // Make sure they're sorted.
|
|
|
+ sort.Sort(pgids(f.ids))
|
|
|
+ }
|
|
|
|
|
|
// Rebuild the page cache.
|
|
|
f.reindex()
|
|
|
@@ -189,7 +193,9 @@ func (f *freelist) write(p *page) error {
|
|
|
|
|
|
// The page.count can only hold up to 64k elements so if we overflow that
|
|
|
// number then we handle it by putting the size in the first element.
|
|
|
- if len(ids) < 0xFFFF {
|
|
|
+ if len(ids) == 0 {
|
|
|
+ p.count = uint16(len(ids))
|
|
|
+ } else if len(ids) < 0xFFFF {
|
|
|
p.count = uint16(len(ids))
|
|
|
copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:], ids)
|
|
|
} else {
|