/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ parcel Lucy; /** * Specialized memory allocator. * * Grab memory from the system in 1 MB chunks. Don't release it until object * destruction. Parcel the memory out on request. * * The release mechanism is fast but extremely crude, limiting the use of this * class to specific applications. */ class Lucy::Util::MemoryPool cnick MemPool inherits Clownfish::Obj { uint32_t arena_size; VArray *arenas; int32_t tick; char *buf; char *last_buf; char *limit; size_t consumed; /* bytes allocated (not cap) */ /** * @param arena_size The size of each internally allocated memory slab. * If 0, it will be set to 1 MiB. */ inert incremented MemoryPool* new(uint32_t arena_size); inert MemoryPool* init(MemoryPool *self, uint32_t arena_size); /** Allocate memory from the pool. */ void* Grab(MemoryPool *self, size_t amount); /** Resize the last allocation. (*Only* the last allocation). */ void Resize(MemoryPool *self, void *ptr, size_t revised_amount); /** Tell the pool to consider all previous allocations released. */ void Release_All(MemoryPool *self); /** Take ownership of all the arenas in another MemoryPool. Can only be * called when the original memory pool has no outstanding allocations, * typically just after a call to Release_All. The purpose is to support * bulk reallocation. */ void Eat(MemoryPool *self, MemoryPool *other); size_t Get_Consumed(MemoryPool *self); public void Destroy(MemoryPool *self); }