- System.out.println("Inside generateFlatPrefetchNode()");
- if (state.PREFETCH) {
- System.out.println("The Prefetch pairs to be fetched are "+ fpn.hspp);
- Iterator it = fpn.hspp.iterator();
- for(;it.hasNext();) {
- PrefetchPair pp = (PrefetchPair) it.next();
- //TODO handle arrays in prefetch tuples, currently only handle fields
- Integer statusbase = locality.getNodePreTempInfo(lb,fpn).get(pp.base);
- System.out.println("DEBUG-> generateFlatPrefetchNode()" + statusbase);
- if(statusbase == LocalityAnalysis.GLOBAL) {
- // Generate oid for base
- } else {
- for(int i = 0; i<pp.desc.size(); i++) {
- Object o = pp.desc.get(i);
- if(!(o instanceof IndexDescriptor)) {
- FieldDescriptor fd = (FieldDescriptor) o;
- Integer statusfd = locality.getNodePreTempInfo(lb,fpn).get(fd);
- System.out.println("DEBUG-> generateFlatPrefetchNode() fd" + statusfd);
- //find out the locality of the fieldDescriptor
- if(statusfd == LocalityAnalysis.GLOBAL) {
- //generate oid for it
- }
- }
- }
- }
- }
- //Each temp descriptor can be an oid
- //Find locality of each prefetch tuple in the FLatPrefetchNode
- //Separate them as Local or Global
- //generate oids and offset value for prefetch tuple
- }
+ if (state.PREFETCH) {
+ Vector oids = new Vector();
+ Vector fieldoffset = new Vector();
+ Vector endoffset = new Vector();
+ int tuplecount = 0; //Keeps track of number of prefetch tuples that need to be generated
+ for(Iterator it = fpn.hspp.iterator();it.hasNext();) {
+ PrefetchPair pp = (PrefetchPair) it.next();
+ Integer statusbase = locality.getNodePreTempInfo(lb,fpn).get(pp.base);
+ /* Find prefetches that can generate oid */
+ if(statusbase == LocalityAnalysis.GLOBAL) {
+ generateTransCode(fm, lb, pp, oids, fieldoffset, endoffset, tuplecount, locality.getAtomic(lb).get(fpn).intValue()>0, false);
+ tuplecount++;
+ } else if (statusbase == LocalityAnalysis.LOCAL) {
+ generateTransCode(fm,lb,pp,oids,fieldoffset,endoffset,tuplecount,false,true);
+ } else {
+ continue;
+ }
+ }
+ if (tuplecount==0)
+ return;
+ output.println("{");
+ output.println("/* prefetch */");
+ output.println("/* prefetchid_" + fpn.siteid + " */");
+ output.println("void * prefptr;");
+ output.println("int tmpindex;");
+
+ output.println("if((evalPrefetch["+fpn.siteid+"].operMode) || (evalPrefetch["+fpn.siteid+"].retrycount <= 0)) {");
+ /*Create C code for oid array */
+ output.print(" unsigned int oidarray_[] = {");
+ boolean needcomma=false;
+ for (Iterator it = oids.iterator();it.hasNext();) {
+ if (needcomma)
+ output.print(", ");
+ output.print(it.next());
+ needcomma=true;
+ }
+ output.println("};");
+
+ /*Create C code for endoffset values */
+ output.print(" unsigned short endoffsetarry_[] = {");
+ needcomma=false;
+ for (Iterator it = endoffset.iterator();it.hasNext();) {
+ if (needcomma)
+ output.print(", ");
+ output.print(it.next());
+ needcomma=true;
+ }
+ output.println("};");
+
+ /*Create C code for Field Offset Values */
+ output.print(" short fieldarry_[] = {");
+ needcomma=false;
+ for (Iterator it = fieldoffset.iterator();it.hasNext();) {
+ if (needcomma)
+ output.print(", ");
+ output.print(it.next());
+ needcomma=true;
+ }
+ output.println("};");
+ /* make the prefetch call to Runtime */
+ output.println(" if(!evalPrefetch["+fpn.siteid+"].operMode) {");
+ output.println(" evalPrefetch["+fpn.siteid+"].retrycount = RETRYINTERVAL;");
+ output.println(" }");
+ output.println(" prefetch("+fpn.siteid+" ,"+tuplecount+", oidarray_, endoffsetarry_, fieldarry_);");
+ output.println(" } else {");
+ output.println(" evalPrefetch["+fpn.siteid+"].retrycount--;");
+ output.println(" }");
+ output.println("}");
+ }