blob: 61934d1e00295ebf57670bc6510a93c40d99a34c [file] [log] [blame]
/* 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 Lucy::Object::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);
}