summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/db.c1
-rw-r--r--src/common/ers.c21
-rw-r--r--src/common/ers.h6
3 files changed, 25 insertions, 3 deletions
diff --git a/src/common/db.c b/src/common/db.c
index 561371787..99c758a8d 100644
--- a/src/common/db.c
+++ b/src/common/db.c
@@ -2611,6 +2611,7 @@ void* db_data2ptr(DBData *data)
void db_init(void) {
db_iterator_ers = ers_new(sizeof(struct DBIterator_impl),"db.c::db_iterator_ers",ERS_OPT_NONE);
db_alloc_ers = ers_new(sizeof(struct DBMap_impl),"db.c::db_alloc_ers",ERS_OPT_NONE);
+ ers_chunk_size(db_alloc_ers, 50);
DB_COUNTSTAT(db_init);
}
diff --git a/src/common/ers.c b/src/common/ers.c
index 69b7609d6..27d9222ff 100644
--- a/src/common/ers.c
+++ b/src/common/ers.c
@@ -84,6 +84,9 @@ typedef struct ers_cache
// Objects in-use count
unsigned int UsedObjs;
+ // Default = ERS_BLOCK_ENTRIES, can be adjusted for performance for individual cache sizes.
+ unsigned int ChunkSize;
+
// Linked list
struct ers_cache *Next, *Prev;
} ers_cache_t;
@@ -136,6 +139,7 @@ static ers_cache_t *ers_find_cache(unsigned int size)
cache->Used = 0;
cache->UsedObjs = 0;
cache->Max = 0;
+ cache->ChunkSize = ERS_BLOCK_ENTRIES;
if (CacheList == NULL)
{
@@ -200,10 +204,10 @@ static void *ers_obj_alloc_entry(ERS self)
RECREATE(instance->Cache->Blocks, unsigned char *, instance->Cache->Max);
}
- CREATE(instance->Cache->Blocks[instance->Cache->Used], unsigned char, instance->Cache->ObjectSize * ERS_BLOCK_ENTRIES);
+ CREATE(instance->Cache->Blocks[instance->Cache->Used], unsigned char, instance->Cache->ObjectSize * instance->Cache->ChunkSize);
instance->Cache->Used++;
- instance->Cache->Free = ERS_BLOCK_ENTRIES -1;
+ instance->Cache->Free = instance->Cache->ChunkSize -1;
ret = &instance->Cache->Blocks[instance->Cache->Used - 1][instance->Cache->Free * instance->Cache->ObjectSize + sizeof(struct ers_list)];
}
@@ -286,6 +290,18 @@ static void ers_obj_destroy(ERS self)
aFree(instance);
}
+void ers_cache_size(ERS self, unsigned int new_size) {
+ struct ers_instance_t *instance = (struct ers_instance_t *)self;
+
+ if (instance == NULL) {
+ ShowError("ers_cache_size: NULL object, skipping...\n");
+ return;
+ }
+
+ instance->Cache->ChunkSize = new_size;
+}
+
+
ERS ers_new(uint32 size, char *name, enum ERSOptions options)
{
struct ers_instance_t *instance;
@@ -299,6 +315,7 @@ ERS ers_new(uint32 size, char *name, enum ERSOptions options)
instance->VTable.free = ers_obj_free_entry;
instance->VTable.entry_size = ers_obj_entry_size;
instance->VTable.destroy = ers_obj_destroy;
+ instance->VTable.chunk_size = ers_cache_size;
instance->Name = ( options & ERS_OPT_FREE_NAME ) ? aStrdup(name) : name;
instance->Options = options;
diff --git a/src/common/ers.h b/src/common/ers.h
index 4871d8d50..51701d778 100644
--- a/src/common/ers.h
+++ b/src/common/ers.h
@@ -119,6 +119,8 @@ typedef struct eri {
*/
void (*destroy)(struct eri *self);
+ /* */
+ void (*chunk_size) (struct eri *self, unsigned int new_size);
} *ERS;
#ifdef DISABLE_ERS
@@ -127,6 +129,7 @@ typedef struct eri {
# define ers_free(obj,entry) aFree(entry)
# define ers_entry_size(obj) (size_t)0
# define ers_destroy(obj)
+# define ers_chunk_size(obj,size)
// Disable the public functions
# define ers_new(size,name,options) NULL
# define ers_report()
@@ -138,6 +141,7 @@ typedef struct eri {
# define ers_free(obj,entry) (obj)->free((obj),(entry))
# define ers_entry_size(obj) (obj)->entry_size(obj)
# define ers_destroy(obj) (obj)->destroy(obj)
+# define ers_chunk_size(obj,size) (obj)->chunk_size(obj,size)
/**
* Get a new instance of the manager that handles the specified entry size.
@@ -154,7 +158,7 @@ ERS ers_new(uint32 size, char *name, enum ERSOptions options);
/**
* Print a report about the current state of the Entry Reusage System.
* Shows information about the global system and each entry manager.
- * The number of entries are checked and a warning is shown if extra reusable
+ * The number of entries are checked and a warning is shown if extra reusable
* entries are found.
* The extra entries are included in the count of reusable entries.
*/