Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/RevlogStream.java @ 520:1ee452f31187
Experimental support for inverse direction history walking. Refactored/streamlined cancellation in HgLogCommand and down the stack
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 21 Dec 2012 21:20:26 +0100 |
| parents | 299870249a28 |
| children | 0f6fa88e2162 |
comparison
equal
deleted
inserted
replaced
| 519:934037edbea0 | 520:1ee452f31187 |
|---|---|
| 27 import org.tmatesoft.hg.repo.HgInternals; | 27 import org.tmatesoft.hg.repo.HgInternals; |
| 28 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 28 import org.tmatesoft.hg.repo.HgInvalidControlFileException; |
| 29 import org.tmatesoft.hg.repo.HgInvalidRevisionException; | 29 import org.tmatesoft.hg.repo.HgInvalidRevisionException; |
| 30 import org.tmatesoft.hg.repo.HgInvalidStateException; | 30 import org.tmatesoft.hg.repo.HgInvalidStateException; |
| 31 import org.tmatesoft.hg.repo.HgRepository; | 31 import org.tmatesoft.hg.repo.HgRepository; |
| 32 import org.tmatesoft.hg.util.Adaptable; | |
| 32 | 33 |
| 33 | 34 |
| 34 /** | 35 /** |
| 35 * ? Single RevlogStream per file per repository with accessor to record access session (e.g. with back/forward operations), | 36 * ? Single RevlogStream per file per repository with accessor to record access session (e.g. with back/forward operations), |
| 36 * or numerous RevlogStream with separate representation of the underlying data (cached, lazy ChunkStream)? | 37 * or numerous RevlogStream with separate representation of the underlying data (cached, lazy ChunkStream)? |
| 380 class ReaderN1 { | 381 class ReaderN1 { |
| 381 private final Inspector inspector; | 382 private final Inspector inspector; |
| 382 private final boolean needData; | 383 private final boolean needData; |
| 383 private DataAccess daIndex = null, daData = null; | 384 private DataAccess daIndex = null, daData = null; |
| 384 private Lifecycle.BasicCallback cb = null; | 385 private Lifecycle.BasicCallback cb = null; |
| 386 private Lifecycle lifecycleListener = null; | |
| 385 private int lastRevisionRead = BAD_REVISION; | 387 private int lastRevisionRead = BAD_REVISION; |
| 386 private DataAccess lastUserData; | 388 private DataAccess lastUserData; |
| 387 // next are to track two major bottlenecks - patch application and actual time spent in inspector | 389 // next are to track two major bottlenecks - patch application and actual time spent in inspector |
| 388 // private long applyTime, inspectorTime; // TIMING | 390 // private long applyTime, inspectorTime; // TIMING |
| 389 | 391 |
| 397 public void start(int totalWork) { | 399 public void start(int totalWork) { |
| 398 daIndex = getIndexStream(); | 400 daIndex = getIndexStream(); |
| 399 if (needData && !inline) { | 401 if (needData && !inline) { |
| 400 daData = getDataStream(); | 402 daData = getDataStream(); |
| 401 } | 403 } |
| 402 if (inspector instanceof Lifecycle) { | 404 lifecycleListener = Adaptable.Factory.getAdapter(inspector, Lifecycle.class, null); |
| 405 if (lifecycleListener != null) { | |
| 403 cb = new Lifecycle.BasicCallback(); | 406 cb = new Lifecycle.BasicCallback(); |
| 404 ((Lifecycle) inspector).start(totalWork, cb, cb); | 407 lifecycleListener.start(totalWork, cb, cb); |
| 405 } | 408 } |
| 406 // applyTime = inspectorTime = 0; // TIMING | 409 // applyTime = inspectorTime = 0; // TIMING |
| 407 } | 410 } |
| 408 | 411 |
| 412 // invoked only once per instance | |
| 409 public void finish() { | 413 public void finish() { |
| 410 if (lastUserData != null) { | 414 if (lastUserData != null) { |
| 411 lastUserData.done(); | 415 lastUserData.done(); |
| 412 lastUserData = null; | 416 lastUserData = null; |
| 413 } | 417 } |
| 414 if (inspector instanceof Lifecycle) { | 418 if (lifecycleListener != null) { |
| 415 ((Lifecycle) inspector).finish(cb); | 419 lifecycleListener.finish(cb); |
| 420 lifecycleListener = null; | |
| 421 cb = null; | |
| 422 | |
| 416 } | 423 } |
| 417 daIndex.done(); | 424 daIndex.done(); |
| 418 if (daData != null) { | 425 if (daData != null) { |
| 419 daData.done(); | 426 daData.done(); |
| 427 daData = null; | |
| 420 } | 428 } |
| 421 // System.out.printf("applyTime:%d ms, inspectorTime: %d ms\n", applyTime, inspectorTime); // TIMING | 429 // System.out.printf("applyTime:%d ms, inspectorTime: %d ms\n", applyTime, inspectorTime); // TIMING |
| 422 } | 430 } |
| 423 | 431 |
| 432 // may be invoked few times per instance life | |
| 424 public boolean range(int start, int end) throws IOException { | 433 public boolean range(int start, int end) throws IOException { |
| 425 byte[] nodeidBuf = new byte[20]; | 434 byte[] nodeidBuf = new byte[20]; |
| 426 int i; | 435 int i; |
| 427 // it (i.e. replace with i >= start) | 436 // it (i.e. replace with i >= start) |
| 428 if (needData && (i = getBaseRevision(start)) < start) { | 437 if (needData && (i = getBaseRevision(start)) < start) { |
