e576bb | 2002-10-11 | Martin Nilsson | |
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | | #undef INIT_BLOCK
#undef EXIT_BLOCK
#undef BLOCK_ALLOC
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | #undef LOW_PTR_HASH_ALLOC
#undef PTR_HASH_ALLOC_FIXED
|
fc2c83 | 1999-04-01 | Fredrik Hübinette (Hubbe) | | #undef PTR_HASH_ALLOC
|
7d63aa | 2001-11-08 | Fredrik Hübinette (Hubbe) | | #undef BLOCK_ALLOC_HSIZE_SHIFT
|
db1aac | 2002-11-24 | Martin Stjernholm | | #undef BLOCK_ALLOC_FILL_PAGES
#undef PTR_HASH_ALLOC_FILL_PAGES
#undef PTR_HASH_ALLOC_FIXED_FILL_PAGES
|
421801 | 1999-01-31 | Fredrik Hübinette (Hubbe) | |
|
21ed0e | 1998-02-19 | Fredrik Hübinette (Hubbe) | | #define INIT_BLOCK(X)
#define EXIT_BLOCK(X)
|
7d63aa | 2001-11-08 | Fredrik Hübinette (Hubbe) | | #define BLOCK_ALLOC_HSIZE_SHIFT 2
|
c47322 | 2003-02-24 | Henrik Grubbström (Grubba) | | #ifndef PIKE_HASH_T
|
322f89 | 2003-03-16 | Henrik Grubbström (Grubba) | | #define PIKE_HASH_T size_t
|
c47322 | 2003-02-24 | Henrik Grubbström (Grubba) | | #endif /* !PIKE_HASH_T */
|
b076ce | 2001-08-31 | Fredrik Hübinette (Hubbe) | | #define BA_STATIC
|
0f5ac1 | 2001-09-02 | Henrik Grubbström (Grubba) | | #define BA_INLINE
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | |
|
db1aac | 2002-11-24 | Martin Stjernholm | |
#define PTR_HASH_ALLOC_FILL_PAGES(DATA, PAGES) \
PTR_HASH_ALLOC(DATA, \
((PIKE_MALLOC_PAGE_SIZE * (PAGES)) \
- PIKE_MALLOC_OVERHEAD - BLOCK_HEADER_SIZE) / \
sizeof (struct DATA))
#define PTR_HASH_ALLOC_FIXED_FILL_PAGES(DATA, PAGES) \
PTR_HASH_ALLOC_FIXED(DATA, \
((PIKE_MALLOC_PAGE_SIZE * (PAGES)) \
- PIKE_MALLOC_OVERHEAD - BLOCK_HEADER_SIZE) / \
sizeof (struct DATA))
#ifndef BLOCK_HEADER_SIZE
|
46ff8a | 2008-08-26 | Henrik Grubbström (Grubba) | | #define BLOCK_HEADER_SIZE (3 * sizeof (void *) + sizeof (INT32) \
DO_IF_DMALLOC( + sizeof(INT32)))
|
db1aac | 2002-11-24 | Martin Stjernholm | | #endif
|
99b5ff | 2002-11-24 | Martin Stjernholm | |
|
117770 | 2013-10-09 | Arne Goedeke | | #ifndef PTR_HASH_HASHFUN_DEFINED
#define PTR_HASH_HASHFUN_DEFINED
static INLINE PIKE_HASH_T ptr_hashfun(void * ptr) {
PIKE_HASH_T q = (size_t)((char*)ptr - (char*)0);
q ^= (q >> 20) ^ (q >> 12);
return q ^ (q >> 7) ^ (q >> 4);
|
63150e | 2005-04-08 | Henrik Grubbström (Grubba) | | }
|
fc2c83 | 1999-04-01 | Fredrik Hübinette (Hubbe) | |
|
117770 | 2013-10-09 | Arne Goedeke | | static INLINE size_t ptr_hash_find_hashsize(size_t size) {
if (size & (size-1)) {
size |= size >> 1;
size |= size >> 2;
size |= size >> 4;
size |= size >> 8;
size |= size >> 16;
|
6ddd9d | 2014-11-05 | Martin Nilsson | | #if SIZEOF_INT_TYPE > 4
|
117770 | 2013-10-09 | Arne Goedeke | | size |= size >> 32;
|
6ddd9d | 2014-11-05 | Martin Nilsson | | #endif
|
117770 | 2013-10-09 | Arne Goedeke | | size++;
}
return size;
}
#endif
|
1b3f67 | 2013-10-09 | Arne Goedeke | | #include "block_allocator.h"
|
fc2c83 | 1999-04-01 | Fredrik Hübinette (Hubbe) | |
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | #define LOW_PTR_HASH_ALLOC(DATA,BSIZE) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | \
|
1b3f67 | 2013-10-09 | Arne Goedeke | | static struct block_allocator PIKE_CONCAT(DATA,_allocator) = \
BA_INIT(sizeof(struct DATA), BSIZE); \
\
struct DATA *PIKE_CONCAT(alloc_,DATA)(void) { \
struct DATA * ptr = (struct DATA *)ba_alloc(&PIKE_CONCAT(DATA,_allocator));\
INIT_BLOCK(ptr); \
return ptr; \
} \
\
void PIKE_CONCAT(really_free_,DATA)(struct DATA *d) { \
EXIT_BLOCK(d); \
ba_free(&PIKE_CONCAT(DATA,_allocator), d); \
} \
\
void PIKE_CONCAT3(count_memory_in_,DATA,s)(size_t *num_, size_t *size_) { \
ba_count_all(&PIKE_CONCAT(DATA,_allocator), num_, size_); \
} \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | \
|
3f8432 | 2000-04-23 | Martin Stjernholm | | struct DATA **PIKE_CONCAT(DATA,_hash_table)=0; \
|
59e011 | 2001-07-03 | Fredrik Hübinette (Hubbe) | | size_t PIKE_CONCAT(DATA,_hash_table_size)=0; \
|
b0a236 | 2002-12-01 | Martin Stjernholm | | static size_t PIKE_CONCAT(num_,DATA)=0; \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | \
|
557f74 | 2014-05-23 | Per Hedbor | | static struct DATA * \
|
c47322 | 2003-02-24 | Henrik Grubbström (Grubba) | | PIKE_CONCAT3(really_low_find_,DATA,_unlocked)(void *ptr, \
PIKE_HASH_T hval) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | { \
|
d47659 | 2013-06-12 | Arne Goedeke | | struct DATA *p; \
|
ec6b78 | 2000-03-21 | Fredrik Hübinette (Hubbe) | | p=PIKE_CONCAT(DATA,_hash_table)[hval]; \
|
db1aac | 2002-11-24 | Martin Stjernholm | | if(!p || p->PTR_HASH_ALLOC_DATA == ptr) \
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | { \
return p; \
} \
|
d47659 | 2013-06-12 | Arne Goedeke | | while((p=p->BLOCK_ALLOC_NEXT)) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | { \
|
db1aac | 2002-11-24 | Martin Stjernholm | | if(p->PTR_HASH_ALLOC_DATA==ptr) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | { \
return p; \
} \
} \
return 0; \
} \
\
struct DATA *PIKE_CONCAT(find_,DATA)(void *ptr) \
{ \
|
805f81 | 2001-03-30 | Fredrik Hübinette (Hubbe) | | struct DATA *p; \
|
117770 | 2013-10-09 | Arne Goedeke | | PIKE_HASH_T hval = ptr_hashfun(ptr); \
|
949ecb | 2006-03-10 | Martin Stjernholm | | if(!PIKE_CONCAT(DATA,_hash_table)) { \
|
805f81 | 2001-03-30 | Fredrik Hübinette (Hubbe) | | return 0; \
} \
|
117770 | 2013-10-09 | Arne Goedeke | | hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1; \
|
805f81 | 2001-03-30 | Fredrik Hübinette (Hubbe) | | p=PIKE_CONCAT3(really_low_find_,DATA,_unlocked)(ptr, hval); \
return p; \
|
c2b244 | 2003-03-16 | Henrik Grubbström (Grubba) | | } \
\
|
d77bd5 | 2002-12-01 | Martin Stjernholm | | struct DATA *PIKE_CONCAT(make_,DATA)(void *ptr) \
|
805f81 | 2001-03-30 | Fredrik Hübinette (Hubbe) | | { \
struct DATA *p; \
|
117770 | 2013-10-09 | Arne Goedeke | | PIKE_HASH_T hval = ptr_hashfun(ptr); \
hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1; \
|
805f81 | 2001-03-30 | Fredrik Hübinette (Hubbe) | | p=PIKE_CONCAT3(make_,DATA,_unlocked)(ptr,hval); \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | return p; \
} \
\
|
f3378f | 2000-05-16 | Fredrik Hübinette (Hubbe) | | struct DATA *PIKE_CONCAT(get_,DATA)(void *ptr) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | { \
struct DATA *p; \
|
117770 | 2013-10-09 | Arne Goedeke | | PIKE_HASH_T hval = ptr_hashfun(ptr); \
hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1; \
|
805f81 | 2001-03-30 | Fredrik Hübinette (Hubbe) | | if(!(p=PIKE_CONCAT3(really_low_find_,DATA,_unlocked)(ptr, hval))) \
p=PIKE_CONCAT3(make_,DATA,_unlocked)(ptr, hval); \
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | return p; \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | } \
\
|
e921e7 | 2008-01-24 | Henrik Grubbström (Grubba) | | int PIKE_CONCAT3(check_,DATA,_semaphore)(void *ptr) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | { \
|
117770 | 2013-10-09 | Arne Goedeke | | PIKE_HASH_T hval = ptr_hashfun(ptr); \
hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1; \
|
e921e7 | 2008-01-24 | Henrik Grubbström (Grubba) | | if(PIKE_CONCAT3(really_low_find_,DATA,_unlocked)(ptr, hval)) \
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | { \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | return 0; \
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | } \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | \
|
805f81 | 2001-03-30 | Fredrik Hübinette (Hubbe) | | PIKE_CONCAT3(make_,DATA,_unlocked)(ptr, hval); \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | return 1; \
} \
\
|
e13e71 | 2002-12-01 | Martin Stjernholm | | void PIKE_CONCAT(move_,DATA)(struct DATA *block, void *new_ptr) \
{ \
|
d47659 | 2013-06-12 | Arne Goedeke | | struct DATA **pp, *p; \
|
117770 | 2013-10-09 | Arne Goedeke | | PIKE_HASH_T hval = ptr_hashfun(block->PTR_HASH_ALLOC_DATA); \
hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1; \
|
d47659 | 2013-06-12 | Arne Goedeke | | pp=PIKE_CONCAT(DATA,_hash_table) + hval; \
while((p = *pp)) \
{ \
if(p == block) \
{ \
*pp = p->BLOCK_ALLOC_NEXT; \
break; \
} \
pp = &p->BLOCK_ALLOC_NEXT; \
} \
if (!p) Pike_fatal("The block to move wasn't found.\n"); \
|
e13e71 | 2002-12-01 | Martin Stjernholm | | block->PTR_HASH_ALLOC_DATA = new_ptr; \
|
117770 | 2013-10-09 | Arne Goedeke | | hval = ptr_hashfun(new_ptr) & \
((PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1); \
|
e13e71 | 2002-12-01 | Martin Stjernholm | | block->BLOCK_ALLOC_NEXT = PIKE_CONCAT(DATA,_hash_table)[hval]; \
PIKE_CONCAT(DATA,_hash_table)[hval] = block; \
} \
\
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | int PIKE_CONCAT(remove_,DATA)(void *ptr) \
{ \
|
d47659 | 2013-06-12 | Arne Goedeke | | struct DATA **pp, *p; \
|
117770 | 2013-10-09 | Arne Goedeke | | PIKE_HASH_T hval = ptr_hashfun(ptr); \
|
aad99b | 2001-03-28 | Fredrik Hübinette (Hubbe) | | if(!PIKE_CONCAT(DATA,_hash_table)) \
{ \
return 0; \
} \
|
117770 | 2013-10-09 | Arne Goedeke | | hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1; \
|
d47659 | 2013-06-12 | Arne Goedeke | | pp=PIKE_CONCAT(DATA,_hash_table) + hval; \
while((p = *pp)) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | { \
|
d47659 | 2013-06-12 | Arne Goedeke | | if(p->PTR_HASH_ALLOC_DATA==ptr) \
{ \
*pp = p->BLOCK_ALLOC_NEXT; \
PIKE_CONCAT(num_,DATA)--; \
|
557f74 | 2014-05-23 | Per Hedbor | | PIKE_CONCAT(really_free_,DATA)(p); \
|
d47659 | 2013-06-12 | Arne Goedeke | | return 1; \
} \
pp = &p->BLOCK_ALLOC_NEXT; \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | } \
return 0; \
} \
\
|
557f74 | 2014-05-23 | Per Hedbor | | static void PIKE_CONCAT3(low_init_,DATA,_hash)(size_t size) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | { \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | PIKE_CONCAT(DATA,_hash_table_size)= \
|
117770 | 2013-10-09 | Arne Goedeke | | ptr_hash_find_hashsize(size); \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | \
PIKE_CONCAT(DATA,_hash_table)=(struct DATA **) \
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); \
} \
|
21b12a | 2014-09-03 | Martin Nilsson | | memset(PIKE_CONCAT(DATA,_hash_table),0, \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | sizeof(struct DATA *)*PIKE_CONCAT(DATA,_hash_table_size)); \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | } \
\
\
|
1d4cf1 | 2014-08-22 | Arne Goedeke | | static void __attribute((unused)) PIKE_CONCAT3(init_,DATA,_hash)(void) \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | { \
PIKE_CONCAT3(low_init_,DATA,_hash)(BSIZE); \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | } \
\
|
557f74 | 2014-05-23 | Per Hedbor | | static void PIKE_CONCAT3(exit_,DATA,_hash)(void) \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | { \
|
1b3f67 | 2013-10-09 | Arne Goedeke | | ba_free_all(& PIKE_CONCAT(DATA,_allocator)); \
|
011ad3 | 1999-10-22 | Fredrik Hübinette (Hubbe) | | free(PIKE_CONCAT(DATA,_hash_table)); \
PIKE_CONCAT(DATA,_hash_table)=0; \
|
7bcb1d | 1999-12-19 | Fredrik Hübinette (Hubbe) | | PIKE_CONCAT(num_,DATA)=0; \
|
424d9c | 1999-05-02 | Fredrik Hübinette (Hubbe) | | }
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | |
#define PTR_HASH_ALLOC_FIXED(DATA,BSIZE) \
|
557f74 | 2014-05-23 | Per Hedbor | | static struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, PIKE_HASH_T hval);\
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | LOW_PTR_HASH_ALLOC(DATA,BSIZE) \
\
|
557f74 | 2014-05-23 | Per Hedbor | | static struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, PIKE_HASH_T hval) \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | { \
struct DATA *p; \
\
DO_IF_DEBUG( if(!PIKE_CONCAT(DATA,_hash_table)) \
|
b0a236 | 2002-12-01 | Martin Stjernholm | | Pike_fatal("Hash table error!\n"); ) \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | PIKE_CONCAT(num_,DATA)++; \
\
|
557f74 | 2014-05-23 | Per Hedbor | | p=PIKE_CONCAT(alloc_,DATA)(); \
|
db1aac | 2002-11-24 | Martin Stjernholm | | p->PTR_HASH_ALLOC_DATA=ptr; \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | p->BLOCK_ALLOC_NEXT=PIKE_CONCAT(DATA,_hash_table)[hval]; \
PIKE_CONCAT(DATA,_hash_table)[hval]=p; \
return p; \
|
63150e | 2005-04-08 | Henrik Grubbström (Grubba) | | }
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | |
#define PTR_HASH_ALLOC(DATA,BSIZE) \
|
557f74 | 2014-05-23 | Per Hedbor | | static struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, \
|
bee763 | 2003-02-24 | Henrik Grubbström (Grubba) | | PIKE_HASH_T hval); \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | LOW_PTR_HASH_ALLOC(DATA,BSIZE) \
\
|
0ca86e | 2005-04-09 | Henrik Grubbström (Grubba) | | static void PIKE_CONCAT(DATA,_rehash)(void) \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | { \
/* Time to re-hash */ \
struct DATA **old_hash; \
struct DATA *p; \
|
c47322 | 2003-02-24 | Henrik Grubbström (Grubba) | | PIKE_HASH_T hval; \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | size_t e; \
\
old_hash= PIKE_CONCAT(DATA,_hash_table); \
e=PIKE_CONCAT(DATA,_hash_table_size); \
\
|
117770 | 2013-10-09 | Arne Goedeke | | PIKE_CONCAT(DATA,_hash_table_size) *= 2; \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | if((PIKE_CONCAT(DATA,_hash_table)=(struct DATA **) \
malloc(PIKE_CONCAT(DATA,_hash_table_size)* \
sizeof(struct DATA *)))) \
{ \
|
21b12a | 2014-09-03 | Martin Nilsson | | memset(PIKE_CONCAT(DATA,_hash_table),0, \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | sizeof(struct DATA *)*PIKE_CONCAT(DATA,_hash_table_size)); \
while(e-- > 0) \
{ \
while((p=old_hash[e])) \
{ \
old_hash[e]=p->BLOCK_ALLOC_NEXT; \
|
117770 | 2013-10-09 | Arne Goedeke | | hval = ptr_hashfun(p->PTR_HASH_ALLOC_DATA); \
hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1; \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | p->BLOCK_ALLOC_NEXT=PIKE_CONCAT(DATA,_hash_table)[hval]; \
PIKE_CONCAT(DATA,_hash_table)[hval]=p; \
} \
} \
free((char *)old_hash); \
}else{ \
PIKE_CONCAT(DATA,_hash_table)=old_hash; \
PIKE_CONCAT(DATA,_hash_table_size)=e; \
} \
} \
\
|
557f74 | 2014-05-23 | Per Hedbor | | static struct DATA *PIKE_CONCAT3(make_,DATA,_unlocked)(void *ptr, \
|
c47322 | 2003-02-24 | Henrik Grubbström (Grubba) | | PIKE_HASH_T hval) \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | { \
struct DATA *p; \
\
DO_IF_DEBUG( if(!PIKE_CONCAT(DATA,_hash_table)) \
|
b0a236 | 2002-12-01 | Martin Stjernholm | | Pike_fatal("Hash table error!\n"); ) \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | PIKE_CONCAT(num_,DATA)++; \
\
|
7d63aa | 2001-11-08 | Fredrik Hübinette (Hubbe) | | if(( PIKE_CONCAT(num_,DATA)>>BLOCK_ALLOC_HSIZE_SHIFT ) >= \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | PIKE_CONCAT(DATA,_hash_table_size)) \
{ \
PIKE_CONCAT(DATA,_rehash)(); \
|
117770 | 2013-10-09 | Arne Goedeke | | hval = ptr_hashfun(ptr); \
hval &= (PIKE_HASH_T)PIKE_CONCAT(DATA,_hash_table_size) - 1; \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | } \
\
|
557f74 | 2014-05-23 | Per Hedbor | | p=PIKE_CONCAT(alloc_,DATA)(); \
|
db1aac | 2002-11-24 | Martin Stjernholm | | p->PTR_HASH_ALLOC_DATA=ptr; \
|
afbc72 | 2001-09-06 | Fredrik Hübinette (Hubbe) | | p->BLOCK_ALLOC_NEXT=PIKE_CONCAT(DATA,_hash_table)[hval]; \
PIKE_CONCAT(DATA,_hash_table)[hval]=p; \
return p; \
|
1f5f6a | 2001-09-08 | Henrik Grubbström (Grubba) | | }
|