You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@uima.apache.org by Marshall Schor <ms...@schor.com> on 2007/05/21 19:59:44 UTC
Eddie - can you check my reasoning on this "bug" in setting the CASImpl
sofaRef?
The resetNoQuestions iterates over all the views, calling resetView:
/*
* iterated reset - once per view of a CAS except for the base CAS
*/
private void resetView() {
this.indexRepository.flush();
if (this.mySofaRef > 0 && this.getSofa().getSofaRef() == 1) {
// indicate no Sofa exists for the initial view
this.mySofaRef = -1;
} else {
this.mySofaRef = 0;
}
...
The logic for resetting this.mySofaRef should be to set it to -1 for the
initial view, and 0 for other cases
The -1 indicates no sofa has been created (lazy creation being done).
But this logic seems to fail when CAS Pools are being set up because the
pools are created, each CAS having
a base and an "initial View" with the mySofaRef set to -1 for the
initial view. So far, so good.
The pool creation code contains a call to:
protected void populateCasToCasPoolMap(CasPool aCasPool) {
CAS[] casArray = new CAS[aCasPool.getSize()];
for (int i = 0; i < casArray.length; i++) {
casArray[i] = ((CASImpl) aCasPool.getCas()).getBaseCAS();
mCasToCasPoolMap.put(casArray[i], aCasPool);
}
for (int i = 0; i < casArray.length; i++) {
aCasPool.releaseCas(casArray[i]);
}
}
which just is there to set up a map from the cas to the pool to which it
belongs. It however, works by
checking out each cas, and then releasing them back. The releaseCas
calls "reset" on the CAS. This
causes the above resetView to be called on the initial view, but the
sofa has never been created. So the
bit of logic trying to detect this is the initial sofa, fails, and the
mySofaRef is set to 0. Later when the initial
view is checked out of the pool, the lazy sofa creation mechanism fails
because it requires mySofaRef be -1.
Note this would fail anytime a CAS initial view was acquired, and reset
called on it prior to doing anything which
would have required that a sofa be created.
I'm fixing this by having the caller of resetView, which knows
explicitly which sofa is the initial one, handle this
by setting mySofaRef to -1 there. Does this seem right?
-Marshall
Re: Eddie - can you check my reasoning on this "bug" in setting the CASImpl sofaRef?
Posted by Eddie Epstein <ea...@gmail.com>.
On 5/21/07, Marshall Schor <ms...@schor.com> wrote:
> The resetNoQuestions iterates over all the views, calling resetView:
>
> /*
> * iterated reset - once per view of a CAS except for the base CAS
> */
> private void resetView() {
> this.indexRepository.flush();
> if (this.mySofaRef > 0 && this.getSofa().getSofaRef() == 1) {
> // indicate no Sofa exists for the initial view
> this.mySofaRef = -1;
> } else {
> this.mySofaRef = 0;
> }
>
> ...
>
> The logic for resetting this.mySofaRef should be to set it to -1 for the
> initial view, and 0 for other cases
> The -1 indicates no sofa has been created (lazy creation being done).
>
> But this logic seems to fail when CAS Pools are being set up because the
> pools are created, each CAS having
> a base and an "initial View" with the mySofaRef set to -1 for the
> initial view. So far, so good.
> The pool creation code contains a call to:
>
> protected void populateCasToCasPoolMap(CasPool aCasPool) {
> CAS[] casArray = new CAS[aCasPool.getSize()];
> for (int i = 0; i < casArray.length; i++) {
> casArray[i] = ((CASImpl) aCasPool.getCas()).getBaseCAS();
> mCasToCasPoolMap.put(casArray[i], aCasPool);
> }
> for (int i = 0; i < casArray.length; i++) {
> aCasPool.releaseCas(casArray[i]);
> }
> }
>
> which just is there to set up a map from the cas to the pool to which it
> belongs. It however, works by
> checking out each cas, and then releasing them back. The releaseCas
> calls "reset" on the CAS. This
> causes the above resetView to be called on the initial view, but the
> sofa has never been created. So the
> bit of logic trying to detect this is the initial sofa, fails, and the
> mySofaRef is set to 0. Later when the initial
> view is checked out of the pool, the lazy sofa creation mechanism fails
> because it requires mySofaRef be -1.
>
> Note this would fail anytime a CAS initial view was acquired, and reset
> called on it prior to doing anything which
> would have required that a sofa be created.
>
> I'm fixing this by having the caller of resetView, which knows
> explicitly which sofa is the initial one, handle this
> by setting mySofaRef to -1 there. Does this seem right?
>
> -Marshall
>
That would work. Or you could just fix resetView() with:
if (this.mySofaRef > 0) {
if (this.getSofa().getSofaRef() == 1) {
// indicate no Sofa exists for the initial view
this.mySofaRef = -1;
} else {
// indicate no Sofa exists
this.mySofaRef = 0;
}
}