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