⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opt_generators.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 C
字号:
#line 102 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"#include "mal_config.h"#include "opt_generators.h"static intisPBMalias(int idx, int mvar[], int top){	int i;	for(i =0; i<top; i++)		if( mvar[i]== idx) return i;	return -1;}static void BGcloseLoop(MalBlkPtr mb, int m, InstrPtr *stmt ){	InstrPtr r;	r = newInstruction(mb, ASSIGNsymbol);	r->barrier= REDOsymbol;	setModuleId(r, getModuleId(stmt[m]));	setFunctionId(r,putName("getNextElement",14));	getArg(r,0)= getArg(stmt[m],0);	pushArgument(mb,r,getArg(stmt[m],1));	pushInstruction(mb,r);	r = newInstruction(mb, ASSIGNsymbol);	r->barrier= EXITsymbol;	getArg(r,0)= getArg(stmt[m],0);	pushInstruction(mb,r);}static void BGkeepPartial(MalBlkPtr mb, int i, InstrPtr p){	InstrPtr r;	char tmpname[128];	r = newInstruction(mb, ASSIGNsymbol);	setModuleId(r, pbmRef);	setFunctionId(r,depositRef);	getArg(r,0)= newTmpVariable(mb,TYPE_any);	snprintf(tmpname,128,"pbat_%s", getVarName(mb,getArg(p,0)));	pushStr(mb,r,tmpname);	pushArgument(mb,r,getArg(p,0));	insertInstruction(mb,r,i);}#line 146 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"#define GEN_CLOSED 0#define GEN_OPENED 1#define GEN_PARTIAL 2#define GEN_PACKED 4intOPTgeneratorsImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){	InstrPtr *old=0, q,r, stmt[256];	int oldtop, keep=0,i,j,k,m=0;#ifndef NDEBUG	int oldsize;#endif	int iter=0,index[256]; /* active nesting level <=mtop*/	int  mtop=0, mvar[256], mstatus[256];	int size,match,actions=0;	char tmpname[128];#ifdef DEBUG_OPT_BATLOOPS	stream_printf(GDKout,"Start generators optimizer\n");	printFunction(GDKout, mb, 0);#endif	setLifespan(mb); /* to detect future variable use */	old = mb->stmt;	oldtop= mb->stop;#ifndef NDEBUG	oldsize= mb->ssize;#endif	size = (mb->stop *1.2 < mb->ssize)? mb->ssize: mb->stop *1.2;	mb->stmt = (InstrPtr *) GDKzalloc(size  * sizeof(InstrPtr));	mb->ssize = size ;	mb->stop = keep;	for( i=0; i<oldtop-1; i++){		p= old[i];#line 186 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"		if( getModuleId(p)== pbmRef && getFunctionId(p)== generatorRef) {			getFunctionId(p)= putName("newIterator",11);			p->barrier = BARRIERsymbol;			mvar[mtop] = getArg(p,0);			mstatus[mtop] = GEN_CLOSED; /* not yet opened */			stmt[mtop++]= p;			continue;		}#line 197 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"		if( p->token== NOOPsymbol || 			p->token== REMsymbol){			pushInstruction(mb,p);			continue;		}#line 210 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"		if( getFunctionId(p) == setWriteModeRef && getModuleId(p) == batRef){			for(k=0;k<mtop;k++)			if( mvar[k]== getArg(p,1)){				r= copyInstruction(stmt[m]);				getArg(r,0)= getArg(p,0);				getArg(r,1)= getArg(stmt[k],1);				getArg(p,1)= getArg(stmt[k],1);				getModuleId(p)= pbmRef;				mvar[mtop] = getArg(r,0);				mstatus[mtop]= GEN_CLOSED;				stmt[mtop]= r;				index[iter++]= mtop;				mtop++;			}			pushInstruction(mb,p);			continue;		}#line 232 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"		if( (getModuleId(p)== algebraRef 	&& getFunctionId(p)== selectRef) ||			(getModuleId(p)== algebraRef 	&& getFunctionId(p)== uselectRef) ||			(getModuleId(p)== algebraRef 	&& getFunctionId(p)== likeselectRef) ||			(getModuleId(p)== batRef 		&& getFunctionId(p)== reverseRef) ||			(getModuleId(p)== batRef 		&& getFunctionId(p)== mirrorRef) ||			(getModuleId(p)== algebraRef 	&& getFunctionId(p)== markTRef) ||			(getModuleId(p)== algebraRef	&& getFunctionId(p)== kdifferenceRef) ||			(getModuleId(p)== algebraRef	&& getFunctionId(p)== kunionRef) ||			(getModuleId(p)== algebraRef	&& getFunctionId(p)== joinRef) ||			(getModuleId(p)== algebraRef	&& getFunctionId(p)== semijoinRef) ||			(getModuleId(p)== batRef		&& getFunctionId(p)== setAccessRef) ||			(getModuleId(p)== batRef		&& getFunctionId(p)== appendRef)  ||			(getModuleId(p)== batRef		&& getFunctionId(p)== deleteRef) ||			(getModuleId(p)== batRef		&& getFunctionId(p)== setWriteModeRef) 			){#line 253 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"			match=0;			for(k=p->retc; k<p->argc;k++)			if( (m=isPBMalias(getArg(p,k),mvar,mtop)) >= 0) {				if( mstatus[m]== GEN_CLOSED){					r= copyInstruction(stmt[m]);					pushInstruction(mb,r);					mstatus[m]= GEN_OPENED;					index[iter++]=m;				}				match++;			}#line 268 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"			if( match){				pushInstruction(mb,p);				r = newInstruction(mb, ASSIGNsymbol);				r->barrier= BARRIERsymbol;				setModuleId(r,pbmRef);				setFunctionId(r,putName("newIterator",11));				getArg(r,0)= getArg(p,0);				snprintf(tmpname,128,"pbat_%s", getVarName(mb,getArg(p,0)));				pushStr(mb,r,tmpname);				mvar[mtop] = getArg(r,0);				mstatus[mtop]= GEN_PARTIAL;				stmt[mtop]= r;				index[iter++]= mtop;				mtop++;				actions++;				continue;			}		} #line 292 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"		if( ((getModuleId(p)==aggrRef && getFunctionId(p)== countRef) || 			(getModuleId(p)==aggrRef && getFunctionId(p)== minRef && p->argc==3) ||			(getModuleId(p)==aggrRef && getFunctionId(p)== maxRef && p->argc==3) ||			(getModuleId(p)==aggrRef && getFunctionId(p)==sumRef && p->argc==2)) &&			(m=isPBMalias(getArg(p,1),mvar,mtop)) >= 0){			r = newInstruction(mb,ASSIGNsymbol);			getArg(r,0)= getArg(p,0);			pushInt(mb,r,0);#line 309 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"						m= 0;			for(k= mb->stop-1; k>0; k--){				q= getInstrPtr(mb,k);				if( getModuleId(q)== pbmRef && 					getFunctionId(q)== putName("newIterator",11))					m=k;			}			insertInstruction(mb,r,m);			q= copyInstruction(p);			k= newTmpVariable(mb,TYPE_int);			getArg(q,0)= k;			pushInstruction(mb,q);			q= newInstruction(mb,ASSIGNsymbol);			setModuleId(q,calcRef); 			if( getFunctionId(p)== countRef || getFunctionId(p)== sumRef)				setFunctionId(q,plusRef);			else				setFunctionId(q,getFunctionId(p));			getArg(q,0)= getArg(r,0);			q= pushArgument(mb,q,getArg(r,0));			q= pushArgument(mb,q,k);			pushInstruction(mb,q);			continue;		} #line 343 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"		match=0;		for(j=p->retc; j<p->argc; j++)		if(  isPBMalias(getArg(p,j),mvar,mtop) >= GEN_OPENED) {			m=i; match++;		}#line 356 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"		for(k=iter-1;k>=0; k--)		if(mstatus[index[k]]== GEN_OPENED) {			BGcloseLoop(mb,index[k],stmt);			mstatus[index[k]]= GEN_CLOSED;		} else		if( mstatus[index[k]]== GEN_PARTIAL){			if( getVar(mb,getArg(stmt[index[k]],0))->endLifespan>= i){				BGkeepPartial(mb,mb->stop,stmt[index[k]]);				r= newInstruction(mb,ASSIGNsymbol);				getModuleId(r)=pbmRef;				getFunctionId(r)=putName("discard",7);				getArg(r,0)= newTmpVariable(mb, TYPE_any);				snprintf(tmpname,128,"pbat_%s", 						getVarName(mb,getArg(stmt[index[k]],0)));				pushStr(mb,r,tmpname);				assert(oldtop<oldsize-1);				old[oldtop]= old[oldtop-1];				old[oldtop-1]=r;				oldtop++;			}			mstatus[index[k]]= GEN_CLOSED;		} else		iter = 0;				for( k= p->retc; k<p->argc; k++)		if(	(m=isPBMalias(getArg(p,k),mvar,mtop)) >= 0){#ifdef DEBUG_OPT_BATLOOPS			stream_printf(GDKout,"Dependency resolution k=%d\n",k);			printInstruction(GDKout,mb,p,0);#endif			r = newInstruction(mb, ASSIGNsymbol);			setModuleId(r,pbmRef);			setFunctionId(r,packRef);			getArg(r,0)= getArg(stmt[m],0);			pushInstruction(mb,r);			mstatus[m]= GEN_PACKED;			actions++;			break;		}		pushInstruction(mb,p);	}#line 400 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"	for(i=iter-1; i>=0; i--)	if( mstatus[index[i]]== GEN_OPENED){		BGcloseLoop(mb,index[i],stmt);	}	pushInstruction(mb,old[oldtop-1]);	GDKfree(old);	(void) stk; #ifdef DEBUG_OPT_BATLOOPS	stream_printf(GDKout,"Result of generators optimizer\n");	printFunction(GDKout, mb, 0);#endif	return actions;}#line 417 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"#line 415 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"/* #define _DEBUG_OPTIMIZER_*/str OPTgenerators(MalBlkPtr mb, MalStkPtr stk, InstrPtr p){	str modnme;	str fcnnme;	Module  scope=NULL;	Symbol s= NULL;	lng clk= GDKusec();	int actions = 0;	optimizerInit();	if( p )		removeInstruction(mb, p);#ifdef _DEBUG_OPTIMIZER_	stream_printf(GDKout,"apply generators\n");	printFunction(GDKout,mb,LIST_MAL_ALL);#endif	if( p && p->argc > 1 && getFunctionId(p) != multiplexRef){#ifdef _DEBUG_OPTIMIZER_		stream_printf(GDKout,"locate function generators\n");#endif		if( getArgType(mb,p,1) != TYPE_str ||			getArgType(mb,p,2) != TYPE_str ||			!isConstant(mb,getArg(p,1)) ||			!isConstant(mb,getArg(p,2))		) {			char buf[1024];			snprintf(buf,1024, "Optimizer requires constant string arguments\n");			throw(MAL, "optimizer.generators",buf);		}		if( stk != 0){			modnme= (str)getArgValue(stk,p,1);			fcnnme= (str)getArgValue(stk,p,2);		} else {			modnme= getArgDefault(mb,p,1);			fcnnme= getArgDefault(mb,p,2);		}		scope = findModule(MCgetClient()->nspace,putName(modnme,strlen(modnme)) );		if( scope)			s= findSymbolInModule(scope,putName(fcnnme,strlen(fcnnme)));		if( s == NULL) {			char buf[1024];			snprintf(buf,1024, "Could not find %s.%s\n",modnme,fcnnme);			throw(MAL, "optimizer.generators",buf);		}#ifdef _DEBUG_OPTIMIZER_		stream_printf(GDKout,"generators %s %d\n",modnme,fcnnme);#endif		mb = s->def;		stk= 0;	} 	if( mb->errors )		return MAL_SUCCEED;	addtoMalBlkHistory(mb);	actions= OPTgeneratorsImplementation(mb,stk,p);#ifdef _DEBUG_OPTIMIZER_	stream_printf(GDKout,"finished generators %d\n",actions);	printFunction(GDKout,mb,LIST_MAL_ALL);#endif    optimizerCheck(mb, "optimizer.generators", actions, GDKusec() - clk,OPT_CHECK_ALL);	return MAL_SUCCEED;}#line 417 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"#line 419 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_generators.mx"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -