Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. class CFlowThreads implements Runnable {
  2. private static final int MAX_VALUE = 100;
  3. public static void main(String[] argv) {
  4. // Create a lot of threads
  5. int x = 0;
  6. while (x++ < 100) {
  7. new Thread(new CFlowThreads()).start();
  8. try {
  9. Thread.sleep((long)(Math.random()*100));
  10. } catch (Exception e) {}
  11. }
  12. }
  13. public boolean gotOne(int x) {
  14. // System.out.println("Succeeded, x = "+x);
  15. return true;
  16. }
  17. public boolean methodA(int x) {
  18. if (x % 2 == 0) return methodB(x+3);
  19. else return methodC(x/2);
  20. }
  21. public boolean methodB(int x) {
  22. if (x % 3 == 0) return methodC(x+4);
  23. else return methodA(x/3);
  24. }
  25. public boolean methodC(int x) {
  26. if (x > 2) return methodB(x-3);
  27. else return gotOne(x);
  28. }
  29. public boolean startIt(int x) {
  30. return methodA(x);
  31. }
  32. public void run() {
  33. startIt((int)(Math.random()*MAX_VALUE));
  34. }
  35. static aspect OriginalValue of eachcflow(OriginalValue.entrypoints(int)) {
  36. int recursioncount = 0;
  37. int original;
  38. pointcut entrypoints(int x):
  39. instanceof(CFlowThreads) && receptions(boolean startIt(x));
  40. before(int x): entrypoints(x) {
  41. original = x;
  42. }
  43. pointcut successes(int x):
  44. instanceof(CFlowThreads) && receptions(boolean gotOne(x));
  45. pointcut recursiveCalls(int x):
  46. instanceof(CFlowThreads) &&
  47. receptions(boolean *(x)) && !receptions(boolean gotOne(x));
  48. after(int x) returning (boolean s): successes(x) {
  49. // System.out.println("Started at "+original+", used "+recursioncount+" hops");
  50. }
  51. boolean fail(int x) {
  52. // System.out.println("Never gonna make it from "+original);
  53. return false;
  54. }
  55. around(int x) returns boolean: recursiveCalls(x) {
  56. if (recursioncount++ > 50) {
  57. return fail(x);
  58. } else {
  59. return(proceed(x));
  60. }
  61. }
  62. }
  63. static aspect CheckValues {
  64. static int[] hops = new int[MAX_VALUE];
  65. static after(int x, OriginalValue a) returning (boolean s):
  66. OriginalValue.successes(x) && hasaspect(a) {
  67. synchronized (hops) {
  68. if (hops[a.original] != 0) {
  69. if (hops[a.original] != a.recursioncount) {
  70. System.out.println("Error: "+a.original+" takes "+
  71. hops[a.original]+", not "+
  72. a.recursioncount+" hops.");
  73. }
  74. } else {
  75. hops[a.original] = a.recursioncount;
  76. }
  77. }
  78. }
  79. static after(int x, OriginalValue a) returning (boolean s):
  80. instanceof(a) && receptions(boolean fail(x)) {
  81. synchronized (hops) {
  82. if (hops[a.original] != 0 &&&& hops[a.original] != -1) {
  83. System.out.println("Error: "+a.original+" takes "+
  84. hops[a.original]+" hops, doesn't fail");
  85. } else {
  86. hops[a.original] = -1;
  87. }
  88. }
  89. }
  90. }
  91. }