diff options
Diffstat (limited to 'src/common/db.c')
-rw-r--r-- | src/common/db.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/common/db.c b/src/common/db.c index 12d54176c..9f2c75a68 100644 --- a/src/common/db.c +++ b/src/common/db.c @@ -65,7 +65,7 @@ static unsigned int strdb_hash(struct dbt* table,void* a) return h; } -struct dbt* strdb_init(int maxlen) +struct dbt* strdb_init_(int maxlen,const char *file,int line) { int i; struct dbt* table; @@ -77,6 +77,9 @@ struct dbt* strdb_init(int maxlen) table->maxlen=maxlen; for(i=0;i<HASH_SIZE;i++) table->ht[i]=NULL; + table->alloc_file = file; + table->alloc_line = line; + table->item_count = 0; return table; } @@ -98,7 +101,7 @@ static unsigned int numdb_hash(struct dbt* table,void* a) return (unsigned int)a; } -struct dbt* numdb_init(void) +struct dbt* numdb_init_(const char *file,int line) { int i; struct dbt* table; @@ -110,6 +113,9 @@ struct dbt* numdb_init(void) table->maxlen=sizeof(int); for(i=0;i<HASH_SIZE;i++) table->ht[i]=NULL; + table->alloc_file = file; + table->alloc_line = line; + table->item_count = 0; return table; } @@ -400,6 +406,7 @@ struct dbn* db_insert(struct dbt *table,void* key,void* data) db_rebalance(p,&table->ht[hash]); } } + table->item_count++; return p; } @@ -428,12 +435,14 @@ void* db_erase(struct dbt *table,void* key) #else aFree(p); #endif + table->item_count--; return data; } void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...) { int i,sp; + int count = 0; // red-black treeなので64個stackがあれば2^32個ノードまで大丈夫 struct dbn *p,*pn,*stack[64]; va_list ap; @@ -449,6 +458,7 @@ void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...) // printf("Warning: no data for key %d in db_foreach (db.c) !\n",(int)p->key); //} else { func(p->key, p->data, ap); + count++; //} if((pn=p->left)!=NULL){ if(p->right){ @@ -466,6 +476,12 @@ void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...) } } } + if(count != table->item_count) { + printf( + "db_foreach : data lost %d of %d item(s) allocated from %s line %d\n", + table->item_count - count,count,table->alloc_file,table->alloc_line + ); + } va_end(ap); } |