forked from GitHub/gf-core
descriptors released in the last transaction are now reused in the next
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user