adptation of the memory allocator based on pages to work with threads
This commit is contained in:
@@ -40,348 +40,443 @@ extern int Yap_page_size;
|
||||
#define ADJUST_SIZE_TO_PAGE(SIZE) ((SIZE) - (SIZE) % Yap_page_size + Yap_page_size)
|
||||
#define PAGE_HEADER(STR) (pg_hd_ptr)((unsigned long int)STR - (unsigned long int)STR % Yap_page_size)
|
||||
#define STRUCT_NEXT(STR) ((STR)->next)
|
||||
|
||||
#define UPDATE_STATS(STAT, VALUE) STAT += VALUE
|
||||
|
||||
#ifdef YAPOR
|
||||
#define LOCK_PAGE_ENTRY(PG_ENT) LOCK(PgEnt_lock(PG_ENT))
|
||||
#define UNLOCK_PAGE_ENTRY(PG_ENT) UNLOCK(PgEnt_lock(PG_ENT))
|
||||
#else
|
||||
#define LOCK_PAGE_ENTRY(PG_ENT)
|
||||
#define UNLOCK_PAGE_ENTRY(PG_ENT)
|
||||
#endif
|
||||
|
||||
#ifdef USE_SYSTEM_MALLOC
|
||||
/**************************************************************************************
|
||||
** USE_SYSTEM_MALLOC **
|
||||
**************************************************************************************/
|
||||
#define ALLOC_BLOCK(STR, SIZE, STR_TYPE) \
|
||||
if ((STR = (STR_TYPE *) malloc(SIZE)) == NULL) \
|
||||
/*******************************************************************************************
|
||||
** USE_SYSTEM_MALLOC **
|
||||
*******************************************************************************************/
|
||||
#define ALLOC_BLOCK(STR, SIZE, STR_TYPE) \
|
||||
if ((STR = (STR_TYPE *) malloc(SIZE)) == NULL) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "ALLOC_BLOCK: malloc error")
|
||||
#define FREE_BLOCK(STR) \
|
||||
#define FREE_BLOCK(STR) \
|
||||
free(STR)
|
||||
#else
|
||||
/**************************************************************************************
|
||||
** ! USE_SYSTEM_MALLOC **
|
||||
**************************************************************************************/
|
||||
#define ALLOC_BLOCK(STR, SIZE, STR_TYPE) \
|
||||
{ char *block_ptr; \
|
||||
if ((block_ptr = Yap_AllocCodeSpace(SIZE + sizeof(CELL))) != NULL) \
|
||||
*block_ptr = 'y'; \
|
||||
else if ((block_ptr = (char *) malloc(SIZE + sizeof(CELL))) != NULL) \
|
||||
*block_ptr = 'm'; \
|
||||
else \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "ALLOC_BLOCK: malloc error"); \
|
||||
block_ptr += sizeof(CELL); \
|
||||
STR = (STR_TYPE *) block_ptr; \
|
||||
/*******************************************************************************************
|
||||
** ! USE_SYSTEM_MALLOC **
|
||||
*******************************************************************************************/
|
||||
#define ALLOC_BLOCK(STR, SIZE, STR_TYPE) \
|
||||
{ char *block_ptr; \
|
||||
if ((block_ptr = Yap_AllocCodeSpace(SIZE + sizeof(CELL))) != NULL) \
|
||||
*block_ptr = 'y'; \
|
||||
else if ((block_ptr = (char *) malloc(SIZE + sizeof(CELL))) != NULL) \
|
||||
*block_ptr = 'm'; \
|
||||
else \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "ALLOC_BLOCK: malloc error"); \
|
||||
block_ptr += sizeof(CELL); \
|
||||
STR = (STR_TYPE *) block_ptr; \
|
||||
}
|
||||
#define FREE_BLOCK(STR) \
|
||||
{ char *block_ptr = (char *)(STR) - sizeof(CELL); \
|
||||
if (block_ptr[0] == 'y') \
|
||||
Yap_FreeCodeSpace(block_ptr); \
|
||||
else \
|
||||
free(block_ptr); \
|
||||
#define FREE_BLOCK(STR) \
|
||||
{ char *block_ptr = (char *)(STR) - sizeof(CELL); \
|
||||
if (block_ptr[0] == 'y') \
|
||||
Yap_FreeCodeSpace(block_ptr); \
|
||||
else \
|
||||
free(block_ptr); \
|
||||
}
|
||||
#endif /******************************************************************************/
|
||||
#define INIT_BUCKETS(BUCKET_PTR, NUM_BUCKETS) \
|
||||
{ int i; void **init_bucket_ptr; \
|
||||
init_bucket_ptr = (void **) BUCKET_PTR; \
|
||||
for (i = NUM_BUCKETS; i != 0; i--) \
|
||||
*init_bucket_ptr++ = NULL; \
|
||||
#endif /***********************************************************************************/
|
||||
|
||||
#define INIT_BUCKETS(BUCKET_PTR, NUM_BUCKETS) \
|
||||
{ int i; void **init_bucket_ptr; \
|
||||
init_bucket_ptr = (void **) BUCKET_PTR; \
|
||||
for (i = NUM_BUCKETS; i != 0; i--) \
|
||||
*init_bucket_ptr++ = NULL; \
|
||||
}
|
||||
#define ALLOC_BUCKETS(BUCKET_PTR, NUM_BUCKETS) \
|
||||
{ void **alloc_bucket_ptr; \
|
||||
ALLOC_BLOCK(alloc_bucket_ptr, NUM_BUCKETS * sizeof(void *), void *); \
|
||||
INIT_BUCKETS(alloc_bucket_ptr, NUM_BUCKETS); \
|
||||
BUCKET_PTR = (void *) alloc_bucket_ptr; \
|
||||
#define ALLOC_BUCKETS(BUCKET_PTR, NUM_BUCKETS) \
|
||||
{ void **alloc_bucket_ptr; \
|
||||
ALLOC_BLOCK(alloc_bucket_ptr, NUM_BUCKETS * sizeof(void *), void *); \
|
||||
INIT_BUCKETS(alloc_bucket_ptr, NUM_BUCKETS); \
|
||||
BUCKET_PTR = (void *) alloc_bucket_ptr; \
|
||||
}
|
||||
#define FREE_BUCKETS(BUCKET_PTR) FREE_BLOCK(BUCKET_PTR)
|
||||
|
||||
|
||||
|
||||
#ifndef USE_PAGES_MALLOC
|
||||
/**************************************************************************************
|
||||
** ! USE_PAGES_MALLOC **
|
||||
**************************************************************************************/
|
||||
#define ALLOC_STRUCT(STR, STR_TYPE, STR_PAGES, VOID_PAGES) \
|
||||
LOCK(Pg_lock(STR_PAGES)); \
|
||||
UPDATE_STATS(Pg_str_in_use(STR_PAGES), 1); \
|
||||
UNLOCK(Pg_lock(STR_PAGES)); \
|
||||
/*******************************************************************************************
|
||||
** ! USE_PAGES_MALLOC **
|
||||
*******************************************************************************************/
|
||||
#define GET_FREE_STRUCT(STR, STR_TYPE, PG_ENT, EXTRA_PG_ENT) \
|
||||
LOCK_PAGE_ENTRY(PG_ENT); \
|
||||
UPDATE_STATS(PgEnt_strs_in_use(PG_ENT), 1); \
|
||||
UNLOCK_PAGE_ENTRY(PG_ENT); \
|
||||
ALLOC_BLOCK(STR, sizeof(STR_TYPE), STR_TYPE)
|
||||
#define LOCAL_NEXT_ALLOC_STRUCT(STR, LOCAL_STR, STR_TYPE, STR_PAGES, VOID_PAGES) \
|
||||
ALLOC_STRUCT(STR, STR_TYPE, STR_PAGES, VOID_PAGES)
|
||||
#define FREE_STRUCT(STR, STR_TYPE, STR_PAGES, VOID_PAGES) \
|
||||
LOCK(Pg_lock(STR_PAGES)); \
|
||||
UPDATE_STATS(Pg_str_in_use(STR_PAGES), -1); \
|
||||
UNLOCK(Pg_lock(STR_PAGES)); \
|
||||
#define GET_NEXT_FREE_STRUCT(LOCAL_STR, STR, STR_TYPE, PG_ENT) \
|
||||
GET_FREE_STRUCT(STR, STR_TYPE, PG_ENT, ___NOT_USED___)
|
||||
#define PUT_FREE_STRUCT(STR, STR_TYPE, PG_ENT) \
|
||||
LOCK_PAGE_ENTRY(PG_ENT); \
|
||||
UPDATE_STATS(PgEnt_strs_in_use(PG_ENT), -1); \
|
||||
UNLOCK_PAGE_ENTRY(PG_ENT); \
|
||||
FREE_BLOCK(STR)
|
||||
#else
|
||||
/**************************************************************************************
|
||||
** USE_PAGES_MALLOC && ! LIMIT_TABLING **
|
||||
**************************************************************************************/
|
||||
#ifndef LIMIT_TABLING
|
||||
#define ALLOC_STRUCT_TEST_PAGE if
|
||||
#define ALLOC_STRUCT_RECOVER_SPACE(PG_HD, STR_PAGES, VOID_PAGES)
|
||||
/*******************************************************************************************
|
||||
** USE_PAGES_MALLOC **
|
||||
*******************************************************************************************/
|
||||
#define MOVE_PAGES(FROM_PG_ENT, TO_PG_ENT) \
|
||||
if (PgEnt_first(TO_PG_ENT)) { \
|
||||
PgHd_next(PgEnt_last(TO_PG_ENT)) = PgEnt_first(FROM_PG_ENT); \
|
||||
PgHd_previous(PgEnt_first(FROM_PG_ENT)) = PgEnt_last(TO_PG_ENT); \
|
||||
} else \
|
||||
PgEnt_first(TO_PG_ENT) = PgEnt_first(FROM_PG_ENT); \
|
||||
PgEnt_last(TO_PG_ENT) = PgEnt_last(FROM_PG_ENT); \
|
||||
UPDATE_STATS(PgEnt_pages_in_use(TO_PG_ENT), PgEnt_pages_in_use(FROM_PG_ENT)); \
|
||||
UPDATE_STATS(PgEnt_strs_in_use(TO_PG_ENT), PgEnt_strs_in_use(FROM_PG_ENT)); \
|
||||
PgEnt_first(FROM_PG_ENT) = PgEnt_last(FROM_PG_ENT) = NULL; \
|
||||
PgEnt_pages_in_use(FROM_PG_ENT) = PgEnt_strs_in_use(FROM_PG_ENT) = 0
|
||||
|
||||
#define DETACH_PAGES(_PG_ENT) \
|
||||
if (PgEnt_first(LOCAL##_PG_ENT)) { \
|
||||
LOCK(PgEnt_lock(GLOBAL##_PG_ENT)); \
|
||||
MOVE_PAGES(LOCAL##_PG_ENT, GLOBAL##_PG_ENT); \
|
||||
UNLOCK(PgEnt_lock(GLOBAL##_PG_ENT)); \
|
||||
}
|
||||
|
||||
#define ATTACH_PAGES(_PG_ENT) \
|
||||
if (PgEnt_first(GLOBAL##_PG_ENT)) { \
|
||||
MOVE_PAGES(GLOBAL##_PG_ENT, LOCAL##_PG_ENT); \
|
||||
}
|
||||
|
||||
#define GET_PAGE_FIRST_LEVEL(PG_HD) GET_ALLOC_PAGE(PG_HD)
|
||||
#define GET_ALLOC_PAGE_NEXT_LEVEL(PG_HD) GET_VOID_PAGE(PG_HD)
|
||||
#define GET_VOID_PAGE_NEXT_LEVEL(PG_HD)
|
||||
/*******************************************************************************************
|
||||
#define GET_PAGE_FIRST_LEVEL(PG_HD) GET_VOID_PAGE(PG_HD)
|
||||
#define GET_VOID_PAGE_NEXT_LEVEL(PG_HD) GET_ALLOC_PAGE(PG_HD)
|
||||
#define GET_ALLOC_PAGE_NEXT_LEVEL(PG_HD)
|
||||
*******************************************************************************************/
|
||||
|
||||
#define GET_ALLOC_PAGE(PG_HD) \
|
||||
LOCK(PgEnt_lock(GLOBAL_pages_alloc)); \
|
||||
if ((PG_HD = PgEnt_first(GLOBAL_pages_alloc)) == NULL) { \
|
||||
UNLOCK(PgEnt_lock(GLOBAL_pages_alloc)); \
|
||||
GET_ALLOC_PAGE_NEXT_LEVEL(PG_HD); \
|
||||
} else { \
|
||||
PgEnt_first(GLOBAL_pages_alloc) = (pg_hd_ptr)(((void *)PG_HD) + Yap_page_size); \
|
||||
if (PgEnt_first(GLOBAL_pages_alloc) == PgEnt_last(GLOBAL_pages_alloc)) \
|
||||
PgEnt_first(GLOBAL_pages_alloc) = NULL; \
|
||||
UNLOCK(PgEnt_lock(GLOBAL_pages_alloc)); \
|
||||
}
|
||||
|
||||
#define GET_VOID_PAGE(PG_HD) \
|
||||
LOCK(PgEnt_lock(GLOBAL_pages_void)); \
|
||||
if ((PG_HD = PgEnt_first(GLOBAL_pages_void)) == NULL) { \
|
||||
UNLOCK(PgEnt_lock(GLOBAL_pages_void)); \
|
||||
GET_VOID_PAGE_NEXT_LEVEL(PG_HD); \
|
||||
} else { \
|
||||
if ((PgEnt_first(GLOBAL_pages_void) = PgHd_next(PG_HD)) == NULL) \
|
||||
PgEnt_last(GLOBAL_pages_void) = NULL; \
|
||||
UNLOCK(PgEnt_lock(GLOBAL_pages_void)); \
|
||||
}
|
||||
|
||||
#define PUT_PAGE(PG_HD, PG_ENT) \
|
||||
if ((PgHd_next(PG_HD) = PgEnt_first(PG_ENT)) == NULL) \
|
||||
PgEnt_last(PG_ENT) = PG_HD; \
|
||||
else \
|
||||
PgHd_previous(PgHd_next(PG_HD)) = PG_HD; \
|
||||
PgEnt_first(PG_ENT) = PG_HD; \
|
||||
UPDATE_STATS(PgEnt_pages_in_use(PG_ENT), 1)
|
||||
|
||||
#define PUT_VOID_PAGE(PG_HD, PG_ENT) \
|
||||
if ((PgHd_next(PG_HD) = PgEnt_first(PG_ENT)) == NULL) \
|
||||
PgEnt_last(PG_ENT) = PG_HD; \
|
||||
PgEnt_first(PG_ENT) = PG_HD
|
||||
|
||||
#ifdef THREADS
|
||||
#define GET_FREE_PAGE(PG_HD) \
|
||||
if ((PG_HD = PgEnt_first(LOCAL_pages_void)) == NULL) { \
|
||||
GET_PAGE_FIRST_LEVEL(PG_HD); \
|
||||
} else { \
|
||||
if ((PgEnt_first(LOCAL_pages_void) = PgHd_next(PG_HD)) == NULL) \
|
||||
PgEnt_last(LOCAL_pages_void) = NULL; \
|
||||
}
|
||||
#define PUT_FREE_PAGE(PG_HD) \
|
||||
PUT_VOID_PAGE(PG_HD, LOCAL_pages_void)
|
||||
#else
|
||||
/**************************************************************************************
|
||||
** USE_PAGES_MALLOC && LIMIT_TABLING **
|
||||
**************************************************************************************/
|
||||
#define ALLOC_STRUCT_TEST_PAGE while
|
||||
#define ALLOC_STRUCT_RECOVER_SPACE(PG_HD, STR_PAGES, VOID_PAGES) \
|
||||
if (Pg_free_pg(VOID_PAGES) == NULL && \
|
||||
GLOBAL_max_pages == Pg_pg_alloc(VOID_PAGES)) { \
|
||||
sg_fr_ptr sg_fr = GLOBAL_check_sg_fr; \
|
||||
UNLOCK(Pg_lock(VOID_PAGES)); \
|
||||
do { \
|
||||
if (sg_fr) \
|
||||
sg_fr = SgFr_next(sg_fr); \
|
||||
else \
|
||||
sg_fr = GLOBAL_first_sg_fr; \
|
||||
if (sg_fr == NULL) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "no space left (RECOVER_SPACE)"); \
|
||||
/* see function 'InteractSIGINT' in file 'sysbits.c' */ \
|
||||
/* Yap_Error(PURE_ABORT, TermNil, ""); */ \
|
||||
/* restore_absmi_regs(&Yap_standard_regs); */ \
|
||||
/* siglongjmp (LOCAL_RestartEnv, 1); */ \
|
||||
if (SgFr_first_answer(sg_fr) && \
|
||||
SgFr_first_answer(sg_fr) != SgFr_answer_trie(sg_fr)) { \
|
||||
SgFr_state(sg_fr) = ready; \
|
||||
free_answer_hash_chain(SgFr_hash_chain(sg_fr)); \
|
||||
SgFr_hash_chain(sg_fr) = NULL; \
|
||||
SgFr_first_answer(sg_fr) = NULL; \
|
||||
SgFr_last_answer(sg_fr) = NULL; \
|
||||
free_answer_trie(TrNode_child(SgFr_answer_trie(sg_fr)), \
|
||||
TRAVERSE_MODE_NORMAL, TRAVERSE_POSITION_FIRST); \
|
||||
TrNode_child(SgFr_answer_trie(sg_fr)) = NULL; \
|
||||
} \
|
||||
} while (Pg_free_pg(VOID_PAGES) == Pg_free_pg(STR_PAGES)); \
|
||||
GLOBAL_check_sg_fr = sg_fr; \
|
||||
LOCK(Pg_lock(STR_PAGES)); \
|
||||
PG_HD = Pg_free_pg(STR_PAGES); \
|
||||
} else
|
||||
#define GET_FREE_PAGE(PG_HD) \
|
||||
GET_PAGE_FIRST_LEVEL(PG_HD)
|
||||
#define PUT_FREE_PAGE(PG_HD) \
|
||||
PUT_VOID_PAGE(PG_HD, GLOBAL_pages_void)
|
||||
#endif
|
||||
/**************************************************************************************
|
||||
** USE_PAGES_MALLOC **
|
||||
**************************************************************************************/
|
||||
#define ALLOC_VOID_PAGES(PG_HD, VOID_PAGES) \
|
||||
{ int i, shmid; \
|
||||
pg_hd_ptr aux_pg_hd; \
|
||||
if ((shmid = shmget(IPC_PRIVATE, SHMMAX, SHM_R|SHM_W)) == -1) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "shmget error (ALLOC_VOID_PAGES)"); \
|
||||
if ((PG_HD = (pg_hd_ptr) shmat(shmid, NULL, 0)) == (void *) -1) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "shmat error (ALLOC_VOID_PAGES)"); \
|
||||
if (shmctl(shmid, IPC_RMID, 0) != 0) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "shmctl error (ALLOC_VOID_PAGES)"); \
|
||||
aux_pg_hd = (pg_hd_ptr)(((void *)PG_HD) + Yap_page_size); \
|
||||
Pg_free_pg(VOID_PAGES) = aux_pg_hd; \
|
||||
for (i = 2; i < SHMMAX / Yap_page_size; i++) { \
|
||||
PgHd_next(aux_pg_hd) = (pg_hd_ptr)(((void *)aux_pg_hd) + Yap_page_size); \
|
||||
aux_pg_hd = PgHd_next(aux_pg_hd); \
|
||||
} \
|
||||
PgHd_next(aux_pg_hd) = NULL; \
|
||||
UPDATE_STATS(Pg_pg_alloc(VOID_PAGES), SHMMAX / Yap_page_size); \
|
||||
UPDATE_STATS(Pg_str_in_use(VOID_PAGES), 1); \
|
||||
|
||||
#define INIT_PAGE(PG_HD, STR_TYPE, PG_ENT) \
|
||||
PgHd_strs_in_use(PG_HD) = 0; \
|
||||
PgHd_previous(PG_HD) = NULL; \
|
||||
PgHd_next(PG_HD) = NULL; \
|
||||
PgHd_first_str(PG_HD) = NULL; \
|
||||
PgHd_alloc_area(PG_HD) = (void *) (PG_HD + 1); \
|
||||
PgHd_alloc_area(PG_HD) += sizeof(STR_TYPE) * PgEnt_strs_per_page(PG_ENT)
|
||||
|
||||
/*******************************************************************************************
|
||||
#define OLD_INIT_PAGE(PG_HD, STR_TYPE, PG_ENT) \
|
||||
{ int i; \
|
||||
STR_TYPE *aux_str; \
|
||||
PgHd_strs_in_use(PG_HD) = 0; \
|
||||
PgHd_previous(PG_HD) = NULL; \
|
||||
PgHd_next(PG_HD) = NULL; \
|
||||
PgHd_alloc_area(PG_HD) = NULL; \
|
||||
PgHd_first_str(PG_HD) = (void *) (PG_HD + 1); \
|
||||
aux_str = (STR_TYPE *) PgHd_first_str(PG_HD); \
|
||||
for (i = 1; i < PgEnt_strs_per_page(PG_ENT); i++) { \
|
||||
STRUCT_NEXT(aux_str) = aux_str + 1; \
|
||||
aux_str++; \
|
||||
} \
|
||||
STRUCT_NEXT(aux_str) = NULL; \
|
||||
}
|
||||
*******************************************************************************************/
|
||||
|
||||
#define ALLOC_SPACE() \
|
||||
LOCK(PgEnt_lock(GLOBAL_pages_alloc)); \
|
||||
if (PgEnt_first(GLOBAL_pages_alloc) == NULL) { \
|
||||
int shmid; \
|
||||
void *mem_block; \
|
||||
if ((shmid = shmget(IPC_PRIVATE, SHMMAX, SHM_R|SHM_W)) == -1) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "shmget error (ALLOC_PAGE)"); \
|
||||
if ((mem_block = shmat(shmid, NULL, 0)) == (void *) -1) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "shmat error (ALLOC_PAGE)"); \
|
||||
if (shmctl(shmid, IPC_RMID, 0) != 0) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "shmctl error (ALLOC_PAGE)"); \
|
||||
PgEnt_first(GLOBAL_pages_alloc) = (pg_hd_ptr)(mem_block + Yap_page_size); \
|
||||
PgEnt_last(GLOBAL_pages_alloc) = (pg_hd_ptr)(mem_block + SHMMAX); \
|
||||
UPDATE_STATS(PgEnt_pages_in_use(GLOBAL_pages_alloc), SHMMAX / Yap_page_size); \
|
||||
} \
|
||||
UNLOCK(PgEnt_lock(GLOBAL_pages_alloc))
|
||||
|
||||
#ifdef LIMIT_TABLING
|
||||
#define RECOVER_ALLOC_SPACE(PG_ENT, EXTRA_PG_ENT) \
|
||||
if (GLOBAL_max_pages == PgEnt_pages_in_use(GLOBAL_pages_alloc)) { \
|
||||
sg_fr_ptr sg_fr = GLOBAL_check_sg_fr; \
|
||||
do { \
|
||||
if (sg_fr) \
|
||||
sg_fr = SgFr_next(sg_fr); \
|
||||
else \
|
||||
sg_fr = GLOBAL_first_sg_fr; \
|
||||
if (sg_fr == NULL) \
|
||||
Yap_Error(FATAL_ERROR, TermNil, "no space left (RECOVER_SPACE)"); \
|
||||
/* see function 'InteractSIGINT' in file 'sysbits.c' */ \
|
||||
/* Yap_Error(PURE_ABORT, TermNil, ""); */ \
|
||||
/* restore_absmi_regs(&Yap_standard_regs); */ \
|
||||
/* siglongjmp (LOCAL_RestartEnv, 1); */ \
|
||||
if (SgFr_first_answer(sg_fr) && \
|
||||
SgFr_first_answer(sg_fr) != SgFr_answer_trie(sg_fr)) { \
|
||||
SgFr_state(sg_fr) = ready; \
|
||||
free_answer_hash_chain(SgFr_hash_chain(sg_fr)); \
|
||||
SgFr_hash_chain(sg_fr) = NULL; \
|
||||
SgFr_first_answer(sg_fr) = NULL; \
|
||||
SgFr_last_answer(sg_fr) = NULL; \
|
||||
free_answer_trie(TrNode_child(SgFr_answer_trie(sg_fr)), \
|
||||
TRAVERSE_MODE_NORMAL, TRAVERSE_POSITION_FIRST); \
|
||||
TrNode_child(SgFr_answer_trie(sg_fr)) = NULL; \
|
||||
} \
|
||||
} while (PgEnt_first(GLOBAL_pages_void) == PgEnt_first(PG_ENT)); \
|
||||
GLOBAL_check_sg_fr = sg_fr; \
|
||||
} else { \
|
||||
ALLOC_SPACE(); \
|
||||
}
|
||||
#elif THREADS
|
||||
#define RECOVER_ALLOC_SPACE(PG_ENT, EXTRA_PG_ENT) \
|
||||
LOCK(PgEnt_lock(EXTRA_PG_ENT)); \
|
||||
if (PgEnt_first(EXTRA_PG_ENT)) { \
|
||||
MOVE_PAGES(EXTRA_PG_ENT, PG_ENT); \
|
||||
UNLOCK(PgEnt_lock(EXTRA_PG_ENT)); \
|
||||
} else { \
|
||||
UNLOCK(PgEnt_lock(EXTRA_PG_ENT)); \
|
||||
ALLOC_SPACE(); \
|
||||
}
|
||||
#else
|
||||
#define RECOVER_ALLOC_SPACE(PG_ENT, EXTRA_PG_ENT) \
|
||||
ALLOC_SPACE()
|
||||
#endif
|
||||
|
||||
#define TEST_GET_FREE_PAGE(PG_HD, STR_TYPE, PG_ENT, EXTRA_PG_ENT) \
|
||||
while (PG_HD == NULL) { \
|
||||
UNLOCK_PAGE_ENTRY(PG_ENT); \
|
||||
GET_FREE_PAGE(PG_HD); \
|
||||
if (PG_HD) { \
|
||||
INIT_PAGE(PG_HD, STR_TYPE, PG_ENT); \
|
||||
LOCK_PAGE_ENTRY(PG_ENT); \
|
||||
PUT_PAGE(PG_HD, PG_ENT); \
|
||||
} else { \
|
||||
RECOVER_ALLOC_SPACE(PG_ENT, EXTRA_PG_ENT); \
|
||||
LOCK_PAGE_ENTRY(PG_ENT); \
|
||||
PG_HD = PgEnt_first(PG_ENT); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define INIT_PAGE(PG_HD, STR_TYPE, STR_PAGES) \
|
||||
{ int i; \
|
||||
STR_TYPE *aux_str; \
|
||||
PgHd_str_in_use(PG_HD) = 0; \
|
||||
PgHd_previous(PG_HD) = NULL; \
|
||||
PgHd_next(PG_HD) = NULL; \
|
||||
PgHd_free_str(PG_HD) = (void *) (PG_HD + 1); \
|
||||
aux_str = (STR_TYPE *) PgHd_free_str(PG_HD); \
|
||||
for (i = 1; i < Pg_str_per_pg(STR_PAGES); i++) { \
|
||||
STRUCT_NEXT(aux_str) = aux_str + 1; \
|
||||
aux_str++; \
|
||||
} \
|
||||
STRUCT_NEXT(aux_str) = NULL; \
|
||||
}
|
||||
|
||||
#define ALLOC_STRUCT_TEST_ALLOC_PAGE(PG_HD, STR_TYPE, STR_PAGES, VOID_PAGES) \
|
||||
ALLOC_STRUCT_TEST_PAGE (PG_HD == NULL) { /* if / while */ \
|
||||
UNLOCK(Pg_lock(STR_PAGES)); \
|
||||
LOCK(Pg_lock(VOID_PAGES)); \
|
||||
/* if (...) { ... */ \
|
||||
ALLOC_STRUCT_RECOVER_SPACE(PG_HD, STR_PAGES, VOID_PAGES) \
|
||||
/* } else */ \
|
||||
{ \
|
||||
PG_HD = Pg_free_pg(VOID_PAGES); \
|
||||
if (PG_HD == NULL) { \
|
||||
ALLOC_VOID_PAGES(PG_HD, VOID_PAGES); \
|
||||
} else { \
|
||||
Pg_free_pg(VOID_PAGES) = PgHd_next(PG_HD); \
|
||||
UPDATE_STATS(Pg_str_in_use(VOID_PAGES), 1); \
|
||||
} \
|
||||
UNLOCK(Pg_lock(VOID_PAGES)); \
|
||||
INIT_PAGE(PG_HD, STR_TYPE, STR_PAGES); \
|
||||
LOCK(Pg_lock(STR_PAGES)); \
|
||||
if ((PgHd_next(PG_HD) = Pg_free_pg(STR_PAGES)) != NULL) \
|
||||
PgHd_previous(PgHd_next(PG_HD)) = PG_HD; \
|
||||
Pg_free_pg(STR_PAGES) = PG_HD; \
|
||||
UPDATE_STATS(Pg_pg_alloc(STR_PAGES), 1); \
|
||||
} \
|
||||
}
|
||||
|
||||
#define ALLOC_STRUCT(STR, STR_TYPE, STR_PAGES, VOID_PAGES) \
|
||||
{ pg_hd_ptr pg_hd; \
|
||||
LOCK(Pg_lock(STR_PAGES)); \
|
||||
pg_hd = Pg_free_pg(STR_PAGES); \
|
||||
ALLOC_STRUCT_TEST_ALLOC_PAGE(pg_hd, STR_TYPE, STR_PAGES, VOID_PAGES); \
|
||||
STR = (STR_TYPE *) PgHd_free_str(pg_hd); \
|
||||
if ((PgHd_free_str(pg_hd) = (void *) STRUCT_NEXT(STR)) == NULL) \
|
||||
if ((Pg_free_pg(STR_PAGES) = PgHd_next(pg_hd)) != NULL) \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = NULL; \
|
||||
UPDATE_STATS(PgHd_str_in_use(pg_hd), 1); \
|
||||
UPDATE_STATS(Pg_str_in_use(STR_PAGES), 1); \
|
||||
UNLOCK(Pg_lock(STR_PAGES)); \
|
||||
#define GET_FREE_STRUCT(STR, STR_TYPE, PG_ENT, EXTRA_PG_ENT) \
|
||||
{ pg_hd_ptr pg_hd; \
|
||||
LOCK_PAGE_ENTRY(PG_ENT); \
|
||||
pg_hd = PgEnt_first(PG_ENT); \
|
||||
TEST_GET_FREE_PAGE(pg_hd, STR_TYPE, PG_ENT, EXTRA_PG_ENT); \
|
||||
if (PgHd_alloc_area(pg_hd)) { \
|
||||
STR = ((STR_TYPE *) PgHd_alloc_area(pg_hd)) - 1; \
|
||||
if (STR == (STR_TYPE *) (pg_hd + 1)) \
|
||||
PgHd_alloc_area(pg_hd) = NULL; \
|
||||
else \
|
||||
PgHd_alloc_area(pg_hd) = (void *) STR; \
|
||||
} else { \
|
||||
STR = (STR_TYPE *) PgHd_first_str(pg_hd); \
|
||||
PgHd_first_str(pg_hd) = (void *) STRUCT_NEXT(STR); \
|
||||
} \
|
||||
if (PgHd_alloc_area(pg_hd) == NULL && PgHd_first_str(pg_hd) == NULL) { \
|
||||
if ((PgEnt_first(PG_ENT) = PgHd_next(pg_hd)) == NULL) \
|
||||
PgEnt_last(PG_ENT) = NULL; \
|
||||
else \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = NULL; \
|
||||
} \
|
||||
UPDATE_STATS(PgHd_strs_in_use(pg_hd), 1); \
|
||||
UPDATE_STATS(PgEnt_strs_in_use(PG_ENT), 1); \
|
||||
UNLOCK_PAGE_ENTRY(PG_ENT); \
|
||||
}
|
||||
|
||||
#define LOCAL_NEXT_ALLOC_STRUCT(STR, LOCAL_STR, STR_TYPE, STR_PAGES, VOID_PAGES) \
|
||||
STR = LOCAL_STR; \
|
||||
if (STR == NULL) { \
|
||||
pg_hd_ptr pg_hd; \
|
||||
LOCK(Pg_lock(STR_PAGES)); \
|
||||
pg_hd = Pg_free_pg(STR_PAGES); \
|
||||
ALLOC_STRUCT_TEST_ALLOC_PAGE(pg_hd, STR_TYPE, STR_PAGES, VOID_PAGES); \
|
||||
if ((Pg_free_pg(STR_PAGES) = PgHd_next(pg_hd)) != NULL) \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = NULL; \
|
||||
UPDATE_STATS(Pg_str_in_use(STR_PAGES), -PgHd_str_in_use(pg_hd)); \
|
||||
UPDATE_STATS(Pg_str_in_use(STR_PAGES), Pg_str_per_pg(STR_PAGES)); \
|
||||
UNLOCK(Pg_lock(STR_PAGES)); \
|
||||
STR = (STR_TYPE *) PgHd_free_str(pg_hd); \
|
||||
PgHd_free_str(pg_hd) = NULL; \
|
||||
PgHd_str_in_use(pg_hd) = Pg_str_per_pg(STR_PAGES); \
|
||||
} \
|
||||
/*******************************************************************************************
|
||||
#define OLD_GET_FREE_STRUCT(STR, STR_TYPE, PG_ENT, EXTRA_PG_ENT) \
|
||||
{ pg_hd_ptr pg_hd; \
|
||||
LOCK_PAGE_ENTRY(PG_ENT); \
|
||||
pg_hd = PgEnt_first(PG_ENT); \
|
||||
TEST_GET_FREE_PAGE(pg_hd, STR_TYPE, PG_ENT, EXTRA_PG_ENT); \
|
||||
STR = (STR_TYPE *) PgHd_first_str(pg_hd); \
|
||||
if ((PgHd_first_str(pg_hd) = (void *) STRUCT_NEXT(STR)) == NULL) { \
|
||||
if ((PgEnt_first(PG_ENT) = PgHd_next(pg_hd)) == NULL) \
|
||||
PgEnt_last(PG_ENT) = NULL; \
|
||||
else \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = NULL; \
|
||||
} \
|
||||
UPDATE_STATS(PgHd_strs_in_use(pg_hd), 1); \
|
||||
UPDATE_STATS(PgEnt_strs_in_use(PG_ENT), 1); \
|
||||
UNLOCK_PAGE_ENTRY(PG_ENT); \
|
||||
}
|
||||
*******************************************************************************************/
|
||||
|
||||
#define GET_NEXT_FREE_STRUCT(LOCAL_STR, STR, STR_TYPE, PG_ENT) \
|
||||
STR = LOCAL_STR; \
|
||||
if (STR == NULL) { \
|
||||
pg_hd_ptr pg_hd; \
|
||||
LOCK_PAGE_ENTRY(PG_ENT); \
|
||||
pg_hd = PgEnt_first(PG_ENT); \
|
||||
TEST_GET_FREE_PAGE(pg_hd, STR_TYPE, PG_ENT, ___NOT_USED___); \
|
||||
STR = (STR_TYPE *) PgHd_first_str(pg_hd); \
|
||||
PgHd_first_str(pg_hd) = NULL; \
|
||||
PgHd_strs_in_use(pg_hd) = PgEnt_strs_per_page(PG_ENT); \
|
||||
if ((PgEnt_first(PG_ENT) = PgHd_next(pg_hd)) == NULL) \
|
||||
PgEnt_last(PG_ENT) = NULL; \
|
||||
else \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = NULL; \
|
||||
UPDATE_STATS(PgEnt_strs_in_use(PG_ENT), -PgHd_strs_in_use(pg_hd)); \
|
||||
UPDATE_STATS(PgEnt_strs_in_use(PG_ENT), PgEnt_strs_per_page(PG_ENT)); \
|
||||
UNLOCK_PAGE_ENTRY(PG_ENT); \
|
||||
} \
|
||||
LOCAL_STR = STRUCT_NEXT(STR)
|
||||
|
||||
#define FREE_PAGE(PG_HD, VOID_PAGES) \
|
||||
LOCK(Pg_lock(VOID_PAGES)); \
|
||||
PgHd_next(PG_HD) = Pg_free_pg(VOID_PAGES); \
|
||||
Pg_free_pg(VOID_PAGES) = PG_HD; \
|
||||
UPDATE_STATS(Pg_str_in_use(VOID_PAGES), -1); \
|
||||
UNLOCK(Pg_lock(VOID_PAGES))
|
||||
|
||||
#define FREE_STRUCT(STR, STR_TYPE, STR_PAGES, VOID_PAGES) \
|
||||
{ pg_hd_ptr pg_hd; \
|
||||
pg_hd = PAGE_HEADER(STR); \
|
||||
LOCK(Pg_lock(STR_PAGES)); \
|
||||
UPDATE_STATS(Pg_str_in_use(STR_PAGES), -1); \
|
||||
if (--PgHd_str_in_use(pg_hd) == 0) { \
|
||||
UPDATE_STATS(Pg_pg_alloc(STR_PAGES), -1); \
|
||||
if (PgHd_previous(pg_hd)) { \
|
||||
if ((PgHd_next(PgHd_previous(pg_hd)) = PgHd_next(pg_hd)) != NULL) \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = PgHd_previous(pg_hd); \
|
||||
} else { \
|
||||
if ((Pg_free_pg(STR_PAGES) = PgHd_next(pg_hd)) != NULL) \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = NULL; \
|
||||
} \
|
||||
UNLOCK(Pg_lock(STR_PAGES)); \
|
||||
FREE_PAGE(pg_hd, VOID_PAGES); \
|
||||
} else { \
|
||||
if ((STRUCT_NEXT(STR) = (STR_TYPE *) PgHd_free_str(pg_hd)) == NULL) { \
|
||||
PgHd_previous(pg_hd) = NULL; \
|
||||
if ((PgHd_next(pg_hd) = Pg_free_pg(STR_PAGES)) != NULL) \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = pg_hd; \
|
||||
Pg_free_pg(STR_PAGES) = pg_hd; \
|
||||
} \
|
||||
PgHd_free_str(pg_hd) = (void *) STR; \
|
||||
UNLOCK(Pg_lock(STR_PAGES)); \
|
||||
} \
|
||||
#define PUT_FREE_STRUCT(STR, STR_TYPE, PG_ENT) \
|
||||
{ pg_hd_ptr pg_hd; \
|
||||
pg_hd = PAGE_HEADER(STR); \
|
||||
LOCK_PAGE_ENTRY(PG_ENT); \
|
||||
UPDATE_STATS(PgEnt_strs_in_use(PG_ENT), -1); \
|
||||
if (--PgHd_strs_in_use(pg_hd) == 0) { \
|
||||
UPDATE_STATS(PgEnt_pages_in_use(PG_ENT), -1); \
|
||||
if (PgHd_previous(pg_hd)) { \
|
||||
if ((PgHd_next(PgHd_previous(pg_hd)) = PgHd_next(pg_hd)) == NULL) \
|
||||
PgEnt_last(PG_ENT) = PgHd_previous(pg_hd); \
|
||||
else \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = PgHd_previous(pg_hd); \
|
||||
} else { \
|
||||
if ((PgEnt_first(PG_ENT) = PgHd_next(pg_hd)) == NULL) \
|
||||
PgEnt_last(PG_ENT) = NULL; \
|
||||
else \
|
||||
PgHd_previous(PgHd_next(pg_hd)) = NULL; \
|
||||
} \
|
||||
UNLOCK_PAGE_ENTRY(PG_ENT); \
|
||||
LOCK_PAGE_ENTRY(GLOBAL_pages_void); \
|
||||
PUT_FREE_PAGE(pg_hd); \
|
||||
UNLOCK_PAGE_ENTRY(GLOBAL_pages_void); \
|
||||
} else { \
|
||||
STRUCT_NEXT(STR) = (STR_TYPE *) PgHd_first_str(pg_hd); \
|
||||
if (PgHd_alloc_area(pg_hd) == NULL && PgHd_first_str(pg_hd) == NULL) { \
|
||||
PgHd_next(pg_hd) = NULL; \
|
||||
if ((PgHd_previous(pg_hd) = PgEnt_last(PG_ENT)) != NULL) \
|
||||
PgHd_next(PgHd_previous(pg_hd)) = pg_hd; \
|
||||
PgEnt_last(PG_ENT) = pg_hd; \
|
||||
} \
|
||||
PgHd_first_str(pg_hd) = (void *) STR; \
|
||||
UNLOCK_PAGE_ENTRY(PG_ENT); \
|
||||
} \
|
||||
}
|
||||
#endif /******************************************************************************/
|
||||
#endif /***********************************************************************************/
|
||||
|
||||
|
||||
#define ALLOC_TABLE_ENTRY(STR) ALLOC_STRUCT(STR, struct table_entry, GLOBAL_pages_tab_ent, GLOBAL_pages_void)
|
||||
#define FREE_TABLE_ENTRY(STR) FREE_STRUCT(STR, struct table_entry, GLOBAL_pages_tab_ent, GLOBAL_pages_void)
|
||||
|
||||
#define ALLOC_SUBGOAL_ENTRY(STR) ALLOC_STRUCT(STR, struct subgoal_entry, GLOBAL_pages_sg_ent, GLOBAL_pages_void)
|
||||
#define FREE_SUBGOAL_ENTRY(STR) FREE_STRUCT(STR, struct subgoal_entry, GLOBAL_pages_sg_ent, GLOBAL_pages_void)
|
||||
|
||||
#if !defined(THREADS_NO_SHARING) && !defined(THREADS_SUBGOAL_SHARING) && !defined(THREADS_FULL_SHARING) && !defined(THREADS_CONSUMER_SHARING)
|
||||
#define ALLOC_SUBGOAL_FRAME(STR) ALLOC_STRUCT(STR, struct subgoal_frame, GLOBAL_pages_sg_fr, GLOBAL_pages_void)
|
||||
#define FREE_SUBGOAL_FRAME(STR) FREE_STRUCT(STR, struct subgoal_frame, GLOBAL_pages_sg_fr, GLOBAL_pages_void)
|
||||
#ifdef THREADS
|
||||
#define ALLOC_STRUCT(STR, STR_TYPE, _PG_ENT) \
|
||||
GET_FREE_STRUCT(STR, STR_TYPE, LOCAL##_PG_ENT, GLOBAL##_PG_ENT)
|
||||
#define FREE_STRUCT(STR, STR_TYPE, _PG_ENT) \
|
||||
PUT_FREE_STRUCT(STR, STR_TYPE, LOCAL##_PG_ENT)
|
||||
#else
|
||||
#define ALLOC_SUBGOAL_FRAME(STR) ALLOC_STRUCT(STR, struct subgoal_frame, LOCAL_pages_sg_fr, LOCAL_pages_void)
|
||||
#define FREE_SUBGOAL_FRAME(STR) FREE_STRUCT(STR, struct subgoal_frame, LOCAL_pages_sg_fr, LOCAL_pages_void)
|
||||
#define ALLOC_STRUCT(STR, STR_TYPE, _PG_ENT) \
|
||||
GET_FREE_STRUCT(STR, STR_TYPE, GLOBAL##_PG_ENT, ___NOT_USED___)
|
||||
#define FREE_STRUCT(STR, STR_TYPE, _PG_ENT) \
|
||||
PUT_FREE_STRUCT(STR, STR_TYPE, GLOBAL##_PG_ENT)
|
||||
#endif
|
||||
#define ALLOC_NEXT_STRUCT(LOCAL_STR, STR, STR_TYPE, _PG_ENT) \
|
||||
GET_NEXT_FREE_STRUCT(LOCAL_STR, STR, STR_TYPE, GLOBAL##_PG_ENT)
|
||||
|
||||
#if !defined(THREADS_NO_SHARING) && !defined(THREADS_SUBGOAL_SHARING) && !defined(THREADS_FULL_SHARING) && !defined(THREADS_CONSUMER_SHARING)
|
||||
#define ALLOC_DEPENDENCY_FRAME(STR) ALLOC_STRUCT(STR, struct dependency_frame, GLOBAL_pages_dep_fr, GLOBAL_pages_void)
|
||||
#define FREE_DEPENDENCY_FRAME(STR) FREE_STRUCT(STR, struct dependency_frame, GLOBAL_pages_dep_fr, GLOBAL_pages_void)
|
||||
#define ALLOC_TABLE_ENTRY(STR) ALLOC_STRUCT(STR, struct table_entry, _pages_tab_ent)
|
||||
#define FREE_TABLE_ENTRY(STR) FREE_STRUCT(STR, struct table_entry, _pages_tab_ent)
|
||||
|
||||
#define ALLOC_SUBGOAL_ENTRY(STR) ALLOC_STRUCT(STR, struct subgoal_entry, _pages_sg_ent)
|
||||
#define FREE_SUBGOAL_ENTRY(STR) FREE_STRUCT(STR, struct subgoal_entry, _pages_sg_ent)
|
||||
|
||||
#define ALLOC_SUBGOAL_FRAME(STR) ALLOC_STRUCT(STR, struct subgoal_frame, _pages_sg_fr)
|
||||
#define FREE_SUBGOAL_FRAME(STR) FREE_STRUCT(STR, struct subgoal_frame, _pages_sg_fr)
|
||||
|
||||
#define ALLOC_DEPENDENCY_FRAME(STR) ALLOC_STRUCT(STR, struct dependency_frame, _pages_dep_fr)
|
||||
#define FREE_DEPENDENCY_FRAME(STR) FREE_STRUCT(STR, struct dependency_frame, _pages_dep_fr)
|
||||
|
||||
#define ALLOC_SUBGOAL_TRIE_NODE(STR) ALLOC_STRUCT(STR, struct subgoal_trie_node, _pages_sg_node)
|
||||
#define FREE_SUBGOAL_TRIE_NODE(STR) FREE_STRUCT(STR, struct subgoal_trie_node, _pages_sg_node)
|
||||
|
||||
#define ALLOC_SUBGOAL_TRIE_HASH(STR) ALLOC_STRUCT(STR, struct subgoal_trie_hash, _pages_sg_hash)
|
||||
#define FREE_SUBGOAL_TRIE_HASH(STR) FREE_STRUCT(STR, struct subgoal_trie_hash, _pages_sg_hash)
|
||||
|
||||
#ifdef YAPOR
|
||||
#define ALLOC_ANSWER_TRIE_NODE(STR) ALLOC_NEXT_STRUCT(LOCAL_next_free_ans_node, STR, struct answer_trie_node, _pages_ans_node)
|
||||
#else
|
||||
#define ALLOC_DEPENDENCY_FRAME(STR) ALLOC_STRUCT(STR, struct dependency_frame, LOCAL_pages_dep_fr, LOCAL_pages_void)
|
||||
#define FREE_DEPENDENCY_FRAME(STR) FREE_STRUCT(STR, struct dependency_frame, LOCAL_pages_dep_fr, LOCAL_pages_void)
|
||||
#define ALLOC_ANSWER_TRIE_NODE(STR) ALLOC_STRUCT(STR, struct answer_trie_node, _pages_ans_node)
|
||||
#endif
|
||||
#define FREE_ANSWER_TRIE_NODE(STR) FREE_STRUCT(STR, struct answer_trie_node, _pages_ans_node)
|
||||
|
||||
#if !defined(THREADS_NO_SHARING)
|
||||
#if defined(THREADS_SUBGOAL_SHARING) || defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
|
||||
#define ALLOC_SUBGOAL_TRIE_NODE(STR) LOCAL_NEXT_ALLOC_STRUCT(STR, LOCAL_next_free_sg_node, struct subgoal_trie_node, GLOBAL_pages_sg_node, GLOBAL_pages_void)
|
||||
#else
|
||||
#define ALLOC_SUBGOAL_TRIE_NODE(STR) ALLOC_STRUCT(STR, struct subgoal_trie_node, GLOBAL_pages_sg_node, GLOBAL_pages_void)
|
||||
#endif
|
||||
#define FREE_SUBGOAL_TRIE_NODE(STR) FREE_STRUCT(STR, struct subgoal_trie_node, GLOBAL_pages_sg_node, GLOBAL_pages_void)
|
||||
#else
|
||||
#define ALLOC_SUBGOAL_TRIE_NODE(STR) ALLOC_STRUCT(STR, struct subgoal_trie_node, LOCAL_pages_sg_node, LOCAL_pages_void)
|
||||
#define FREE_SUBGOAL_TRIE_NODE(STR) FREE_STRUCT(STR, struct subgoal_trie_node, LOCAL_pages_sg_node, LOCAL_pages_void)
|
||||
#endif
|
||||
#define ALLOC_ANSWER_TRIE_HASH(STR) ALLOC_STRUCT(STR, struct answer_trie_hash, _pages_ans_hash)
|
||||
#define FREE_ANSWER_TRIE_HASH(STR) FREE_STRUCT(STR, struct answer_trie_hash, _pages_ans_hash)
|
||||
|
||||
#if !defined(THREADS_NO_SHARING)
|
||||
#if defined(THREADS_SUBGOAL_SHARING) || defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
|
||||
#define ALLOC_SUBGOAL_TRIE_HASH(STR) LOCAL_NEXT_ALLOC_STRUCT(STR, LOCAL_next_free_sg_hash, struct subgoal_trie_hash, GLOBAL_pages_sg_hash, GLOBAL_pages_void)
|
||||
#else
|
||||
#define ALLOC_SUBGOAL_TRIE_HASH(STR) ALLOC_STRUCT(STR, struct subgoal_trie_hash, GLOBAL_pages_sg_hash, GLOBAL_pages_void)
|
||||
#endif
|
||||
#define FREE_SUBGOAL_TRIE_HASH(STR) FREE_STRUCT(STR, struct subgoal_trie_hash, GLOBAL_pages_sg_hash, GLOBAL_pages_void)
|
||||
#else
|
||||
#define ALLOC_SUBGOAL_TRIE_HASH(STR) ALLOC_STRUCT(STR, struct subgoal_trie_hash, LOCAL_pages_sg_hash, LOCAL_pages_void)
|
||||
#define FREE_SUBGOAL_TRIE_HASH(STR) FREE_STRUCT(STR, struct subgoal_trie_hash, LOCAL_pages_sg_hash, LOCAL_pages_void)
|
||||
#endif
|
||||
#define ALLOC_ANSWER_REF_NODE(STR) ALLOC_STRUCT(STR, struct answer_ref_node, _pages_ans_ref_node)
|
||||
#define FREE_ANSWER_REF_NODE(STR) FREE_STRUCT(STR, struct answer_ref_node, _pages_ans_ref_node)
|
||||
|
||||
#if !defined(THREADS_NO_SHARING) && !defined(THREADS_SUBGOAL_SHARING)
|
||||
#if defined(YAPOR) || defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
|
||||
#define ALLOC_ANSWER_TRIE_NODE(STR) LOCAL_NEXT_ALLOC_STRUCT(STR, LOCAL_next_free_ans_node, struct answer_trie_node, GLOBAL_pages_ans_node, GLOBAL_pages_void)
|
||||
#else
|
||||
#define ALLOC_ANSWER_TRIE_NODE(STR) ALLOC_STRUCT(STR, struct answer_trie_node, GLOBAL_pages_ans_node, GLOBAL_pages_void)
|
||||
#endif
|
||||
#define FREE_ANSWER_TRIE_NODE(STR) FREE_STRUCT(STR, struct answer_trie_node, GLOBAL_pages_ans_node, GLOBAL_pages_void)
|
||||
#else
|
||||
#define ALLOC_ANSWER_TRIE_NODE(STR) ALLOC_STRUCT(STR, struct answer_trie_node, LOCAL_pages_ans_node, LOCAL_pages_void)
|
||||
#define FREE_ANSWER_TRIE_NODE(STR) FREE_STRUCT(STR, struct answer_trie_node, LOCAL_pages_ans_node, LOCAL_pages_void)
|
||||
#endif
|
||||
#define ALLOC_GLOBAL_TRIE_NODE(STR) ALLOC_STRUCT(STR, struct global_trie_node, _pages_gt_node)
|
||||
#define FREE_GLOBAL_TRIE_NODE(STR) FREE_STRUCT(STR, struct global_trie_node, _pages_gt_node)
|
||||
|
||||
#if !defined(THREADS_NO_SHARING) && !defined(THREADS_SUBGOAL_SHARING)
|
||||
#if defined(THREADS_FULL_SHARING) || defined(THREADS_CONSUMER_SHARING)
|
||||
#define ALLOC_ANSWER_TRIE_HASH(STR) LOCAL_NEXT_ALLOC_STRUCT(STR, LOCAL_next_free_ans_hash, struct answer_trie_hash, GLOBAL_pages_ans_hash, GLOBAL_pages_void)
|
||||
#else
|
||||
#define ALLOC_ANSWER_TRIE_HASH(STR) ALLOC_STRUCT(STR, struct answer_trie_hash, GLOBAL_pages_ans_hash, GLOBAL_pages_void)
|
||||
#endif
|
||||
#define FREE_ANSWER_TRIE_HASH(STR) FREE_STRUCT(STR, struct answer_trie_hash, GLOBAL_pages_ans_hash, GLOBAL_pages_void)
|
||||
#else
|
||||
#define ALLOC_ANSWER_TRIE_HASH(STR) ALLOC_STRUCT(STR, struct answer_trie_hash, LOCAL_pages_ans_hash, LOCAL_pages_void)
|
||||
#define FREE_ANSWER_TRIE_HASH(STR) FREE_STRUCT(STR, struct answer_trie_hash, LOCAL_pages_ans_hash, LOCAL_pages_void)
|
||||
#endif
|
||||
#define ALLOC_GLOBAL_TRIE_HASH(STR) ALLOC_STRUCT(STR, struct global_trie_hash, _pages_gt_hash)
|
||||
#define FREE_GLOBAL_TRIE_HASH(STR) FREE_STRUCT(STR, struct global_trie_hash, _pages_gt_hash)
|
||||
|
||||
#define ALLOC_ANSWER_REF_NODE(STR) ALLOC_STRUCT(STR, struct answer_ref_node, LOCAL_pages_ans_ref_node, LOCAL_pages_void)
|
||||
#define FREE_ANSWER_REF_NODE(STR) FREE_STRUCT(STR, struct answer_ref_node, LOCAL_pages_ans_ref_node, LOCAL_pages_void)
|
||||
#define ALLOC_OR_FRAME(STR) ALLOC_STRUCT(STR, struct or_frame, _pages_or_fr)
|
||||
#define FREE_OR_FRAME(STR) FREE_STRUCT(STR, struct or_frame, _pages_or_fr)
|
||||
|
||||
#define ALLOC_GLOBAL_TRIE_NODE(STR) ALLOC_STRUCT(STR, struct global_trie_node, GLOBAL_pages_gt_node, GLOBAL_pages_void)
|
||||
#define FREE_GLOBAL_TRIE_NODE(STR) FREE_STRUCT(STR, struct global_trie_node, GLOBAL_pages_gt_node, GLOBAL_pages_void)
|
||||
#define ALLOC_QG_SOLUTION_FRAME(STR) ALLOC_STRUCT(STR, struct query_goal_solution_frame, _pages_qg_sol_fr)
|
||||
#define FREE_QG_SOLUTION_FRAME(STR) FREE_STRUCT(STR, struct query_goal_solution_frame, _pages_qg_sol_fr)
|
||||
|
||||
#define ALLOC_GLOBAL_TRIE_HASH(STR) ALLOC_STRUCT(STR, struct global_trie_hash, GLOBAL_pages_gt_hash, GLOBAL_pages_void)
|
||||
#define FREE_GLOBAL_TRIE_HASH(STR) FREE_STRUCT(STR, struct global_trie_hash, GLOBAL_pages_gt_hash, GLOBAL_pages_void)
|
||||
#define ALLOC_QG_ANSWER_FRAME(STR) ALLOC_STRUCT(STR, struct query_goal_answer_frame, _pages_qg_ans_fr)
|
||||
#define FREE_QG_ANSWER_FRAME(STR) FREE_STRUCT(STR, struct query_goal_answer_frame, _pages_qg_ans_fr)
|
||||
|
||||
#define ALLOC_OR_FRAME(STR) ALLOC_STRUCT(STR, struct or_frame, GLOBAL_pages_or_fr, GLOBAL_pages_void)
|
||||
#define FREE_OR_FRAME(STR) FREE_STRUCT(STR, struct or_frame, GLOBAL_pages_or_fr, GLOBAL_pages_void)
|
||||
#define ALLOC_SUSPENSION_FRAME(STR) ALLOC_STRUCT(STR, struct suspension_frame, _pages_susp_fr)
|
||||
#define FREE_SUSPENSION_FRAME(STR) FREE_BLOCK(SuspFr_global_start(STR)); \
|
||||
FREE_STRUCT(STR, struct suspension_frame, _pages_susp_fr)
|
||||
|
||||
#define ALLOC_QG_SOLUTION_FRAME(STR) ALLOC_STRUCT(STR, struct query_goal_solution_frame, GLOBAL_pages_qg_sol_fr, GLOBAL_pages_void)
|
||||
#define FREE_QG_SOLUTION_FRAME(STR) FREE_STRUCT(STR, struct query_goal_solution_frame, GLOBAL_pages_qg_sol_fr, GLOBAL_pages_void)
|
||||
#define ALLOC_TG_SOLUTION_FRAME(STR) ALLOC_STRUCT(STR, struct table_subgoal_solution_frame, _pages_tg_sol_fr)
|
||||
#define FREE_TG_SOLUTION_FRAME(STR) FREE_STRUCT(STR, struct table_subgoal_solution_frame, _pages_tg_sol_fr)
|
||||
|
||||
#define ALLOC_QG_ANSWER_FRAME(STR) ALLOC_STRUCT(STR, struct query_goal_answer_frame, GLOBAL_pages_qg_ans_fr, GLOBAL_pages_void)
|
||||
#define FREE_QG_ANSWER_FRAME(STR) FREE_STRUCT(STR, struct query_goal_answer_frame, GLOBAL_pages_qg_ans_fr, GLOBAL_pages_void)
|
||||
|
||||
#define ALLOC_SUSPENSION_FRAME(STR) ALLOC_STRUCT(STR, struct suspension_frame, GLOBAL_pages_susp_fr, GLOBAL_pages_void)
|
||||
#define FREE_SUSPENSION_FRAME(STR) FREE_BLOCK(SuspFr_global_start(STR)); \
|
||||
FREE_STRUCT(STR, struct suspension_frame, GLOBAL_pages_susp_fr, GLOBAL_pages_void)
|
||||
|
||||
#define ALLOC_TG_SOLUTION_FRAME(STR) ALLOC_STRUCT(STR, struct table_subgoal_solution_frame, GLOBAL_pages_tg_sol_fr, GLOBAL_pages_void)
|
||||
#define FREE_TG_SOLUTION_FRAME(STR) FREE_STRUCT(STR, struct table_subgoal_solution_frame, GLOBAL_pages_tg_sol_fr, GLOBAL_pages_void)
|
||||
|
||||
#define ALLOC_TG_ANSWER_FRAME(STR) ALLOC_STRUCT(STR, struct table_subgoal_answer_frame, GLOBAL_pages_tg_ans_fr, GLOBAL_pages_void)
|
||||
#define FREE_TG_ANSWER_FRAME(STR) FREE_STRUCT(STR, struct table_subgoal_answer_frame, GLOBAL_pages_tg_ans_fr, GLOBAL_pages_void)
|
||||
#define ALLOC_TG_ANSWER_FRAME(STR) ALLOC_STRUCT(STR, struct table_subgoal_answer_frame, _pages_tg_ans_fr)
|
||||
#define FREE_TG_ANSWER_FRAME(STR) FREE_STRUCT(STR, struct table_subgoal_answer_frame, _pages_tg_ans_fr)
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user