From: Terrance S. <ts...@us...> - 2009-11-16 15:49:42
|
Update of /cvsroot/xsb/XSB/emu In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv28393 Modified Files: sub_tables_xsb_i.h tables.c tries.c Log Message: tries.c -- fixed (sort of) a heap-overflow bug when returning large answers with delay lists. sub_tables_xsb.i and tables.c -- just some code cleanup. Index: sub_tables_xsb_i.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/sub_tables_xsb_i.h,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- sub_tables_xsb_i.h 1 Jan 2009 00:07:22 -0000 1.15 +++ sub_tables_xsb_i.h 16 Nov 2009 15:49:21 -0000 1.16 @@ -178,13 +178,10 @@ } #endif -#ifndef MULTI_THREAD - NumSubOps_CallCheckInsert++; -#else -#ifdef NON_OPT_COMPILE +#if !defined(MULTI_THREAD) || defined(NON_OPT_COMPILE) NumSubOps_CallCheckInsert++; #endif -#endif + btRoot = TIF_CallTrie(CallInfo_TableInfo(*callStruct)); answer_template = CallInfo_VarVectorLoc(*callStruct) - 1; @@ -194,17 +191,8 @@ xsbBool isNew; btn = bt_escape_search(CTXTc btRoot, &isNew); -#ifndef MULTI_THREAD - if ( isNew ) - NumSubOps_ProducerCall++; - else { - if ( is_completed(CallTrieLeaf_GetSF(btn)) ) - NumSubOps_CallToCompletedTable++; - else - NumSubOps_VariantCall++; - } -#else -#ifdef NON_OPT_COMPILE + +#if !defined(MULTI_THREAD) || defined(NON_OPT_COMPILE) if ( isNew ) NumSubOps_ProducerCall++; else { @@ -214,7 +202,7 @@ NumSubOps_VariantCall++; } #endif -#endif + CallLUR_VariantFound(*results) = ( ! isNew ); CallLUR_Leaf(*results) = btn; CallLUR_Subsumer(*results) = CallTrieLeaf_GetSF(btn); @@ -245,13 +233,9 @@ */ if ( path_type == NO_PATH ) { /* new producer */ -#ifndef MULTI_THREAD - NumSubOps_ProducerCall++; -#else -#ifdef NON_OPT_COMPILE +#if !defined(MULTI_THREAD) || defined(NON_OPT_COMPILE) NumSubOps_ProducerCall++; #endif -#endif Trail_Unwind_All; CallLUR_Subsumer(*results) = NULL; /* no SF found, so no subsumer */ CallLUR_VariantFound(*results) = NO; @@ -281,7 +265,7 @@ fprintf(stddbg,"\nWith "); /* continued below */ } #endif -#ifndef MULTI_THREAD +#if !defined(MULTI_THREAD) || defined(NON_OPT_COMPILE) if ( is_completed(sf_with_ans_set) ) NumSubOps_CallToCompletedTable++; else { @@ -290,17 +274,6 @@ else NumSubOps_SubsumedCall++; } -#else -#ifdef NON_OPT_COMPILE - if ( is_completed(sf_with_ans_set) ) - NumSubOps_CallToCompletedTable++; - else { - if ( path_type == VARIANT_PATH ) - NumSubOps_VariantCall++; - else - NumSubOps_SubsumedCall++; - } -#endif #endif answer_template = extract_template_from_lookup(CTXTc answer_template); Trail_Unwind_All; @@ -316,19 +289,12 @@ } #endif sf_with_ans_set = conssf_producer(sf_with_ans_set); -#ifndef MULTI_THREAD - if ( is_completed(sf_with_ans_set) ) - NumSubOps_CallToCompletedTable++; - else - NumSubOps_SubsumedCall++; -#else -#ifdef NON_OPT_COMPILE +#if !defined(MULTI_THREAD) || defined(NON_OPT_COMPILE) if ( is_completed(sf_with_ans_set) ) NumSubOps_CallToCompletedTable++; else NumSubOps_SubsumedCall++; #endif -#endif Trail_Unwind_All; answer_template = reconstruct_template_for_producer(CTXTc callStruct, sf_with_ans_set, @@ -349,13 +315,9 @@ /* Conditionally Create Call Entry ------------------------------- */ if ( (path_type != VARIANT_PATH) && (! is_completed(sf_with_ans_set)) ) { -#ifndef MULTI_THREAD - NumSubOps_SubsumedCallEntry++; -#else -#ifdef NON_OPT_COMPILE +#if !defined(MULTI_THREAD) || defined(NON_OPT_COMPILE) NumSubOps_SubsumedCallEntry++; #endif -#endif CallLUR_Leaf(*results) = bt_insert(CTXTc btRoot,stl_restore_variant_cont(CTXT),NO_INSERT_SYMBOL); Trail_Unwind_All; Index: tables.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/tables.c,v retrieving revision 1.67 retrieving revision 1.68 diff -u -r1.67 -r1.68 --- tables.c 8 Nov 2009 18:29:22 -0000 1.67 +++ tables.c 16 Nov 2009 15:49:21 -0000 1.68 @@ -166,12 +166,12 @@ /* - * Create an Empty Call Index, represented by a Basic Trie. Note that + * Create an Empty Call Trie, represented by a Basic Trie. Note that * the root of the trie is labelled with the predicate symbol. * Assumes that private/shared switch for SMs has been set. */ -inline static BTNptr newCallIndex(CTXTdeclc Psc predicate) { +inline static BTNptr newCallTrie(CTXTdeclc Psc predicate) { BTNptr pRoot; @@ -183,7 +183,7 @@ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - * Note that the call index of the TIF is not allocated until the first + * Note that the call trie of the TIF is not allocated until the first * call is entered. Upon exit, CallLUR_VarVector(*results) points to * the size of the answer template on the CPS. See slginsts_xsb_i.h * for answer template layout. @@ -208,7 +208,7 @@ tif = CallInfo_TableInfo(*call_info); if ( IsNULL(TIF_CallTrie(tif)) ) - TIF_CallTrie(tif) = newCallIndex(CTXTc TIF_PSC(tif)); + TIF_CallTrie(tif) = newCallTrie(CTXTc TIF_PSC(tif)); if ( IsVariantPredicate(tif) ){ variant_call_search(CTXTc call_info,results); #ifndef MULTI_THREAD @@ -321,7 +321,7 @@ BTNptr leaf; tif = CallInfo_TableInfo(*call_info); if ( IsNULL(TIF_CallTrie(tif)) ) - TIF_CallTrie(tif) = newCallIndex(CTXTc TIF_PSC(tif)); + TIF_CallTrie(tif) = newCallTrie(CTXTc TIF_PSC(tif)); if ( IsVariantPredicate(tif) ){ variant_call_search(CTXTc call_info,results); @@ -334,7 +334,10 @@ } } else - xsb_warn("Incremental and subsumptive do not match"); + /* TLS: in principle this should already have been checked, but I'm + not sure we can count on it */ + xsb_misc_error("Tabled predicate cannot be both incremental and subsumptive", + get_name(TIF_PSC(tif)),get_arity(TIF_PSC(tif))); { /* @@ -520,13 +523,10 @@ // printf("\n"); printAnswerTemplate(stderr,templ,size); ts = conssf_timestamp(consSF); tstRoot = (TSTNptr)subg_ans_root_ptr(prodSF); -#ifndef MULTI_THREAD - NumSubOps_IdentifyRelevantAnswers++; -#else -#ifdef NON_OPT_COMPILE + +#if !defined(MULTI_THREAD) || defined(NON_OPT_COMPILE) NumSubOps_IdentifyRelevantAnswers++; #endif -#endif answers = tst_collect_relevant_answers(CTXTc tstRoot,ts,size,templ); conssf_timestamp(consSF) = TSTN_TimeStamp(tstRoot); @@ -556,6 +556,7 @@ * For statistical purposes, we check whether the current usage of * these incomplete-table structures are new maximums. * + * TLS 09/11 -- Now only doing this in NON_OPT_COMPILE * Currently, timestamps from the TSIs are copied back to the TSTNs. * Although not necessary, this method has some advantages. Foremost, * this field will never contain garbage values, and so we avoid @@ -591,10 +592,12 @@ for ( ht = TSTRoot_GetHTList(subg_ans_root_ptr(producerSF)); IsNonNULL(ht); ht = TSTHT_InternalLink(ht) ) { +#ifdef NON_OPT_COMPILE /*** Put timestamps back into TSTNs ***/ for ( tsi_entry = TSTHT_IndexHead(ht); IsNonNULL(tsi_entry); - tsi_entry = TSIN_Next(tsi_entry) ) - TSTN_TimeStamp(TSIN_TSTNode(tsi_entry)) = TSIN_TimeStamp(tsi_entry); + tsi_entry = TSIN_Next(tsi_entry) ) + TSTN_TimeStamp(TSIN_TSTNode(tsi_entry)) = TSIN_TimeStamp(tsi_entry); +#endif /*** Return TSIN chain to Structure Manager ***/ if ( IsNULL(TSTHT_IndexTail(ht)) || Index: tries.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/tries.c,v retrieving revision 1.116 retrieving revision 1.117 diff -u -r1.116 -r1.117 --- tries.c 8 Nov 2009 18:29:22 -0000 1.116 +++ tries.c 16 Nov 2009 15:49:21 -0000 1.117 @@ -1416,7 +1416,16 @@ /* * `TriePtr' is a leaf in the answer trie, and `cptr' is a vector of * variables for receiving the substitution. + * + * TLS: 09/11/15 + * In addition to providing space to hold an answer, we need to ensure space to + * delay the predicate if needed. I'm taking a guess: we need up to 255 words to hold + * the variables of the predicate, plus a few words for the delay element. Rounding it up, + * and multipling by 8 bytes per word (in case we're in 64-bit mode) moves it up to 2400 + * */ +#define DELAYING_FUDGE_FACTOR 2400 + void load_solution_trie(CTXTdeclc int arity, int attv_num, CPtr cptr, BTNptr TriePtr) { CPtr xtemp; |