00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __COMPLETE_LOCAL_H__
00025 #define __COMPLETE_LOCAL_H__
00026
00027 #ifdef LOCAL_EVAL
00028 void makeConsumerFromGenerator(CTXTdeclc VariantSF producer_sf)
00029 {
00030 xsb_dbgmsg((LOG_COMPLETION,
00031 "Transforming %x from a generator to consumer (prev %x)\n",
00032 breg,nlcp_prevbreg(breg)));
00033 nlcp_trie_return(breg) = subg_ans_list_ptr(producer_sf);
00034 nlcp_pcreg(breg) = (pb) &answer_return_inst;
00035 nlcp_prevlookup(breg) = subg_asf_list_ptr(producer_sf);
00036 #ifdef CONC_COMPL
00037 nlcp_tid(breg) = makeint(th->tid);
00038 #endif
00039 subg_asf_list_ptr(producer_sf) = breg;
00040 }
00041 #endif
00042
00043 #ifdef PROFILE
00044 #define ProfileLeader \
00045 { \
00046 int num_subgoals = 0; \
00047 int num_completed = 0; \
00048 int num_consumers_in_ascc = 0; \
00049 int num_compl_susps_in_ascc = 0; \
00050 int leader_level; \
00051 CPtr profile_CSF = cs_ptr; \
00052 VariantSF prof_compl_subg; \
00053 \
00054 leader_level = compl_level(profile_CSF); \
00055 \
00056 \
00057 while (profile_CSF >= openreg) { \
00058 num_subgoals++; \
00059 prof_compl_subg = compl_subgoal_ptr(profile_CSF); \
00060 if (is_completed(prof_compl_subg)) { \
00061 num_completed++; \
00062 } \
00063 else { \
00064 CPtr nsf; \
00065 nsf = subg_asf_list_ptr(prof_compl_subg); \
00066 while (nsf != NULL) { \
00067 num_consumers_in_ascc++; \
00068 nsf = nlcp_prevlookup(nsf); \
00069 } \
00070 nsf = subg_compl_susp_ptr(prof_compl_subg); \
00071 while (nsf != NULL) { \
00072 num_compl_susps_in_ascc++; \
00073 nsf = csf_prevcsf(nsf); \
00074 } \
00075 } \
00076 profile_CSF = next_compl_frame(profile_CSF); \
00077 } \
00078 if (num_subgoals > max_subgoals) { max_subgoals = num_subgoals; } \
00079 if (num_completed > max_completed) { max_completed = num_completed; } \
00080 if (num_consumers_in_ascc > max_consumers_in_ascc) { \
00081 max_consumers_in_ascc = num_consumers_in_ascc; \
00082 } \
00083 if (num_compl_susps_in_ascc > max_compl_susps_in_ascc) { \
00084 max_compl_susps_in_ascc = num_compl_susps_in_ascc; \
00085 } \
00086 if (pflags[PROFFLAG] > 2) { \
00087 fprintf(stdmsg, \
00088 "p(lev(%d),lead(%d),subg(%d),ec(%d),cons(%d),cs(%d)).\n", \
00089 level_num,leader_level,num_subgoals,num_completed, \
00090 num_consumers_in_ascc,num_compl_susps_in_ascc); \
00091 } \
00092 }
00093 #else
00094 #define ProfileLeader
00095 #endif
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 #ifdef PROFILE
00120 void print_sdg_edge(int check_num,int sign,VariantSF fromsf,VariantSF tosf)
00121 {
00122 fprintf(stddbg,"edge(%d,%d,",check_num,sign);
00123 print_subgoal(stddbg,fromsf); fprintf(stddbg,",");
00124 print_subgoal(stddbg,tosf); fprintf(stddbg,").\n");
00125 }
00126
00127 void SpitOutGraph(CPtr cs_ptr)
00128 {
00129 CPtr tmp_openreg = cs_ptr;
00130 CPtr nsf;
00131 int num_subgoals = 0;
00132 VariantSF prof_compl_subg;
00133
00134 sdg_check_num++;
00135 if (sdg_sample_rate > 0 && (sdg_check_num % sdg_sample_rate == 0)) {
00136 printf(" /* now checking: %d */ \n",sdg_check_num);
00137 while (tmp_openreg < COMPLSTACKBOTTOM) {
00138 num_subgoals++;
00139 prof_compl_subg = compl_subgoal_ptr(tmp_openreg);
00140
00141 fprintf(stddbg," /* ");
00142 print_subgoal(stddbg, prof_compl_subg);
00143 fprintf(stddbg," */ \n");
00144
00145 if (tcp_ptcp(subg_cp_ptr(prof_compl_subg)) != NULL ) {
00146 print_sdg_edge(sdg_check_num,2,
00147 tcp_ptcp(subg_cp_ptr(prof_compl_subg)),
00148 prof_compl_subg);
00149 } else {
00150 }
00151
00152 nsf = subg_asf_list_ptr(prof_compl_subg);
00153 while (nsf != NULL) {
00154
00155 print_sdg_edge(sdg_check_num,1,nlcp_ptcp(nsf),prof_compl_subg);
00156
00157 nsf = nlcp_prevlookup(nsf);
00158 }
00159
00160 nsf = subg_compl_susp_ptr(prof_compl_subg);
00161 while (nsf != NULL) {
00162
00163 print_sdg_edge(sdg_check_num,-1,csf_ptcp(nsf),prof_compl_subg);
00164
00165 nsf = csf_prevcsf(nsf);
00166 }
00167
00168 tmp_openreg = prev_compl_frame(tmp_openreg);
00169 }
00170
00171 }
00172 }
00173 #else
00174 #define SpitOutGraph
00175 #endif
00176
00177 #ifdef LOCAL_EVAL
00178 #define DisposeOfComplSusp(subgoal) \
00179 subg_compl_susp_ptr(subgoal) = NULL
00180 #define DeleteCSF(nsf) \
00181 csf_prevcsf(nsf)
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 #define ResumeCSFs() \
00196 { \
00197 CPtr nsftmp; \
00198 if (!cur_breg) { \
00199 cur_breg = cc_tbreg = nsf; \
00200 } else { \
00201 csf_prevcsf(cur_breg) = nsf; \
00202 cur_breg = nsf; \
00203 } \
00204 for (nsftmp = cur_breg; csf_prevcsf(nsftmp); nsftmp = csf_prevcsf(nsftmp)) {\
00205 cs_hreg(nsftmp) = hreg; \
00206 cs_ebreg(nsftmp) = ebreg; \
00207 } \
00208 cs_hreg(nsftmp) = hreg; \
00209 cs_ebreg(nsftmp) = ebreg; \
00210 csf_prevcsf(nsftmp) = breg; \
00211 cur_breg = nsftmp; \
00212 subg_compl_susp_ptr(compl_subg) = NULL; \
00213 }
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233 static inline CPtr ProcessSuspensionFrames(CTXTdeclc CPtr cc_tbreg_in,
00234 CPtr cs_ptr)
00235 {
00236 CPtr ComplStkFrame = cs_ptr;
00237 VariantSF compl_subg;
00238 CPtr cc_tbreg = cc_tbreg_in;
00239 CPtr cur_breg = NULL;
00240
00241
00242 while (ComplStkFrame >= openreg) {
00243 compl_subg = compl_subgoal_ptr(ComplStkFrame);
00244
00245
00246
00247
00248
00249
00250
00251
00252 if (is_completed(compl_subg)) {
00253 DisposeOfComplSusp(compl_subg);
00254 }
00255 else {
00256 CPtr nsf;
00257 if ((nsf = subg_compl_susp_ptr(compl_subg)) != NULL) {
00258 CPtr p, prev_nsf = NULL;
00259
00260
00261
00262
00263
00264
00265 while (nsf) {
00266 if ((p = csf_ptcp(nsf)) != NULL) {
00267 if (is_completed(p)) {
00268 if (!prev_nsf) {
00269 nsf = subg_compl_susp_ptr(compl_subg) = DeleteCSF(nsf);
00270 }
00271 else {
00272 nsf = csf_prevcsf(prev_nsf) = DeleteCSF(nsf);
00273 }
00274 }
00275 else {
00276 mark_delayed(ComplStkFrame, subg_compl_stack_ptr(p), nsf);
00277 prev_nsf = nsf;
00278 nsf = csf_prevcsf(nsf);
00279 }
00280 }
00281 }
00282
00283 if ((nsf = subg_compl_susp_ptr(compl_subg))) {
00284 ResumeCSFs();
00285 }
00286 }
00287 }
00288 ComplStkFrame = next_compl_frame(ComplStkFrame);
00289 }
00290 return cc_tbreg;
00291 }
00292
00293 static inline void CompleteSimplifyAndReclaim(CTXTdeclc CPtr cs_ptr)
00294 {
00295 VariantSF compl_subg;
00296 CPtr ComplStkFrame = cs_ptr;
00297
00298
00299
00300
00301 while (ComplStkFrame >= openreg) {
00302 compl_subg = compl_subgoal_ptr(ComplStkFrame);
00303 mark_as_completed(compl_subg);
00304 if (neg_simplif_possible(compl_subg)) {
00305 SYS_MUTEX_LOCK( MUTEX_DELAY ) ;
00306 simplify_neg_fails(CTXTc compl_subg);
00307 SYS_MUTEX_UNLOCK( MUTEX_DELAY ) ;
00308 }
00309
00310 ComplStkFrame = next_compl_frame(ComplStkFrame);
00311 }
00312
00313
00314
00315
00316
00317
00318
00319
00320 ComplStkFrame = next_compl_frame(cs_ptr);
00321 while (ComplStkFrame >= openreg) {
00322 compl_subg = compl_subgoal_ptr(ComplStkFrame);
00323 reclaim_incomplete_table_structs(compl_subg);
00324 ComplStkFrame = next_compl_frame(ComplStkFrame);
00325 }
00326 }
00327
00328 static inline void SetupReturnFromLeader(CTXTdeclc CPtr orig_breg, CPtr cs_ptr,
00329 VariantSF subgoal)
00330 {
00331 CPtr answer_template;
00332 int template_size, attv_num;
00333 Integer tmp;
00334
00335 switch_envs(orig_breg);
00336
00337
00338 ptcpreg = tcp_ptcp(orig_breg);
00339 delayreg = tcp_pdreg(orig_breg);
00340 restore_some_wamregs(orig_breg, ereg);
00341
00342
00343
00344 ebreg = cp_ebreg(tcp_prevbreg(orig_breg));
00345 hbreg = cp_hreg(tcp_prevbreg(orig_breg));
00346 subg_asf_list_ptr(subgoal) = 0;
00347
00348
00349 openreg = prev_compl_frame(cs_ptr);
00350 reclaim_stacks(orig_breg);
00351 answer_template = tcp_template(breg);
00352 tmp = int_val(cell(answer_template));
00353 get_var_and_attv_nums(template_size, attv_num, tmp);
00354 answer_template = answer_template - template_size;
00355
00356
00357
00358 num_vars_in_var_regs = -1;
00359 if (attv_num > 0) {
00360 CPtr cptr;
00361 for (cptr = answer_template + template_size - 1;
00362 cptr >= answer_template; cptr--) {
00363 if (isattv(cell(cptr)))
00364 var_regs[++num_vars_in_var_regs] = (CPtr) cell(cptr);
00365 }
00366
00367 }
00368
00369 reg_arrayptr = reg_array - 1;
00370 for (tmp = 0; tmp < template_size; tmp++) {
00371 CPtr cptr = answer_template;
00372 pushreg(*cptr);
00373 answer_template++;
00374 }
00375
00376 breg = tcp_prevbreg(orig_breg);
00377 delay_it = 1;
00378 }
00379
00380 #endif
00381 #endif