1 kkz 1.1.2.1 // ToAsync.java, created Thu Nov 11 12:41:56 1999 by kkz 2 cananian 1.1.2.32 // Copyright (C) 1999 Karen K. Zee <kkz@alum.mit.edu> 3 kkz 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 kkz 1.1.2.1 package harpoon.Analysis.EventDriven; 5 kkz 1.1.2.1 6 kkz 1.1.2.1 import harpoon.Analysis.AllCallers; 7 kkz 1.1.2.1 import harpoon.Analysis.ClassHierarchy; 8 bdemsky 1.1.2.16 import harpoon.Analysis.Quads.TypeInfo; 9 bdemsky 1.1.2.16 import harpoon.Analysis.Maps.TypeMap; 10 bdemsky 1.1.2.21 import harpoon.Analysis.MetaMethods.MetaAllCallers; 11 bdemsky 1.1.2.21 import harpoon.Analysis.MetaMethods.MetaCallGraph; 12 bdemsky 1.1.2.21 import harpoon.Analysis.MetaMethods.MetaCallGraphImpl; 13 bdemsky 1.1.2.21 import harpoon.Analysis.MetaMethods.MetaMethod; 14 bdemsky 1.1.2.4 import harpoon.Analysis.Quads.QuadLiveness; 15 kkz 1.1.2.1 import harpoon.Analysis.ContBuilder.ContBuilder; 16 kkz 1.1.2.1 import harpoon.Analysis.EnvBuilder.EnvBuilder; 17 salcianu 1.1.2.30 import harpoon.Util.DataStructs.Relation; 18 cananian 1.1.2.9 import harpoon.ClassFile.CachingCodeFactory; 19 bdemsky 1.1.2.21 import harpoon.ClassFile.HCodeFactory; 20 kkz 1.1.2.1 import harpoon.ClassFile.HClass; 21 kkz 1.1.2.1 import harpoon.ClassFile.HCode; 22 kkz 1.1.2.1 import harpoon.ClassFile.HMethod; 23 bdemsky 1.1.2.7 import harpoon.ClassFile.Loader; 24 bdemsky 1.1.2.7 import harpoon.ClassFile.Linker; 25 kkz 1.1.2.1 import harpoon.IR.Quads.Code; 26 kkz 1.1.2.1 import harpoon.IR.Quads.Quad; 27 bdemsky 1.1.2.16 import harpoon.IR.Quads.QuadSSI; 28 bdemsky 1.1.2.4 import harpoon.Temp.Temp; 29 salcianu 1.1.2.25 import harpoon.Util.BasicBlocks.BBConverter; 30 kkz 1.1.2.1 import harpoon.Util.HClassUtil; 31 kkz 1.1.2.1 import harpoon.Util.Util; 32 cananian 1.3 import net.cscott.jutil.WorkSet; 33 kkz 1.1.2.1 34 kkz 1.1.2.1 import java.util.HashMap; 35 kkz 1.1.2.2 import java.util.Iterator; 36 kkz 1.1.2.1 import java.util.ListIterator; 37 kkz 1.1.2.1 import java.util.Map; 38 kkz 1.1.2.1 import java.util.Set; 39 kkz 1.1.2.1 40 kkz 1.1.2.1 /** 41 kkz 1.1.2.1 * <code>ToAsync</code> 42 kkz 1.1.2.1 * 43 cananian 1.1.2.32 * @author Karen K. Zee <kkz@alum.mit.edu> 44 cananian 1.4 * @version $Id: ToAsync.java,v 1.4 2004/02/08 03:19:30 cananian Exp $ 45 kkz 1.1.2.1 */ 46 kkz 1.1.2.1 public class ToAsync { 47 cananian 1.1.2.9 protected final CachingCodeFactory ucf; 48 kkz 1.1.2.1 protected final HCode hc; 49 kkz 1.1.2.1 protected final ClassHierarchy ch; 50 bdemsky 1.1.2.7 protected final Linker linker; 51 bdemsky 1.1.2.20 protected boolean optimistic; 52 bdemsky 1.1.2.21 protected HCodeFactory hcf; 53 bdemsky 1.1.2.24 protected boolean recycle; 54 bdemsky 1.1.2.26 protected Set classes; 55 bdemsky 1.1.2.21 56 bdemsky 1.1.2.21 Set blockingmm; 57 bdemsky 1.1.2.21 MetaCallGraph mcg; 58 bdemsky 1.1.2.29 59 bdemsky 1.1.2.21 60 bdemsky 1.1.2.4 61 kkz 1.1.2.1 /** Creates a <code>ToAsync</code>. */ 62 bdemsky 1.1.2.26 public ToAsync(CachingCodeFactory ucf, HCode hc, ClassHierarchy ch, Linker linker, boolean optimistic, MetaCallGraph mcg, boolean recycle, Set classes) { 63 bdemsky 1.1.2.7 this.linker=linker; 64 kkz 1.1.2.1 this.ucf = ucf; 65 kkz 1.1.2.1 this.hc = hc; 66 kkz 1.1.2.1 this.ch = ch; 67 bdemsky 1.1.2.20 this.optimistic=optimistic; 68 bdemsky 1.1.2.21 this.mcg=mcg; 69 bdemsky 1.1.2.24 this.recycle=recycle; 70 bdemsky 1.1.2.26 this.classes=classes; 71 kkz 1.1.2.1 } 72 kkz 1.1.2.1 73 bdemsky 1.1.2.21 public void metaStuff(BMethod bm) { 74 bdemsky 1.1.2.21 //using hcf for now! 75 bdemsky 1.1.2.21 //BBConverter bbconv=new BBConverter(hcf); 76 bdemsky 1.1.2.21 //mcg=new MetaCallGraphImpl(bbconv, ch, hc.getMethod()); 77 bdemsky 1.1.2.21 MetaAllCallers mac=new MetaAllCallers(mcg); 78 bdemsky 1.1.2.21 HMethod[] bmethods=bm.blockingMethods(); 79 bdemsky 1.1.2.21 80 bdemsky 1.1.2.21 WorkSet mm=new WorkSet(); 81 bdemsky 1.1.2.21 Relation mrelation=mcg.getSplitRelation(); 82 bdemsky 1.1.2.21 for (int i=0;i<bmethods.length;i++) { 83 salcianu 1.1.2.30 mm.addAll(mrelation.getValues(bmethods[i])); 84 bdemsky 1.1.2.21 } 85 bdemsky 1.1.2.22 blockingmm=new WorkSet(mm); 86 bdemsky 1.1.2.21 for (Iterator i=mm.iterator();i.hasNext();) { 87 bdemsky 1.1.2.21 MetaMethod[] mma=mac.getTransCallers((MetaMethod)i.next()); 88 bdemsky 1.1.2.21 blockingmm.addAll(java.util.Arrays.asList(mma)); 89 bdemsky 1.1.2.22 } 90 bdemsky 1.1.2.22 for (Iterator i=blockingmm.iterator();i.hasNext();) { 91 bdemsky 1.1.2.22 System.out.println(i.next()+" BLOCKS"); 92 bdemsky 1.1.2.21 } 93 bdemsky 1.1.2.21 } 94 bdemsky 1.1.2.21 95 kkz 1.1.2.1 public HMethod transform() { 96 kkz 1.1.2.2 System.out.println("Entering ToAsync.transform()"); 97 bdemsky 1.1.2.21 Set blockingcalls; 98 bdemsky 1.1.2.21 99 bdemsky 1.1.2.20 AllCallers.MethodSet bm = optimistic?((AllCallers.MethodSet)new BlockingMethodsOpt(linker)):((AllCallers.MethodSet)new BlockingMethods(linker)); 100 bdemsky 1.1.2.21 101 bdemsky 1.1.2.21 if (mcg==null) { 102 bdemsky 1.1.2.21 AllCallers ac = new AllCallers(ch, ucf); 103 bdemsky 1.1.2.21 blockingcalls = ac.getCallers(bm); 104 bdemsky 1.1.2.21 105 bdemsky 1.1.2.21 } else { 106 bdemsky 1.1.2.21 107 bdemsky 1.1.2.21 metaStuff((BMethod)bm); 108 bdemsky 1.1.2.21 //CHEAP MetaHack... 109 bdemsky 1.1.2.21 //Real algorithm should work on a callsite basis. 110 bdemsky 1.1.2.21 blockingcalls=new WorkSet(); 111 cananian 1.4 for (Object mmO : blockingmm) { 112 cananian 1.4 MetaMethod mm = (MetaMethod) mmO; 113 bdemsky 1.1.2.21 blockingcalls.add(mm.getHMethod()); 114 bdemsky 1.1.2.21 } 115 bdemsky 1.1.2.21 } 116 bdemsky 1.1.2.15 117 bdemsky 1.1.2.4 HashMap old2new=new HashMap(); 118 bdemsky 1.1.2.4 HMethod nhm=AsyncCode.makeAsync(old2new, hc.getMethod(), 119 bdemsky 1.1.2.26 ucf,linker,optimistic); 120 bdemsky 1.1.2.15 121 bdemsky 1.1.2.4 WorkSet async_todo=new WorkSet(); 122 bdemsky 1.1.2.4 async_todo.push(hc); 123 bdemsky 1.1.2.11 124 bdemsky 1.1.2.10 WorkSet other=new WorkSet(); 125 bdemsky 1.1.2.10 WorkSet done_other=new WorkSet(); 126 bdemsky 1.1.2.10 127 bdemsky 1.1.2.10 while (!async_todo.isEmpty()|!other.isEmpty()) { 128 bdemsky 1.1.2.16 QuadSSI selone=null; 129 bdemsky 1.1.2.10 boolean status=false; 130 bdemsky 1.1.2.10 if (async_todo.isEmpty()) { 131 bdemsky 1.1.2.10 HMethod hm=(HMethod) other.pop(); 132 bdemsky 1.1.2.10 done_other.push(hm); 133 bdemsky 1.1.2.16 selone=(QuadSSI) ucf.convert(hm); 134 bdemsky 1.1.2.10 if (selone==null) 135 bdemsky 1.1.2.10 continue; 136 bdemsky 1.1.2.10 status=true; 137 bdemsky 1.1.2.10 } else 138 bdemsky 1.1.2.16 selone=(QuadSSI) async_todo.pop(); 139 bdemsky 1.1.2.4 final QuadLiveness ql = new QuadLiveness(selone); 140 bdemsky 1.1.2.16 final TypeMap typemap=new TypeInfo(selone); 141 bdemsky 1.1.2.17 142 bdemsky 1.1.2.6 System.out.println("ToAsync is running AsyncCode on "+selone); 143 bdemsky 1.1.2.4 AsyncCode.buildCode(selone, old2new, async_todo, 144 bdemsky 1.1.2.10 ql,blockingcalls,ucf, bm, hc.getMethod(), 145 bdemsky 1.1.2.24 linker,ch,other, done_other,status, typemap, 146 bdemsky 1.1.2.26 optimistic,recycle,classes); 147 kkz 1.1.2.1 } 148 bdemsky 1.1.2.4 return nhm; 149 kkz 1.1.2.1 } 150 kkz 1.1.2.1 151 bdemsky 1.1.2.20 152 bdemsky 1.1.2.20 153 bdemsky 1.1.2.20 static class BlockingMethods implements AllCallers.MethodSet,BMethod { 154 bdemsky 1.1.2.7 final Linker linker; 155 bdemsky 1.1.2.7 public BlockingMethods(Linker linker) { 156 bdemsky 1.1.2.7 this.linker=linker; 157 bdemsky 1.1.2.7 } 158 kkz 1.1.2.1 159 kkz 1.1.2.1 /** Returns true if the <code>HMethod</code> blocks, false 160 kkz 1.1.2.1 * otherwise. Checks against a list of known blocking methods. 161 kkz 1.1.2.1 */ 162 kkz 1.1.2.1 public boolean select (final HMethod m) { 163 kkz 1.1.2.2 if (swop(m) != null) { 164 kkz 1.1.2.2 System.out.println(m.toString()); 165 kkz 1.1.2.1 return true; 166 kkz 1.1.2.2 } else 167 kkz 1.1.2.1 return false; 168 kkz 1.1.2.1 } 169 kkz 1.1.2.1 170 kkz 1.1.2.1 /** Returns the corresponding asynchronous method for a given 171 kkz 1.1.2.1 * blocking method if one exists. 172 kkz 1.1.2.1 */ 173 kkz 1.1.2.1 final private Map cache = new HashMap(); 174 bdemsky 1.1.2.21 175 bdemsky 1.1.2.21 public HMethod[] blockingMethods() { 176 bdemsky 1.1.2.21 final HClass is = linker.forName("java.io.InputStream"); 177 bdemsky 1.1.2.21 final HClass fis = linker.forName("java.io.FileInputStream"); 178 bdemsky 1.1.2.21 final HClass os = linker.forName("java.io.OutputStream"); 179 bdemsky 1.1.2.21 final HClass fos = linker.forName("java.io.FileOutputStream"); 180 bdemsky 1.1.2.21 final HClass ss = linker.forName("java.net.ServerSocket"); 181 bdemsky 1.1.2.21 final HClass fd = linker.forName("java.io.FileDescriptor"); 182 bdemsky 1.1.2.21 final HClass b = HClass.Byte; 183 bdemsky 1.1.2.21 final HClass HCthrd = linker.forName("java.lang.Thread"); 184 bdemsky 1.1.2.21 185 bdemsky 1.1.2.21 return new HMethod[] { 186 bdemsky 1.1.2.28 fd.getMethod("sync", new HClass[0]), 187 bdemsky 1.1.2.28 is.getMethod("skip", new HClass[]{HClass.Long}), 188 bdemsky 1.1.2.21 HCthrd.getMethod("join", new HClass[0]), 189 bdemsky 1.1.2.21 190 bdemsky 1.1.2.21 is.getDeclaredMethod("read", new HClass[0]), 191 bdemsky 1.1.2.21 192 bdemsky 1.1.2.21 is.getDeclaredMethod("read", 193 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}), 194 bdemsky 1.1.2.21 195 bdemsky 1.1.2.21 is.getDeclaredMethod("read", 196 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 197 bdemsky 1.1.2.21 HClass.Int, HClass.Int}), 198 bdemsky 1.1.2.21 199 bdemsky 1.1.2.21 fis.getDeclaredMethod("read", new HClass[0]), 200 bdemsky 1.1.2.21 201 bdemsky 1.1.2.21 fis.getDeclaredMethod("read", 202 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}), 203 bdemsky 1.1.2.21 204 bdemsky 1.1.2.21 fis.getDeclaredMethod("read", 205 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 206 bdemsky 1.1.2.21 HClass.Int, HClass.Int}), 207 bdemsky 1.1.2.21 208 bdemsky 1.1.2.28 os.getDeclaredMethod("write", new HClass[]{HClass.Int}), 209 bdemsky 1.1.2.21 210 bdemsky 1.1.2.28 os.getDeclaredMethod("write", 211 bdemsky 1.1.2.28 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}), 212 bdemsky 1.1.2.21 213 bdemsky 1.1.2.28 os.getDeclaredMethod("write", 214 bdemsky 1.1.2.28 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 215 bdemsky 1.1.2.28 HClass.Int, HClass.Int}), 216 bdemsky 1.1.2.21 217 bdemsky 1.1.2.28 fos.getDeclaredMethod("write", new HClass[]{HClass.Int}), 218 bdemsky 1.1.2.21 219 bdemsky 1.1.2.28 fos.getDeclaredMethod("write", 220 bdemsky 1.1.2.28 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}), 221 bdemsky 1.1.2.21 222 bdemsky 1.1.2.28 fos.getDeclaredMethod("write", 223 bdemsky 1.1.2.28 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 224 bdemsky 1.1.2.28 HClass.Int, HClass.Int}), 225 bdemsky 1.1.2.21 226 bdemsky 1.1.2.21 ss.getDeclaredMethod("accept", new HClass[0]) 227 bdemsky 1.1.2.21 }; 228 bdemsky 1.1.2.21 } 229 bdemsky 1.1.2.21 230 kkz 1.1.2.1 public HMethod swop (final HMethod m) { 231 bdemsky 1.1.2.7 final HClass is = linker.forName("java.io.InputStream"); 232 bdemsky 1.1.2.14 final HClass fis = linker.forName("java.io.FileInputStream"); 233 bdemsky 1.1.2.18 final HClass os = linker.forName("java.io.OutputStream"); 234 bdemsky 1.1.2.18 final HClass fos = linker.forName("java.io.FileOutputStream"); 235 bdemsky 1.1.2.7 final HClass ss = linker.forName("java.net.ServerSocket"); 236 bdemsky 1.1.2.18 final HClass fd = linker.forName("java.io.FileDescriptor"); 237 kkz 1.1.2.2 final HClass b = HClass.Byte; 238 bdemsky 1.1.2.13 final HClass HCthrd = linker.forName("java.lang.Thread"); 239 kkz 1.1.2.1 240 kkz 1.1.2.1 HMethod retval = (HMethod)cache.get(m); 241 kkz 1.1.2.1 if (retval == null) { 242 bdemsky 1.1.2.28 if(m.equals(fd.getMethod("sync", 243 bdemsky 1.1.2.18 new HClass[0]))) { 244 bdemsky 1.1.2.18 retval=fd.getMethod("syncAsync", new HClass[0]); 245 bdemsky 1.1.2.18 cache.put(m,retval); 246 bdemsky 1.1.2.18 } else if (m.equals(is.getMethod("skip", 247 bdemsky 1.1.2.19 new HClass[]{HClass.Long}))) { 248 bdemsky 1.1.2.19 retval=is.getMethod("skipAsync", new HClass[]{HClass.Long}); 249 bdemsky 1.1.2.18 cache.put(m,retval); 250 bdemsky 1.1.2.28 } else if (m.equals(HCthrd.getMethod("join", 251 bdemsky 1.1.2.28 new HClass[0]))) { 252 bdemsky 1.1.2.28 retval=HCthrd.getMethod("join_Async", 253 bdemsky 1.1.2.13 new HClass[0]); 254 bdemsky 1.1.2.13 cache.put(m, retval); 255 bdemsky 1.1.2.13 } else if (is.equals(m.getDeclaringClass())) { 256 kkz 1.1.2.1 if (m.getName().equals("read")) { 257 kkz 1.1.2.1 final HMethod bm1 = 258 kkz 1.1.2.1 is.getDeclaredMethod("read", new HClass[0]); 259 kkz 1.1.2.1 final HMethod bm2 = is.getDeclaredMethod("read", 260 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 261 kkz 1.1.2.1 final HMethod bm3 = is.getDeclaredMethod("read", 262 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 263 kkz 1.1.2.1 HClass.Int, HClass.Int}); 264 kkz 1.1.2.2 if (bm1.equals(m)) { 265 kkz 1.1.2.2 retval = is.getMethod("readAsync", 266 kkz 1.1.2.2 new HClass[0]); 267 kkz 1.1.2.1 cache.put(m, retval); 268 kkz 1.1.2.2 } else if (bm2.equals(m)) { 269 kkz 1.1.2.2 retval = is.getMethod("readAsync", 270 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 271 kkz 1.1.2.1 cache.put(m, retval); 272 kkz 1.1.2.2 } else if (bm3.equals(m)) { 273 kkz 1.1.2.2 retval = is.getMethod("readAsync", 274 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 275 bdemsky 1.1.2.14 HClass.Int, HClass.Int}); 276 bdemsky 1.1.2.14 cache.put(m, retval); 277 bdemsky 1.1.2.14 } 278 bdemsky 1.1.2.14 } 279 bdemsky 1.1.2.14 } else if (fis.equals(m.getDeclaringClass())) { 280 bdemsky 1.1.2.14 if (m.getName().equals("read")) { 281 bdemsky 1.1.2.14 final HMethod bm1 = 282 bdemsky 1.1.2.14 fis.getDeclaredMethod("read", new HClass[0]); 283 bdemsky 1.1.2.14 final HMethod bm2 = fis.getDeclaredMethod("read", 284 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 285 bdemsky 1.1.2.14 final HMethod bm3 = fis.getDeclaredMethod("read", 286 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 287 bdemsky 1.1.2.14 HClass.Int, HClass.Int}); 288 bdemsky 1.1.2.14 if (bm1.equals(m)) { 289 bdemsky 1.1.2.14 retval = fis.getMethod("readAsync", 290 bdemsky 1.1.2.14 new HClass[0]); 291 bdemsky 1.1.2.14 cache.put(m, retval); 292 bdemsky 1.1.2.14 } else if (bm2.equals(m)) { 293 bdemsky 1.1.2.14 retval = fis.getMethod("readAsync", 294 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 295 bdemsky 1.1.2.14 cache.put(m, retval); 296 bdemsky 1.1.2.14 } else if (bm3.equals(m)) { 297 bdemsky 1.1.2.14 retval = fis.getMethod("readAsync", 298 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 299 bdemsky 1.1.2.18 HClass.Int, HClass.Int}); 300 bdemsky 1.1.2.18 cache.put(m, retval); 301 bdemsky 1.1.2.18 } 302 bdemsky 1.1.2.18 } 303 bdemsky 1.1.2.28 } else if (os.equals(m.getDeclaringClass())){ 304 bdemsky 1.1.2.18 if (m.getName().equals("write")) { 305 bdemsky 1.1.2.18 final HMethod bm1 = 306 bdemsky 1.1.2.18 os.getDeclaredMethod("write", new HClass[]{HClass.Int}); 307 bdemsky 1.1.2.18 final HMethod bm2 = 308 bdemsky 1.1.2.18 os.getDeclaredMethod("write", 309 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 310 bdemsky 1.1.2.18 final HMethod bm3 = 311 bdemsky 1.1.2.18 os.getDeclaredMethod("write", 312 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 313 bdemsky 1.1.2.18 HClass.Int, HClass.Int}); 314 bdemsky 1.1.2.18 if (bm1.equals(m)) { 315 bdemsky 1.1.2.18 retval = os.getMethod("writeAsync", 316 bdemsky 1.1.2.18 new HClass[] {HClass.Int}); 317 bdemsky 1.1.2.18 cache.put(m, retval); 318 bdemsky 1.1.2.18 } else if (bm2.equals(m)) { 319 bdemsky 1.1.2.18 retval = os.getMethod("writeAsync", 320 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 321 bdemsky 1.1.2.18 cache.put(m, retval); 322 bdemsky 1.1.2.18 } else if (bm3.equals(m)) { 323 bdemsky 1.1.2.18 retval = os.getMethod("writeAsync", 324 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 325 bdemsky 1.1.2.18 HClass.Int, HClass.Int}); 326 bdemsky 1.1.2.18 cache.put(m, retval); 327 bdemsky 1.1.2.18 } 328 bdemsky 1.1.2.18 } 329 bdemsky 1.1.2.18 } else if (fos.equals(m.getDeclaringClass())){ 330 bdemsky 1.1.2.18 if (m.getName().equals("write")) { 331 bdemsky 1.1.2.18 final HMethod bm1 = 332 bdemsky 1.1.2.18 fos.getDeclaredMethod("write", new HClass[]{HClass.Int}); 333 bdemsky 1.1.2.18 final HMethod bm2 = 334 bdemsky 1.1.2.18 fos.getDeclaredMethod("write", 335 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 336 bdemsky 1.1.2.18 final HMethod bm3 = 337 bdemsky 1.1.2.18 fos.getDeclaredMethod("write", 338 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 339 bdemsky 1.1.2.18 HClass.Int, HClass.Int}); 340 bdemsky 1.1.2.18 if (bm1.equals(m)) { 341 bdemsky 1.1.2.18 retval = fos.getMethod("writeAsync", 342 bdemsky 1.1.2.18 new HClass[]{HClass.Int}); 343 bdemsky 1.1.2.18 cache.put(m, retval); 344 bdemsky 1.1.2.18 } else if (bm2.equals(m)) { 345 bdemsky 1.1.2.18 retval = fos.getMethod("writeAsync", 346 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 347 bdemsky 1.1.2.18 cache.put(m, retval); 348 bdemsky 1.1.2.18 } else if (bm3.equals(m)) { 349 bdemsky 1.1.2.18 retval = fos.getMethod("writeAsync", 350 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 351 kkz 1.1.2.1 HClass.Int, HClass.Int}); 352 kkz 1.1.2.1 cache.put(m, retval); 353 kkz 1.1.2.1 } 354 kkz 1.1.2.1 } 355 bdemsky 1.1.2.28 } else if (ss.equals(m.getDeclaringClass())) { 356 kkz 1.1.2.1 final HMethod bm4 = 357 kkz 1.1.2.1 ss.getDeclaredMethod("accept", new HClass[0]); 358 kkz 1.1.2.2 if (bm4.equals(m)) { 359 kkz 1.1.2.1 retval = ss.getDeclaredMethod("acceptAsync", 360 kkz 1.1.2.1 new HClass[0]); 361 kkz 1.1.2.1 cache.put(m, retval); 362 kkz 1.1.2.1 } 363 kkz 1.1.2.1 } 364 kkz 1.1.2.1 } 365 kkz 1.1.2.1 return retval; 366 kkz 1.1.2.1 } // swop 367 kkz 1.1.2.1 368 kkz 1.1.2.1 } // BlockingMethods 369 bdemsky 1.1.2.20 370 bdemsky 1.1.2.20 static class BlockingMethodsOpt implements AllCallers.MethodSet,BMethod { 371 bdemsky 1.1.2.20 final Linker linker; 372 bdemsky 1.1.2.20 public BlockingMethodsOpt(Linker linker) { 373 bdemsky 1.1.2.20 this.linker=linker; 374 bdemsky 1.1.2.20 } 375 bdemsky 1.1.2.20 376 bdemsky 1.1.2.20 /** Returns true if the <code>HMethod</code> blocks, false 377 bdemsky 1.1.2.20 * otherwise. Checks against a list of known blocking methods. 378 bdemsky 1.1.2.20 */ 379 bdemsky 1.1.2.20 public boolean select (final HMethod m) { 380 bdemsky 1.1.2.20 if (swop(m) != null) { 381 bdemsky 1.1.2.20 System.out.println(m.toString()); 382 bdemsky 1.1.2.20 return true; 383 bdemsky 1.1.2.20 } else 384 bdemsky 1.1.2.20 return false; 385 bdemsky 1.1.2.21 } 386 bdemsky 1.1.2.21 387 bdemsky 1.1.2.21 388 bdemsky 1.1.2.21 public HMethod[] blockingMethods() { 389 bdemsky 1.1.2.21 final HClass is = linker.forName("java.io.InputStream"); 390 bdemsky 1.1.2.21 final HClass fis = linker.forName("java.io.FileInputStream"); 391 bdemsky 1.1.2.21 final HClass os = linker.forName("java.io.OutputStream"); 392 bdemsky 1.1.2.21 final HClass fos = linker.forName("java.io.FileOutputStream"); 393 bdemsky 1.1.2.21 final HClass ss = linker.forName("java.net.ServerSocket"); 394 bdemsky 1.1.2.21 final HClass fd = linker.forName("java.io.FileDescriptor"); 395 bdemsky 1.1.2.21 final HClass b = HClass.Byte; 396 bdemsky 1.1.2.21 final HClass HCthrd = linker.forName("java.lang.Thread"); 397 bdemsky 1.1.2.21 398 bdemsky 1.1.2.21 return new HMethod[] { 399 bdemsky 1.1.2.28 fd.getMethod("sync", new HClass[0]), 400 bdemsky 1.1.2.28 is.getMethod("skip", new HClass[]{HClass.Long}), 401 bdemsky 1.1.2.21 HCthrd.getMethod("join", new HClass[0]), 402 bdemsky 1.1.2.21 403 bdemsky 1.1.2.21 is.getDeclaredMethod("read", new HClass[0]), 404 bdemsky 1.1.2.21 405 bdemsky 1.1.2.21 is.getDeclaredMethod("read", 406 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}), 407 bdemsky 1.1.2.21 408 bdemsky 1.1.2.21 is.getDeclaredMethod("read", 409 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 410 bdemsky 1.1.2.21 HClass.Int, HClass.Int}), 411 bdemsky 1.1.2.21 412 bdemsky 1.1.2.21 fis.getDeclaredMethod("read", new HClass[0]), 413 bdemsky 1.1.2.21 414 bdemsky 1.1.2.21 fis.getDeclaredMethod("read", 415 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}), 416 bdemsky 1.1.2.21 417 bdemsky 1.1.2.21 fis.getDeclaredMethod("read", 418 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 419 bdemsky 1.1.2.21 HClass.Int, HClass.Int}), 420 bdemsky 1.1.2.21 421 bdemsky 1.1.2.28 os.getDeclaredMethod("write", new HClass[]{HClass.Int}), 422 bdemsky 1.1.2.21 423 bdemsky 1.1.2.23 os.getDeclaredMethod("write", 424 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}), 425 bdemsky 1.1.2.21 426 bdemsky 1.1.2.23 os.getDeclaredMethod("write", 427 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 428 bdemsky 1.1.2.23 HClass.Int, HClass.Int}), 429 bdemsky 1.1.2.21 430 bdemsky 1.1.2.23 fos.getDeclaredMethod("write", new HClass[]{HClass.Int}), 431 bdemsky 1.1.2.21 432 bdemsky 1.1.2.23 fos.getDeclaredMethod("write", 433 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}), 434 bdemsky 1.1.2.21 435 bdemsky 1.1.2.23 fos.getDeclaredMethod("write", 436 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 437 bdemsky 1.1.2.23 HClass.Int, HClass.Int}), 438 bdemsky 1.1.2.28 ss.getDeclaredMethod("accept", new HClass[0]) 439 bdemsky 1.1.2.21 }; 440 bdemsky 1.1.2.20 } 441 bdemsky 1.1.2.20 442 bdemsky 1.1.2.20 /** Returns the corresponding asynchronous method for a given 443 bdemsky 1.1.2.20 * blocking method if one exists. 444 bdemsky 1.1.2.20 */ 445 bdemsky 1.1.2.20 final private Map cache = new HashMap(); 446 bdemsky 1.1.2.20 public HMethod swop (final HMethod m) { 447 bdemsky 1.1.2.20 final HClass is = linker.forName("java.io.InputStream"); 448 bdemsky 1.1.2.20 final HClass fis = linker.forName("java.io.FileInputStream"); 449 bdemsky 1.1.2.20 final HClass os = linker.forName("java.io.OutputStream"); 450 bdemsky 1.1.2.20 final HClass fos = linker.forName("java.io.FileOutputStream"); 451 bdemsky 1.1.2.20 final HClass ss = linker.forName("java.net.ServerSocket"); 452 bdemsky 1.1.2.20 final HClass fd = linker.forName("java.io.FileDescriptor"); 453 bdemsky 1.1.2.20 final HClass b = HClass.Byte; 454 bdemsky 1.1.2.20 final HClass HCthrd = linker.forName("java.lang.Thread"); 455 bdemsky 1.1.2.20 456 bdemsky 1.1.2.20 HMethod retval = (HMethod)cache.get(m); 457 bdemsky 1.1.2.20 if (retval == null) { 458 bdemsky 1.1.2.28 if(m.equals(fd.getMethod("sync", 459 bdemsky 1.1.2.20 new HClass[0]))) { 460 bdemsky 1.1.2.20 retval=fd.getMethod("syncAsyncO", new HClass[0]); 461 bdemsky 1.1.2.20 cache.put(m,retval); 462 bdemsky 1.1.2.20 } else if (m.equals(is.getMethod("skip", 463 bdemsky 1.1.2.20 new HClass[]{HClass.Long}))) { 464 bdemsky 1.1.2.20 retval=is.getMethod("skipAsyncO", new HClass[]{HClass.Long}); 465 bdemsky 1.1.2.20 cache.put(m,retval); 466 bdemsky 1.1.2.28 } else if (m.equals(HCthrd.getMethod("join", 467 bdemsky 1.1.2.20 new HClass[0]))) { 468 bdemsky 1.1.2.20 retval=HCthrd.getMethod("join_AsyncO", 469 bdemsky 1.1.2.20 new HClass[0]); 470 bdemsky 1.1.2.20 471 bdemsky 1.1.2.20 cache.put(m, retval); 472 bdemsky 1.1.2.20 } else if (is.equals(m.getDeclaringClass())) { 473 bdemsky 1.1.2.20 if (m.getName().equals("read")) { 474 bdemsky 1.1.2.20 final HMethod bm1 = 475 bdemsky 1.1.2.20 is.getDeclaredMethod("read", new HClass[0]); 476 bdemsky 1.1.2.20 final HMethod bm2 = is.getDeclaredMethod("read", 477 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker,b, 1)}); 478 bdemsky 1.1.2.20 final HMethod bm3 = is.getDeclaredMethod("read", 479 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 480 bdemsky 1.1.2.20 HClass.Int, HClass.Int}); 481 bdemsky 1.1.2.20 if (bm1.equals(m)) { 482 bdemsky 1.1.2.20 retval = is.getMethod("readAsyncO", 483 bdemsky 1.1.2.20 new HClass[0]); 484 bdemsky 1.1.2.20 cache.put(m, retval); 485 bdemsky 1.1.2.20 } else if (bm2.equals(m)) { 486 bdemsky 1.1.2.20 retval = is.getMethod("readAsyncO", 487 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 488 bdemsky 1.1.2.20 cache.put(m, retval); 489 bdemsky 1.1.2.20 } else if (bm3.equals(m)) { 490 bdemsky 1.1.2.20 retval = is.getMethod("readAsyncO", 491 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 492 bdemsky 1.1.2.20 HClass.Int, HClass.Int}); 493 bdemsky 1.1.2.20 cache.put(m, retval); 494 bdemsky 1.1.2.20 } 495 bdemsky 1.1.2.20 } 496 bdemsky 1.1.2.20 } else if (fis.equals(m.getDeclaringClass())) { 497 bdemsky 1.1.2.20 if (m.getName().equals("read")) { 498 bdemsky 1.1.2.20 final HMethod bm1 = 499 bdemsky 1.1.2.20 fis.getDeclaredMethod("read", new HClass[0]); 500 bdemsky 1.1.2.20 final HMethod bm2 = fis.getDeclaredMethod("read", 501 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 502 bdemsky 1.1.2.20 final HMethod bm3 = fis.getDeclaredMethod("read", 503 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 504 bdemsky 1.1.2.20 HClass.Int, HClass.Int}); 505 bdemsky 1.1.2.20 if (bm1.equals(m)) { 506 bdemsky 1.1.2.20 retval = fis.getMethod("readAsyncO", 507 bdemsky 1.1.2.20 new HClass[0]); 508 bdemsky 1.1.2.20 cache.put(m, retval); 509 bdemsky 1.1.2.20 } else if (bm2.equals(m)) { 510 bdemsky 1.1.2.20 retval = fis.getMethod("readAsyncO", 511 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 512 bdemsky 1.1.2.20 cache.put(m, retval); 513 bdemsky 1.1.2.20 } else if (bm3.equals(m)) { 514 bdemsky 1.1.2.20 retval = fis.getMethod("readAsyncO", 515 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 516 bdemsky 1.1.2.20 HClass.Int, HClass.Int}); 517 bdemsky 1.1.2.20 cache.put(m, retval); 518 bdemsky 1.1.2.20 } 519 bdemsky 1.1.2.20 } 520 bdemsky 1.1.2.28 } else if (os.equals(m.getDeclaringClass())){ 521 bdemsky 1.1.2.20 if (m.getName().equals("write")) { 522 bdemsky 1.1.2.20 final HMethod bm1 = 523 bdemsky 1.1.2.20 os.getDeclaredMethod("write", new HClass[]{HClass.Int}); 524 bdemsky 1.1.2.20 final HMethod bm2 = 525 bdemsky 1.1.2.20 os.getDeclaredMethod("write", 526 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 527 bdemsky 1.1.2.20 final HMethod bm3 = 528 bdemsky 1.1.2.20 os.getDeclaredMethod("write", 529 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 530 bdemsky 1.1.2.20 HClass.Int, HClass.Int}); 531 bdemsky 1.1.2.20 if (bm1.equals(m)) { 532 bdemsky 1.1.2.20 retval = os.getMethod("writeAsyncO", 533 bdemsky 1.1.2.20 new HClass[] {HClass.Int}); 534 bdemsky 1.1.2.20 cache.put(m, retval); 535 bdemsky 1.1.2.20 } else if (bm2.equals(m)) { 536 bdemsky 1.1.2.20 retval = os.getMethod("writeAsyncO", 537 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 538 bdemsky 1.1.2.20 cache.put(m, retval); 539 bdemsky 1.1.2.20 } else if (bm3.equals(m)) { 540 bdemsky 1.1.2.20 retval = os.getMethod("writeAsyncO", 541 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 542 bdemsky 1.1.2.20 HClass.Int, HClass.Int}); 543 bdemsky 1.1.2.20 cache.put(m, retval); 544 bdemsky 1.1.2.20 } 545 bdemsky 1.1.2.20 } 546 bdemsky 1.1.2.20 } else if (fos.equals(m.getDeclaringClass())){ 547 bdemsky 1.1.2.20 if (m.getName().equals("write")) { 548 bdemsky 1.1.2.20 final HMethod bm1 = 549 bdemsky 1.1.2.20 fos.getDeclaredMethod("write", new HClass[]{HClass.Int}); 550 bdemsky 1.1.2.20 final HMethod bm2 = 551 bdemsky 1.1.2.20 fos.getDeclaredMethod("write", 552 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 553 bdemsky 1.1.2.20 final HMethod bm3 = 554 bdemsky 1.1.2.20 fos.getDeclaredMethod("write", 555 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 556 bdemsky 1.1.2.20 HClass.Int, HClass.Int}); 557 bdemsky 1.1.2.20 if (bm1.equals(m)) { 558 bdemsky 1.1.2.20 retval = fos.getMethod("writeAsyncO", 559 bdemsky 1.1.2.20 new HClass[]{HClass.Int}); 560 bdemsky 1.1.2.20 cache.put(m, retval); 561 bdemsky 1.1.2.20 } else if (bm2.equals(m)) { 562 bdemsky 1.1.2.20 retval = fos.getMethod("writeAsyncO", 563 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1)}); 564 bdemsky 1.1.2.20 cache.put(m, retval); 565 bdemsky 1.1.2.20 } else if (bm3.equals(m)) { 566 bdemsky 1.1.2.20 retval = fos.getMethod("writeAsyncO", 567 cananian 1.1.2.27 new HClass[] {HClassUtil.arrayClass(linker, b, 1), 568 bdemsky 1.1.2.20 HClass.Int, HClass.Int}); 569 bdemsky 1.1.2.20 cache.put(m, retval); 570 bdemsky 1.1.2.20 } 571 bdemsky 1.1.2.20 } 572 bdemsky 1.1.2.28 } else if (ss.equals(m.getDeclaringClass())) { 573 bdemsky 1.1.2.20 final HMethod bm4 = 574 bdemsky 1.1.2.20 ss.getDeclaredMethod("accept", new HClass[0]); 575 bdemsky 1.1.2.20 if (bm4.equals(m)) { 576 bdemsky 1.1.2.20 retval = ss.getDeclaredMethod("acceptAsyncO", 577 bdemsky 1.1.2.20 new HClass[0]); 578 bdemsky 1.1.2.20 cache.put(m, retval); 579 bdemsky 1.1.2.20 } 580 bdemsky 1.1.2.20 } 581 bdemsky 1.1.2.20 } 582 bdemsky 1.1.2.20 return retval; 583 bdemsky 1.1.2.20 } // swop 584 bdemsky 1.1.2.20 585 bdemsky 1.1.2.20 } // BlockingMethodsOpt 586 kkz 1.1.2.1 587 kkz 1.1.2.1 } // ToAsync 588 bdemsky 1.1.2.28 589 bdemsky 1.1.2.4 590 cananian 1.2