00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "xsb_config.h"
00027 #include "xsb_debug.h"
00028
00029 #include <stdio.h>
00030 #include <stdlib.h>
00031
00032 #include "auxlry.h"
00033 #include "cell_xsb.h"
00034 #include "psc_xsb.h"
00035 #include "trie_internals.h"
00036 #include "macro_xsb.h"
00037 #include "error_xsb.h"
00038 #include "thread_xsb.h"
00039 #include "memory_xsb.h"
00040
00041 extern BTHTptr hhadded;
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 static void free_private_tstn(CTXTdeclc TSTNptr tstn) {
00052 SM_DeallocateStruct(smTSTN,tstn);
00053 }
00054
00055 static void free_private_tstht(CTXTdeclc TSTHTptr tstht) {
00056 TrieHT_RemoveFromAllocList(smTSTHT,tstht);
00057 SM_DeallocateStruct(smTSTHT,tstht);
00058 }
00059
00060 static void free_private_tsi(CTXTdeclc TSTHTptr tstht) {
00061 if ( IsNonNULL(TSTHT_IndexHead(tstht)) )
00062 SM_DeallocateStructList(smTSIN,TSTHT_IndexTail(tstht),
00063 TSTHT_IndexHead(tstht));
00064 }
00065
00066
00067
00068
00069
00070
00071
00072 static void free_private_al(CTXTdeclc VariantSF sf) {
00073 if ( IsNonNULL(subg_ans_list_ptr(sf)) )
00074 free_answer_list(sf);
00075 }
00076
00077
00078
00079
00080
00081 static void delete_private_btht(CTXTdeclc BTHTptr btht) {
00082 mem_dealloc(BTHT_BucketArray(btht),BTHT_NumBuckets(btht)*sizeof(void *),TABLE_SPACE);
00083 TrieHT_RemoveFromAllocList(subsumptive_smBTHT,btht);
00084 SM_DeallocateStruct(subsumptive_smBTHT,btht);
00085 }
00086
00087 static void delete_private_tstht(CTXTdeclc TSTHTptr tstht) {
00088 mem_dealloc(BTHT_BucketArray(tstht),BTHT_NumBuckets(tstht)*sizeof(void *),TABLE_SPACE);
00089 free_private_tsi(CTXTc tstht);
00090 free_private_tstht(CTXTc tstht);
00091 }
00092
00093 static void delete_private_sf(CTXTdeclc VariantSF sf) {
00094 free_private_al(CTXTc sf);
00095 if ( IsProducingSubgoal(sf) )
00096 FreeProducerSF(sf)
00097 else
00098 SM_DeallocateStruct(smConsSF,sf);
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108 static void delete_tst_answer_set(CTXTdeclc TSTNptr root) {
00109
00110 TSTNptr current, sibling;
00111 TSTHTptr hash_hdr;
00112 unsigned int i;
00113
00114
00115 if ( IsNULL(root) )
00116 return;
00117
00118
00119
00120
00121
00122
00123
00124 if ( TSTN_Child(root) && IsHashHeader(TSTN_Child(root)) ) {
00125 hash_hdr = TSTN_GetHashHdr(root);
00126 for ( i = 0; i < TSTHT_NumBuckets(hash_hdr); i++ )
00127 for ( current = TSTHT_BucketArray(hash_hdr)[i];
00128 IsNonNULL(current); current = sibling ) {
00129 sibling = TSTN_Sibling(current);
00130 delete_tst_answer_set(CTXTc current);
00131 }
00132 delete_private_tstht(CTXTc hash_hdr);
00133 }
00134 else if ( ! IsLeafNode(root) )
00135 for ( current = TSTN_Child(root); IsNonNULL(current);
00136 current = sibling ) {
00137 sibling = TSTN_Sibling(current);
00138 delete_tst_answer_set(CTXTc current);
00139 }
00140 free_private_tstn(CTXTc root);
00141 }
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 void delete_call_index(CTXTdeclc BTNptr root) {
00154
00155 BTNptr current, sibling;
00156 BTHTptr hash_hdr;
00157 unsigned int i;
00158
00159 if ( IsNULL(root) )
00160 return;
00161
00162 if ( ! IsLeafNode(root) ) {
00163 if ( IsHashHeader(BTN_Child(root)) ) {
00164
00165 hash_hdr = BTN_GetHashHdr(root);
00166 for ( i = 0; i < BTHT_NumBuckets(hash_hdr); i++ )
00167 for ( current = BTHT_BucketArray(hash_hdr)[i];
00168 IsNonNULL(current); current = sibling ) {
00169 sibling = BTN_Sibling(current);
00170 delete_call_index(CTXTc current);
00171 }
00172 delete_private_btht(CTXTc hash_hdr);
00173 }
00174 else
00175 for ( current = BTN_Child(root); IsNonNULL(current);
00176 current = sibling ) {
00177 sibling = BTN_Sibling(current);
00178 delete_call_index(CTXTc current);
00179 }
00180 }
00181 SM_DeallocateStruct(subsumptive_smBTN,root);
00182 }
00183
00184
00185
00186 void delete_subsumptive_table(CTXTdeclc TIFptr tif) {
00187
00188 SubProdSF cur_prod, next_prod;
00189 SubConsSF cur_cons, next_cons;
00190
00191 for ( cur_prod = (SubProdSF)TIF_Subgoals(tif);
00192 IsNonNULL(cur_prod); cur_prod = next_prod ) {
00193 for ( cur_cons = subg_consumers(cur_prod);
00194 IsNonNULL(cur_cons); cur_cons = next_cons ) {
00195 next_cons = conssf_consumers(cur_cons);
00196 delete_private_sf(CTXTc (VariantSF)cur_cons);
00197 }
00198 next_prod = (SubProdSF)subg_next_subgoal(cur_prod);
00199 delete_tst_answer_set(CTXTc (TSTNptr)subg_ans_root_ptr(cur_prod));
00200 delete_private_sf(CTXTc (VariantSF)cur_prod);
00201 }
00202 delete_call_index(CTXTc TIF_CallTrie(tif));
00203 }
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 void reclaim_deleted_subsumptive_table(CTXTdeclc DelTFptr deltf_ptr) {
00215
00216 SubProdSF cur_prod, next_prod;
00217 SubConsSF cur_cons, next_cons;
00218
00219 for ( cur_prod = (SubProdSF) DTF_Subgoals(deltf_ptr);
00220 IsNonNULL(cur_prod); cur_prod = next_prod ) {
00221 for ( cur_cons = subg_consumers(cur_prod);
00222 IsNonNULL(cur_cons); cur_cons = next_cons ) {
00223 next_cons = conssf_consumers(cur_cons);
00224 delete_private_sf(CTXTc (VariantSF)cur_cons);
00225 }
00226 next_prod = (SubProdSF)subg_next_subgoal(cur_prod);
00227 delete_tst_answer_set(CTXTc (TSTNptr)subg_ans_root_ptr(cur_prod));
00228 delete_private_sf(CTXTc (VariantSF)cur_prod);
00229 }
00230 delete_call_index(CTXTc DTF_CallTrie(deltf_ptr));
00231 }
00232