test/compiler/testlibrary/rtm/MemoryConflictProvoker.java

Print this page




  52 
  53     public MemoryConflictProvoker(Object monitor) {
  54         super(monitor);
  55         barrier = new CyclicBarrier(2);
  56         conflictingThread = () -> {
  57             try {
  58                 barrier.await();
  59             } catch (Exception e) {
  60                 throw new RuntimeException(e);
  61             }
  62             for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) {
  63                 MemoryConflictProvoker.field++;
  64             }
  65         };
  66     }
  67 
  68     /**
  69      * Accesses and modifies memory region from within the transaction.
  70      */
  71     public void transactionalRegion() {
  72         try {
  73             barrier.await();
  74         } catch (InterruptedException | BrokenBarrierException e) {
  75             throw new RuntimeException(e);
  76         }
  77         for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) {
  78             synchronized(monitor) {
  79                 MemoryConflictProvoker.field--;
  80             }
  81         }
  82     }
  83 
  84     @Override
  85     public void forceAbort() {
  86         try {
  87             Thread t = new Thread(conflictingThread);
  88             t.start();





  89             transactionalRegion();
  90             t.join();
  91         } catch (Exception e) {
  92             throw new RuntimeException(e);
  93         }
  94     }
  95 
  96     @Override
  97     public String getMethodWithLockName() {
  98         return this.getClass().getName() + "::transactionalRegion";
  99     }
 100 }


  52 
  53     public MemoryConflictProvoker(Object monitor) {
  54         super(monitor);
  55         barrier = new CyclicBarrier(2);
  56         conflictingThread = () -> {
  57             try {
  58                 barrier.await();
  59             } catch (Exception e) {
  60                 throw new RuntimeException(e);
  61             }
  62             for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) {
  63                 MemoryConflictProvoker.field++;
  64             }
  65         };
  66     }
  67 
  68     /**
  69      * Accesses and modifies memory region from within the transaction.
  70      */
  71     public void transactionalRegion() {





  72         for (int i = 0; i < MemoryConflictProvoker.INNER_ITERATIONS; i++) {
  73             synchronized(monitor) {
  74                 MemoryConflictProvoker.field--;
  75             }
  76         }
  77     }
  78 
  79     @Override
  80     public void forceAbort() {
  81         try {
  82             Thread t = new Thread(conflictingThread);
  83             t.start();
  84             try {
  85                 barrier.await();
  86             } catch (InterruptedException | BrokenBarrierException e) {
  87                 throw new RuntimeException(e);
  88             }
  89             transactionalRegion();
  90             t.join();
  91         } catch (Exception e) {
  92             throw new RuntimeException(e);
  93         }
  94     }
  95 
  96     @Override
  97     public String getMethodWithLockName() {
  98         return this.getClass().getName() + "::transactionalRegion";
  99     }
 100 }