(Ref ref)
| 125 | |
| 126 | //returns the most recent val |
| 127 | Object lock(Ref ref){ |
| 128 | //can't upgrade readLock, so release it |
| 129 | releaseIfEnsured(ref); |
| 130 | |
| 131 | boolean unlocked = true; |
| 132 | try |
| 133 | { |
| 134 | tryWriteLock(ref); |
| 135 | unlocked = false; |
| 136 | |
| 137 | if(ref.tvals != null && ref.tvals.point > readPoint) |
| 138 | throw retryex; |
| 139 | Info refinfo = ref.tinfo; |
| 140 | |
| 141 | //write lock conflict |
| 142 | if(refinfo != null && refinfo != info && refinfo.running()) |
| 143 | { |
| 144 | if(!barge(refinfo)) |
| 145 | { |
| 146 | ref.lock.writeLock().unlock(); |
| 147 | unlocked = true; |
| 148 | return blockAndBail(refinfo); |
| 149 | } |
| 150 | } |
| 151 | ref.tinfo = info; |
| 152 | return ref.tvals == null ? null : ref.tvals.val; |
| 153 | } |
| 154 | finally |
| 155 | { |
| 156 | if(!unlocked) |
| 157 | ref.lock.writeLock().unlock(); |
| 158 | } |
| 159 | } |
| 160 | |
| 161 | private Object blockAndBail(Info refinfo){ |
| 162 | //stop prior to blocking |
no test coverage detected