| 395 | } |
| 396 | |
| 397 | Object doGet(Ref ref){ |
| 398 | if(!info.running()) |
| 399 | throw retryex; |
| 400 | if(vals.containsKey(ref)) |
| 401 | return vals.get(ref); |
| 402 | try |
| 403 | { |
| 404 | ref.lock.readLock().lock(); |
| 405 | if(ref.tvals == null) |
| 406 | throw new IllegalStateException(ref.toString() + " is unbound."); |
| 407 | Ref.TVal ver = ref.tvals; |
| 408 | do |
| 409 | { |
| 410 | if(ver.point <= readPoint) |
| 411 | return ver.val; |
| 412 | } while((ver = ver.prior) != ref.tvals); |
| 413 | } |
| 414 | finally |
| 415 | { |
| 416 | ref.lock.readLock().unlock(); |
| 417 | } |
| 418 | //no version of val precedes the read point |
| 419 | ref.faults.incrementAndGet(); |
| 420 | throw retryex; |
| 421 | |
| 422 | } |
| 423 | |
| 424 | Object doSet(Ref ref, Object val){ |
| 425 | if(!info.running()) |