1
0
forked from GitHub/gf-core

descriptors released in the last transaction are now reused in the next

This commit is contained in:
Krasimir Angelov
2022-05-23 09:50:58 +02:00
parent 9cd5634873
commit 35176cc721
2 changed files with 28 additions and 4 deletions

View File

@@ -348,6 +348,7 @@ PgfDB::PgfDB(const char* filepath, int flags, int mode) {
free_blocks = ms->free_blocks; free_blocks = ms->free_blocks;
free_descriptors[0] = ms->free_descriptors; free_descriptors[0] = ms->free_descriptors;
free_descriptors[1] = 0; free_descriptors[1] = 0;
free_descriptors[2] = 0;
} }
PGF_INTERNAL PGF_INTERNAL
@@ -644,6 +645,8 @@ object PgfDB::upd_block_descr(object map, object left, object right)
descr->chain = free_descriptors[1]; descr->chain = free_descriptors[1];
free_descriptors[1] = map; free_descriptors[1] = map;
if (free_descriptors[2] == 0)
free_descriptors[2] = map;
if (free_descriptors[0] != 0) { if (free_descriptors[0] != 0) {
map = free_descriptors[0]; map = free_descriptors[0];
@@ -955,6 +958,8 @@ fit:
int index = (descr->descr_txn_id != ms->curr_txn_id); int index = (descr->descr_txn_id != ms->curr_txn_id);
descr->chain = free_descriptors[index]; descr->chain = free_descriptors[index];
free_descriptors[index] = map; free_descriptors[index] = map;
if (index == 1 && free_descriptors[2] == 0)
free_descriptors[2] = map;
if (descr->left == 0) { if (descr->left == 0) {
return descr->right; return descr->right;
@@ -1172,6 +1177,7 @@ void PgfDB::start_transaction()
free_blocks = ms->free_blocks; free_blocks = ms->free_blocks;
free_descriptors[0] = ms->free_descriptors; free_descriptors[0] = ms->free_descriptors;
free_descriptors[1] = 0; free_descriptors[1] = 0;
free_descriptors[2] = 0;
} }
PGF_INTERNAL PGF_INTERNAL
@@ -1188,12 +1194,24 @@ void PgfDB::commit()
if (current_db->fd < 0) { if (current_db->fd < 0) {
ms->top = top; ms->top = top;
ms->free_blocks = free_blocks; ms->free_blocks = free_blocks;
if (free_descriptors[2] != 0) {
ptr(block_descr,free_descriptors[2])->chain = free_descriptors[0];
free_descriptors[0] = free_descriptors[1];
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
ms->free_descriptors = free_descriptors[0]; ms->free_descriptors = free_descriptors[0];
free_descriptors[1] = 0;
ms->curr_txn_id++; ms->curr_txn_id++;
res = 0; res = 0;
} else { } else {
#endif #endif
if (free_descriptors[2] != 0) {
ptr(block_descr,free_descriptors[2])->chain = free_descriptors[0];
free_descriptors[0] = free_descriptors[1];
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
res = msync((void *) base, mmap_size, MS_SYNC | MS_INVALIDATE); res = msync((void *) base, mmap_size, MS_SYNC | MS_INVALIDATE);
if (res != 0) if (res != 0)
throw pgf_systemerror(errno); throw pgf_systemerror(errno);
@@ -1201,7 +1219,6 @@ void PgfDB::commit()
ms->top = top; ms->top = top;
ms->free_blocks = free_blocks; ms->free_blocks = free_blocks;
ms->free_descriptors = free_descriptors[0]; ms->free_descriptors = free_descriptors[0];
free_descriptors[1] = 0;
ms->curr_txn_id++; ms->curr_txn_id++;
res = msync((void *) ms, page_size, MS_SYNC | MS_INVALIDATE); res = msync((void *) ms, page_size, MS_SYNC | MS_INVALIDATE);
@@ -1217,13 +1234,19 @@ void PgfDB::commit()
#endif #endif
#else #else
if (current_db->fd > 0) { if (current_db->fd > 0) {
if (free_descriptors[2] != 0) {
ptr(block_descr,free_descriptors[2])->chain = free_descriptors[0];
free_descriptors[0] = free_descriptors[1];
free_descriptors[1] = 0;
free_descriptors[2] = 0;
}
if (!FlushViewOfFile(base,mmap_size)) { if (!FlushViewOfFile(base,mmap_size)) {
throw pgf_systemerror(last_error_to_errno()); throw pgf_systemerror(last_error_to_errno());
} }
ms->top = top; ms->top = top;
ms->free_blocks = free_blocks; ms->free_blocks = free_blocks;
ms->free_descriptors = free_descriptors[0]; ms->free_descriptors = free_descriptors[0];
free_descriptors[1] = 0;
ms->curr_txn_id++; ms->curr_txn_id++;
if (!FlushViewOfFile(ms,page_size)) { if (!FlushViewOfFile(ms,page_size)) {
ms->top = save_top; ms->top = save_top;
@@ -1243,6 +1266,7 @@ void PgfDB::rollback()
free_blocks = ms->free_blocks; free_blocks = ms->free_blocks;
free_descriptors[0] = ms->free_descriptors; free_descriptors[0] = ms->free_descriptors;
free_descriptors[1] = 0; free_descriptors[1] = 0;
free_descriptors[2] = 0;
} }
#ifdef _WIN32 #ifdef _WIN32

View File

@@ -70,7 +70,7 @@ private:
// The exception is when a transaction is active. // The exception is when a transaction is active.
object top; object top;
object free_blocks; object free_blocks;
object free_descriptors[2]; object free_descriptors[3];
size_t mmap_size; size_t mmap_size;
size_t page_size; size_t page_size;