Differences From
Artifact [7e2b478eaf]:
207 207 self.sz = sz
208 208 self.debris = [&m.pool](b)
209 209 self.debris.storage = nil
210 210 return self
211 211 end
212 212
213 213 terra m.pool:free(): {}
214 -lib.io.fmt('DRAINING POOL %p\n',self.storage)
215 214 if self.storage == nil then return end
216 215 if self.debris.storage ~= nil then self.debris:free() end
217 216 m.heapf(self.debris) -- storage + debris field allocated in one block
218 217 self.storage = nil
219 218 self.cursor = nil
220 219 self.sz = 0
221 220 self.debris = nil
................................................................................
224 223 terra m.pool:clear()
225 224 if self.debris.storage ~= nil then self.debris:free() end
226 225 self.cursor = self.storage
227 226 return self
228 227 end
229 228
230 229 terra m.pool:alloc_bytes(sz: intptr): &opaque
231 - var space = self.sz - ([&uint8](self.cursor) - [&uint8](self.storage))
232 -lib.io.fmt('%p / %p @ allocating %llu bytes in %llu of space\n',self.storage,self.cursor,sz,space)
230 + var space: intptr = self.sz - ([&uint8](self.cursor) - [&uint8](self.storage))
233 231 if space < sz then
234 -lib.dbg('reserving more space')
235 - self:cue(space + sz + 256) end
232 + self:cue(self.sz + sz + 256) end
236 233 var ptr = self.cursor
237 234 self.cursor = [&opaque]([&uint8](self.cursor) + sz)
238 235 return ptr
239 236 end
240 237
241 238 terra m.pool:realloc_bytes(oldptr: &opaque, oldsz: intptr, newsz: intptr): &opaque
242 - var space = self.sz - ([&uint8](self.cursor) - [&uint8](self.storage))
239 + var space: intptr = self.sz - ([&uint8](self.cursor) - [&uint8](self.storage))
243 240 var cur = [&uint8](self.cursor)
244 241 if cur - [&uint8](oldptr) == oldsz and newsz - oldsz < space then
245 242 lib.dbg('moving pool cursor')
246 243 cur = cur + (newsz - oldsz)
247 244 self.cursor = [&opaque](cur)
248 245 return oldptr
249 246 else