pike.git/
src/
block_alloc.h
Branch:
Tag:
Non-build tags
All tags
No tags
2001-03-30
2001-03-30 09:08:36 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>
805f8131d7655bd781384b48b2c48fa1b1b3bdcb (
84
lines) (+
57
/-
27
)
[
Show
|
Annotate
]
Branch:
7.9
optimized RUN_UNLOCKED stuff a couple of percent..
Rev: src/block_alloc.h:1.29
1:
-
/* $Id: block_alloc.h,v 1.
28
2001/03/
28
10
:
02
:
40
hubbe Exp $ */
+
/* $Id: block_alloc.h,v 1.
29
2001/03/
30
09
:
08
:
36
hubbe Exp $ */
#undef PRE_INIT_BLOCK #undef INIT_BLOCK #undef EXIT_BLOCK
17:
#include "threads.h" #endif
-
+
#define BLOCK_ALLOC(DATA,BSIZE) \ \ struct PIKE_CONCAT(DATA,_block) \
30:
static struct DATA *PIKE_CONCAT3(free_,DATA,s)=(struct DATA *)-1; \ DO_IF_RUN_UNLOCKED(static PIKE_MUTEX_T PIKE_CONCAT(DATA,_mutex);) \ \
-
struct DATA *PIKE_
CONCAT
(alloc_,DATA)(void)
\
+
static
struct DATA *PIKE_
CONCAT3
(alloc_,DATA
,_unlocked
)(void) \
{ \ struct DATA *tmp; \
-
DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
+
if(!PIKE_CONCAT3(free_,DATA,s)) \ { \ struct PIKE_CONCAT(DATA,_block) *n; \
60:
PIKE_CONCAT3(free_,DATA,s)=(struct DATA *)tmp->BLOCK_ALLOC_NEXT; \ DO_IF_DMALLOC( dmalloc_register(tmp,sizeof(struct DATA), DMALLOC_LOCATION()); )\ INIT_BLOCK(tmp); \
-
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \
+
return tmp; \ } \ \
-
+
struct DATA *PIKE_CONCAT(alloc_,DATA)(void) \
+
{ \
+
struct DATA *ret; \
+
DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
+
ret=PIKE_CONCAT3(alloc_,DATA,_unlocked)(); \
+
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \
+
return ret; \
+
} \
+
\
+
void PIKE_CONCAT3(really_free_,DATA,_unlocked)(struct DATA *d) \
+
{ \
+
EXIT_BLOCK(d); \
+
DO_IF_DMALLOC( dmalloc_unregister(d, 1); ) \
+
d->BLOCK_ALLOC_NEXT = (void *)PIKE_CONCAT3(free_,DATA,s); \
+
PRE_INIT_BLOCK(d); \
+
PIKE_CONCAT3(free_,DATA,s)=d; \
+
} \
+
\
void PIKE_CONCAT(really_free_,DATA)(struct DATA *d) \ { \ EXIT_BLOCK(d); \
75:
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \ } \ \
-
void PIKE_CONCAT3(free_all_,DATA,_blocks)(void)
\
+
static
void PIKE_CONCAT3(free_all_,DATA,_blocks
_unlocked
)(void) \
{ \ struct PIKE_CONCAT(DATA,_block) *tmp; \
-
DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
+
DO_IF_DMALLOC( \ for(tmp=PIKE_CONCAT(DATA,_blocks);tmp;tmp=tmp->next) \ { \
95:
} \ PIKE_CONCAT(DATA,_blocks)=0; \ PIKE_CONCAT3(free_,DATA,s)=0; \
-
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \
+
} \ \
-
+
void PIKE_CONCAT3(free_all_,DATA,_blocks)(void) \
+
{ \
+
DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
+
PIKE_CONCAT3(free_all_,DATA,_blocks_unlocked)(); \
+
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \
+
} \
\ void PIKE_CONCAT3(count_memory_in_,DATA,s)(INT32 *num_, INT32 *size_) \ { \
122:
\ void PIKE_CONCAT3(init_,DATA,_blocks)(void) \ { \
-
DO_IF_RUN_UNLOCKED(mt_init_recursive(&PIKE_CONCAT(DATA,_mutex))); \
+
/*
DO_IF_RUN_UNLOCKED(mt_init_recursive(&PIKE_CONCAT(DATA,_mutex)));
*/
\
+
DO_IF_RUN_UNLOCKED(mt_init(&PIKE_CONCAT(DATA,_mutex)));
\
PIKE_CONCAT3(free_,DATA,s)=0; \ } \
137:
static ptrdiff_t PIKE_CONCAT(num_,DATA)=0; \ \ inline struct DATA * \
-
PIKE_
CONCAT
(really_low_find_,DATA)(void *ptr, ptrdiff_t hval)
\
+
PIKE_
CONCAT3
(really_low_find_,DATA
,_unlocked
)(void *ptr, ptrdiff_t hval) \
{ \ struct DATA *p,**pp; \
-
DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
+
p=PIKE_CONCAT(DATA,_hash_table)[hval]; \ if(!p || p->data == ptr) \ { \
154:
*pp=p->BLOCK_ALLOC_NEXT; \ p->BLOCK_ALLOC_NEXT=PIKE_CONCAT(DATA,_hash_table)[hval]; \ PIKE_CONCAT(DATA,_hash_table)[hval]=p; \
-
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \
+
return p; \ } \ } \
-
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \
+
return 0; \ } \ \
-
\
+
struct DATA *PIKE_CONCAT(find_,DATA)(void *ptr) \ { \
-
+
struct DATA *p; \
size_t hval = (size_t)ptr; \
-
if(!PIKE_CONCAT(DATA,_hash_table_size)) return 0; \
+
DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
+
if(!PIKE_CONCAT(DATA,_hash_table_size))
{ \
+
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \
+
return 0;
\
+
} \
hval%=PIKE_CONCAT(DATA,_hash_table_size); \
-
return
PIKE_
CONCAT
(really_low_find_,DATA)(ptr, hval); \
+
p=
PIKE_
CONCAT3
(really_low_find_,DATA
,_unlocked
)(ptr, hval);
\
+
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex)));
\
+
return p; \
} \ \
-
\
+
static void PIKE_CONCAT(DATA,_rehash)() \ { \ /* Time to re-hash */ \
210:
} \ \ \
-
struct DATA *PIKE_
CONCAT
(make_,DATA)(void *ptr, ptrdiff_t hval)
\
+
struct DATA *PIKE_
CONCAT3
(make_,DATA
,_unlocked
)(void *ptr, ptrdiff_t hval) \
{ \ struct DATA *p; \ \
-
DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
+
\ DO_IF_DEBUG( if(!PIKE_CONCAT(DATA,_hash_table)) \ fatal("Hash table error!\n"); ) \
228:
hval%=PIKE_CONCAT(DATA,_hash_table_size); \ } \ \
-
p=PIKE_
CONCAT
(alloc_,DATA)();
\
+
p=PIKE_
CONCAT3
(alloc_,DATA
,_unlocked
)(); \
p->data=ptr; \ p->BLOCK_ALLOC_NEXT=PIKE_CONCAT(DATA,_hash_table)[hval]; \ PIKE_CONCAT(DATA,_hash_table)[hval]=p; \
-
+
return p; \
+
} \
+
\
+
struct DATA *PIKE_CONCAT(make_,DATA)(void *ptr, ptrdiff_t hval) \
+
{ \
+
struct DATA *p; \
+
DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
+
p=PIKE_CONCAT3(make_,DATA,_unlocked)(ptr,hval); \
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \ return p; \ } \
242:
ptrdiff_t hval=(ptrdiff_t)ptr; \ DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \ hval%=PIKE_CONCAT(DATA,_hash_table_size); \
-
if(!(p=PIKE_
CONCAT
(really_low_find_,DATA)(ptr, hval)))
\
-
p=PIKE_
CONCAT
(make_,DATA)(ptr, hval);
\
+
if(!(p=PIKE_
CONCAT3
(really_low_find_,DATA
,_unlocked
)(ptr, hval))) \
+
p=PIKE_
CONCAT3
(make_,DATA
,_unlocked
)(ptr, hval); \
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \ return p; \ } \
254:
ptrdiff_t hval=(ptrdiff_t)ptr; \ DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \ hval%=PIKE_CONCAT(DATA,_hash_table_size); \
-
if((p=PIKE_
CONCAT
(really_low_find_,DATA)(ptr, hval)))
\
+
if((p=PIKE_
CONCAT3
(really_low_find_,DATA
,_unlocked
)(ptr, hval))) \
{ \ DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \ return 0; \ } \ \
-
PIKE_
CONCAT
(make_,DATA)(ptr, hval);
\
+
PIKE_
CONCAT3
(make_,DATA
,_unlocked
)(ptr, hval); \
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \ return 1; \ } \
276:
return 0; \ } \ hval%=PIKE_CONCAT(DATA,_hash_table_size); \
-
if((p=PIKE_
CONCAT
(really_low_find_,DATA)(ptr, hval)))
\
+
if((p=PIKE_
CONCAT3
(really_low_find_,DATA
,_unlocked
)(ptr, hval))) \
{ \ PIKE_CONCAT(num_,DATA)--; \ if(PIKE_CONCAT(DATA,_hash_table)[hval]!=p) fatal("GAOssdf\n"); \ PIKE_CONCAT(DATA,_hash_table)[hval]=p->BLOCK_ALLOC_NEXT; \
-
PIKE_
CONCAT
(really_free_,DATA)(p);
\
+
PIKE_
CONCAT3
(really_free_,DATA
,_unlocked
)(p); \
DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \ return 1; \ } \
312:
void PIKE_CONCAT3(exit_,DATA,_hash)(void) \ { \ DO_IF_RUN_UNLOCKED(mt_lock(&PIKE_CONCAT(DATA,_mutex))); \
-
PIKE_CONCAT3(free_all_,DATA,_blocks)();
\
+
PIKE_CONCAT3(free_all_,DATA,_blocks
_unlocked
)(); \
free(PIKE_CONCAT(DATA,_hash_table)); \ PIKE_CONCAT(DATA,_hash_table)=0; \ PIKE_CONCAT(num_,DATA)=0; \ DO_IF_RUN_UNLOCKED(mt_unlock(&PIKE_CONCAT(DATA,_mutex))); \ }