mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-08 10:42:50 -06:00
make it possible to control the initial NGF size
This commit is contained in:
@@ -134,9 +134,16 @@ struct PGF_INTERNAL_DECL malloc_state
|
||||
revision_entry revisions[];
|
||||
};
|
||||
|
||||
static inline ssize_t get_mmap_size(size_t init_size, size_t page_size)
|
||||
{
|
||||
size_t mmap_size = ((init_size+page_size-1)/page_size)*page_size;
|
||||
if (mmap_size < page_size*2)
|
||||
mmap_size = page_size*2;
|
||||
return mmap_size;
|
||||
}
|
||||
|
||||
PGF_INTERNAL
|
||||
PgfDB::PgfDB(const char* filepath, int flags, int mode) {
|
||||
PgfDB::PgfDB(const char* filepath, int flags, int mode, size_t init_size) {
|
||||
bool is_new = false;
|
||||
|
||||
fd = -1;
|
||||
@@ -147,7 +154,7 @@ PgfDB::PgfDB(const char* filepath, int flags, int mode) {
|
||||
|
||||
if (filepath == NULL) {
|
||||
this->filepath = NULL;
|
||||
mmap_size = page_size*2;
|
||||
mmap_size = get_mmap_size(init_size, page_size);
|
||||
is_new = true;
|
||||
} else {
|
||||
fd = open(filepath, flags, mode);
|
||||
@@ -163,7 +170,7 @@ PgfDB::PgfDB(const char* filepath, int flags, int mode) {
|
||||
|
||||
is_new = false;
|
||||
if (mmap_size == 0) {
|
||||
mmap_size = page_size*2;
|
||||
mmap_size = get_mmap_size(init_size, page_size);
|
||||
if (ftruncate(fd, mmap_size) < 0) {
|
||||
int code = errno;
|
||||
close(fd);
|
||||
|
||||
@@ -101,7 +101,7 @@ public:
|
||||
// When the count is zero we release the database.
|
||||
size_t ref_count;
|
||||
|
||||
PGF_INTERNAL_DECL PgfDB(const char* filepath, int flags, int mode);
|
||||
PGF_INTERNAL_DECL PgfDB(const char* filepath, int flags, int mode, size_t init_size);
|
||||
PGF_INTERNAL_DECL ~PgfDB();
|
||||
|
||||
PGF_INTERNAL_DECL static txn_t get_txn_id();
|
||||
|
||||
@@ -46,12 +46,16 @@ PgfDB *pgf_read_pgf(const char* fpath, PgfRevision *revision,
|
||||
FILE *in = NULL;
|
||||
|
||||
PGF_API_BEGIN {
|
||||
db = new PgfDB(NULL, 0, 0);
|
||||
in = fopen(fpath, "rb");
|
||||
if (!in) {
|
||||
throw pgf_systemerror(errno, fpath);
|
||||
}
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
size_t pgf_size = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
db = new PgfDB(NULL, 0, 0, pgf_size*7);
|
||||
|
||||
{
|
||||
DB_scope scope(db, WRITER_SCOPE);
|
||||
|
||||
@@ -71,12 +75,12 @@ PgfDB *pgf_read_pgf(const char* fpath, PgfRevision *revision,
|
||||
return db;
|
||||
} PGF_API_END
|
||||
|
||||
if (in != NULL)
|
||||
fclose(in);
|
||||
|
||||
if (db != NULL)
|
||||
delete db;
|
||||
|
||||
if (in != NULL)
|
||||
fclose(in);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -90,19 +94,23 @@ PgfDB *pgf_boot_ngf(const char* pgf_path, const char* ngf_path,
|
||||
FILE *in = NULL;
|
||||
|
||||
PGF_API_BEGIN {
|
||||
db = new PgfDB(ngf_path, O_CREAT | O_EXCL | O_RDWR,
|
||||
#ifndef _WIN32
|
||||
S_IRUSR | S_IWUSR
|
||||
#else
|
||||
_S_IREAD | _S_IWRITE
|
||||
#endif
|
||||
);
|
||||
|
||||
in = fopen(pgf_path, "rb");
|
||||
if (!in) {
|
||||
throw pgf_systemerror(errno, pgf_path);
|
||||
}
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
size_t pgf_size = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
db = new PgfDB(ngf_path, O_CREAT | O_EXCL | O_RDWR,
|
||||
#ifndef _WIN32
|
||||
S_IRUSR | S_IWUSR,
|
||||
#else
|
||||
_S_IREAD | _S_IWRITE,
|
||||
#endif
|
||||
pgf_size*7);
|
||||
|
||||
{
|
||||
DB_scope scope(db, WRITER_SCOPE);
|
||||
|
||||
@@ -141,7 +149,7 @@ PgfDB *pgf_read_ngf(const char *fpath,
|
||||
PgfDB *db = NULL;
|
||||
|
||||
PGF_API_BEGIN {
|
||||
db = new PgfDB(fpath, O_RDWR, 0);
|
||||
db = new PgfDB(fpath, O_RDWR, 0, 0);
|
||||
|
||||
{
|
||||
DB_scope scope(db, WRITER_SCOPE);
|
||||
@@ -165,6 +173,7 @@ PgfDB *pgf_read_ngf(const char *fpath,
|
||||
PGF_API
|
||||
PgfDB *pgf_new_ngf(PgfText *abstract_name,
|
||||
const char *fpath,
|
||||
size_t init_size,
|
||||
PgfRevision *revision,
|
||||
PgfExn* err)
|
||||
{
|
||||
@@ -173,11 +182,11 @@ PgfDB *pgf_new_ngf(PgfText *abstract_name,
|
||||
PGF_API_BEGIN {
|
||||
db = new PgfDB(fpath, O_CREAT | O_EXCL | O_RDWR,
|
||||
#ifndef _WIN32
|
||||
S_IRUSR | S_IWUSR
|
||||
S_IRUSR | S_IWUSR,
|
||||
#else
|
||||
_S_IREAD | _S_IWRITE
|
||||
_S_IREAD | _S_IWRITE,
|
||||
#endif
|
||||
);
|
||||
init_size);
|
||||
|
||||
{
|
||||
DB_scope scope(db, WRITER_SCOPE);
|
||||
|
||||
@@ -276,6 +276,7 @@ PgfDB *pgf_read_ngf(const char* fpath,
|
||||
PGF_API_DECL
|
||||
PgfDB *pgf_new_ngf(PgfText *abstract_name,
|
||||
const char *fpath,
|
||||
size_t init_size,
|
||||
PgfRevision *revision,
|
||||
PgfExn* err);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user