pike.git
/
src
/
block_alloc.h
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/block_alloc.h:1:
-
/* $Id: block_alloc.h,v 1.
10
1999/
04
/
08
22
:
27
:
06
hubbe Exp $ */
+
/* $Id: block_alloc.h,v 1.
11
1999/
05
/
02
08:
11
:
30
hubbe Exp $ */
#undef PRE_INIT_BLOCK #undef INIT_BLOCK #undef EXIT_BLOCK #undef BLOCK_ALLOC #undef PTR_HASH_ALLOC #define PRE_INIT_BLOCK(X) #define INIT_BLOCK(X) #define EXIT_BLOCK(X)
pike.git/src/block_alloc.h:40:
for(e=0;e<BSIZE;e++) \ { \ n->x[e].next=PIKE_CONCAT3(free_,DATA,s); \ PRE_INIT_BLOCK( (n->x+e) ); \ PIKE_CONCAT3(free_,DATA,s)=n->x+e; \ } \ } \ \ tmp=PIKE_CONCAT3(free_,DATA,s); \ PIKE_CONCAT3(free_,DATA,s)=tmp->next; \
+
DO_IF_DMALLOC( dmalloc_register(tmp,0, __FILE__, __LINE__); ) \
INIT_BLOCK(tmp); \ return tmp; \ } \ \ void PIKE_CONCAT(really_free_,DATA)(struct DATA *d) \ { \ EXIT_BLOCK(d); \
-
+
DO_IF_DMALLOC( dmalloc_unregister(d, 1); ) \
d->next=PIKE_CONCAT3(free_,DATA,s); \ PRE_INIT_BLOCK(d); \ PIKE_CONCAT3(free_,DATA,s)=d; \ } \ \ void PIKE_CONCAT3(free_all_,DATA,_blocks)(void) \ { \ struct PIKE_CONCAT(DATA,_block) *tmp; \ while((tmp=PIKE_CONCAT(DATA,_blocks))) \ { \ PIKE_CONCAT(DATA,_blocks)=tmp->next; \ free((char *)tmp); \ } \ PIKE_CONCAT(DATA,_blocks)=0; \ PIKE_CONCAT3(free_,DATA,s)=0; \ } \
-
+
\
+
\
+
void PIKE_CONCAT3(count_memory_in_,DATA,s)(INT32 *num_, INT32 *size_) \
+
{ \
+
INT32 num=0, size=0; \
+
struct PIKE_CONCAT(DATA,_block) *tmp; \
+
struct DATA *tmp2; \
+
for(tmp=PIKE_CONCAT(DATA,_blocks);tmp;tmp=tmp->next) \
+
{ \
+
num+=BSIZE; \
+
size+=sizeof(struct PIKE_CONCAT(DATA,_block)); \
+
} \
+
for(tmp2=PIKE_CONCAT3(free_,DATA,s);tmp2;tmp2=tmp2->next) num--; \
+
*num_=num; \
+
*size_=size; \
+
}
#define PTR_HASH_ALLOC(DATA,BSIZE) \ \ BLOCK_ALLOC(DATA,BSIZE) \ \ static struct DATA **PIKE_CONCAT(DATA,_hash_table)=0; \ static int PIKE_CONCAT(DATA,_hash_table_size)=0; \
pike.git/src/block_alloc.h:101:
\ \ struct DATA *PIKE_CONCAT(find_,DATA)(void *ptr) \ { \ int hval=(long)ptr; \ hval%=PIKE_CONCAT(DATA,_hash_table_size); \ return PIKE_CONCAT(really_low_find_,DATA)(ptr, hval); \ } \ \ \
-
\
-
struct DATA *PIKE_CONCAT(make_,DATA)(void *ptr, int hval) \
+
static
void
PIKE_CONCAT(DATA,_rehash)()
\
{ \
-
struct DATA *p; \
-
\
-
DO_IF_DEBUG( if(!PIKE_CONCAT(DATA,_hash_table)) \
-
fatal("Hash table error!\n"); ) \
-
PIKE_CONCAT(num_,DATA)++; \
-
\
-
if(( PIKE_CONCAT(num_,DATA)>>2 ) >= \
-
PIKE_CONCAT(DATA,_hash_table_size)) \
-
{ \
-
/* Time to re-hash */ \
+
/* Time to re-hash */
\
struct DATA **old_hash= PIKE_CONCAT(DATA,_hash_table); \
-
+
struct DATA *p; \
+
int hval; \
int e=PIKE_CONCAT(DATA,_hash_table_size); \ \ PIKE_CONCAT(DATA,_hash_table_size)*=2; \
-
PIKE_CONCAT(DATA,_hash_table_size)++; \
+
PIKE_CONCAT(DATA,_hash_table_size)++;
\
if((PIKE_CONCAT(DATA,_hash_table)=(struct DATA **) \ malloc(PIKE_CONCAT(DATA,_hash_table_size)* \ sizeof(struct DATA *)))) \ { \ MEMSET(PIKE_CONCAT(DATA,_hash_table),0, \ sizeof(struct DATA *)*PIKE_CONCAT(DATA,_hash_table_size)); \
-
while(
e
-- >=0) \
+
while(--
e
>=0)
\
{ \
-
while((p=old_hash[e])) \
-
{
\
-
old_hash[e]=p->next; \
-
hval=(long)(p-> data); \
+
while((p=old_hash[e]))
\
+
{
\
+
old_hash[e]=p->next;
\
+
hval=(long)(p-> data);
\
hval%=PIKE_CONCAT(DATA,_hash_table_size); \ p->next=PIKE_CONCAT(DATA,_hash_table)[hval]; \
-
PIKE_CONCAT(DATA,_hash_table)[hval]=p;
\
-
}
\
+
PIKE_CONCAT(DATA,_hash_table)[hval]=p; \
} \
-
hval=(long)ptr;
\
-
hval%=PIKE_CONCAT(DATA,_hash_table_size);
\
-
free((char *)old_hash); \
+
}
\
+
free((char *)old_hash);
\
}else{ \
-
PIKE_CONCAT(DATA,_hash_table)=old_hash; \
+
PIKE_CONCAT(DATA,_hash_table)=old_hash;
\
PIKE_CONCAT(DATA,_hash_table_size)=e; \ } \
-
+
} \
+
\
+
\
+
struct DATA *PIKE_CONCAT(make_,DATA)(void *ptr, int hval) \
+
{ \
+
struct DATA *p; \
+
\
+
DO_IF_DEBUG( if(!PIKE_CONCAT(DATA,_hash_table)) \
+
fatal("Hash table error!\n"); ) \
+
PIKE_CONCAT(num_,DATA)++; \
+
\
+
if(( PIKE_CONCAT(num_,DATA)>>2 ) >= \
+
PIKE_CONCAT(DATA,_hash_table_size)) \
+
{ \
+
PIKE_CONCAT(DATA,_rehash)(); \
+
hval=(long)ptr; \
+
hval%=PIKE_CONCAT(DATA,_hash_table_size); \
} \ \
-
p=PIKE_CONCAT(alloc_,DATA)(); \
-
p->data=ptr; \
+
p=PIKE_CONCAT(alloc_,DATA)(); \
+
p->data=ptr; \
p->next=PIKE_CONCAT(DATA,_hash_table)[hval]; \ PIKE_CONCAT(DATA,_hash_table)[hval]=p; \ return p; \ } \ \ inline struct DATA *PIKE_CONCAT(get_,DATA)(void *ptr) \ { \ struct DATA *p; \ int hval=(long)ptr; \ hval%=PIKE_CONCAT(DATA,_hash_table_size); \
pike.git/src/block_alloc.h:179:
return 0; \ \ PIKE_CONCAT(make_,DATA)(ptr, hval); \ return 1; \ } \ \ int PIKE_CONCAT(remove_,DATA)(void *ptr) \ { \ struct DATA *p; \ int hval=(long)ptr; \
-
if(!PIKE_CONCAT(DATA,_hash_table)) return 0; \
+
if(!PIKE_CONCAT(DATA,_hash_table)) return 0; \
hval%=PIKE_CONCAT(DATA,_hash_table_size); \ if((p=PIKE_CONCAT(really_low_find_,DATA)(ptr, hval))) \ { \ PIKE_CONCAT(num_,DATA)--; \
-
if(PIKE_CONCAT(DATA,_hash_table)[hval]!=p) fatal("GAOssdf\n"); \
+
if(PIKE_CONCAT(DATA,_hash_table)[hval]!=p) fatal("GAOssdf\n"); \
PIKE_CONCAT(DATA,_hash_table)[hval]=p->next; \ PIKE_CONCAT(really_free_,DATA)(p); \ return 1; \ } \ return 0; \ } \ \ void PIKE_CONCAT3(init_,DATA,_hash)(void) \ { \ extern INT32 hashprimes[32]; \ extern int my_log2(unsigned INT32 x); \ PIKE_CONCAT(DATA,_hash_table_size)=hashprimes[my_log2(BSIZE)]; \ \ PIKE_CONCAT(DATA,_hash_table)=(struct DATA **) \
-
xalloc
(sizeof(struct DATA *)*PIKE_CONCAT(DATA,_hash_table_size)); \
+
malloc
(sizeof(struct DATA *)*PIKE_CONCAT(DATA,_hash_table_size)); \
+
if(!PIKE_CONCAT(DATA,_hash_table)) \
+
{ \
+
fprintf(stderr,"Fatal: out of memory.\n"); \
+
exit(17); \
+
} \
MEMSET(PIKE_CONCAT(DATA,_hash_table),0, \ sizeof(struct DATA *)*PIKE_CONCAT(DATA,_hash_table_size)); \ } \ \ void PIKE_CONCAT3(exit_,DATA,_hash)(void) \ { \ PIKE_CONCAT3(free_all_,DATA,_blocks)(); \ free(PIKE_CONCAT(DATA,_hash_table)); \ PIKE_CONCAT(DATA,_hash_table)=0; \
-
}
\
+
}