mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 19:42:50 -06:00
potentially speed up the database expansion on Windows and macOS
This commit is contained in:
@@ -143,6 +143,13 @@ static inline ssize_t get_mmap_size(size_t init_size, size_t page_size)
|
|||||||
return mmap_size;
|
return mmap_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline ssize_t get_mremap_size(size_t file_size, size_t block_size, size_t free_size, size_t page_size)
|
||||||
|
{
|
||||||
|
size_t n_pages =
|
||||||
|
((file_size - free_size + block_size + page_size - 1) / page_size);
|
||||||
|
return get_next_padovan(n_pages) * page_size ;
|
||||||
|
}
|
||||||
|
|
||||||
PGF_INTERNAL
|
PGF_INTERNAL
|
||||||
PgfDB::PgfDB(const char* filepath, int flags, int mode, size_t init_size) {
|
PgfDB::PgfDB(const char* filepath, int flags, int mode, size_t init_size) {
|
||||||
bool is_new = false;
|
bool is_new = false;
|
||||||
@@ -825,11 +832,8 @@ PGF_INTERNAL_DECL object PgfDB::new_block_descr(object o, size_t size, txn_t txn
|
|||||||
|
|
||||||
size_t free_size = mmap_size - top;
|
size_t free_size = mmap_size - top;
|
||||||
if (block_size > free_size) {
|
if (block_size > free_size) {
|
||||||
size_t alloc_size =
|
|
||||||
((block_size - free_size + page_size - 1) / page_size) * page_size;
|
|
||||||
size_t new_size =
|
size_t new_size =
|
||||||
ms->file_size + alloc_size;
|
get_mremap_size(ms->file_size, block_size, free_size, page_size);
|
||||||
|
|
||||||
resize_map(new_size, true);
|
resize_map(new_size, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -881,11 +885,8 @@ object PgfDB::upd_block_descr(object map, object left, object right)
|
|||||||
|
|
||||||
size_t free_size = mmap_size - top;
|
size_t free_size = mmap_size - top;
|
||||||
if (block_size > free_size) {
|
if (block_size > free_size) {
|
||||||
size_t alloc_size =
|
|
||||||
((block_size - free_size + page_size - 1) / page_size) * page_size;
|
|
||||||
size_t new_size =
|
size_t new_size =
|
||||||
ms->file_size + alloc_size;
|
get_mremap_size(ms->file_size, block_size, free_size, page_size);
|
||||||
|
|
||||||
resize_map(new_size, true);
|
resize_map(new_size, true);
|
||||||
|
|
||||||
// refresh the pointer
|
// refresh the pointer
|
||||||
@@ -1295,11 +1296,8 @@ object PgfDB::malloc_internal(size_t bytes)
|
|||||||
|
|
||||||
size_t free_size = mmap_size - top;
|
size_t free_size = mmap_size - top;
|
||||||
if (block_size > free_size) {
|
if (block_size > free_size) {
|
||||||
size_t alloc_size =
|
|
||||||
((block_size - free_size + page_size - 1) / page_size) * page_size;
|
|
||||||
size_t new_size =
|
size_t new_size =
|
||||||
ms->file_size + alloc_size;
|
get_mremap_size(ms->file_size, block_size, free_size, page_size);
|
||||||
|
|
||||||
resize_map(new_size, true);
|
resize_map(new_size, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1331,11 +1329,8 @@ object PgfDB::realloc_internal(object oldo, size_t old_bytes, size_t new_bytes,
|
|||||||
ssize_t free_size = mmap_size - top;
|
ssize_t free_size = mmap_size - top;
|
||||||
|
|
||||||
if (nb > free_size) {
|
if (nb > free_size) {
|
||||||
size_t alloc_size =
|
|
||||||
((nb - free_size + page_size - 1) / page_size) * page_size;
|
|
||||||
size_t new_size =
|
size_t new_size =
|
||||||
ms->file_size + alloc_size;
|
get_mremap_size(ms->file_size, nb, free_size, page_size);
|
||||||
|
|
||||||
resize_map(new_size, true);
|
resize_map(new_size, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user