X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.acorn%2Fsrc%2Forg%2Fsimantics%2Facorn%2Flru%2FLRUObject.java;h=3194d591e0b37e8712e8cabf3cc1afcb9549a754;hp=1079bf5f0decedacf409d1404d6a5d05b957a333;hb=d9a9d77c7024260e3e3b3a8558ddc84b2a8b99b3;hpb=c01cbb8505a717426eb6a30faf816534eb532e97 diff --git a/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/LRUObject.java b/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/LRUObject.java index 1079bf5f0..3194d591e 100644 --- a/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/LRUObject.java +++ b/bundles/org.simantics.acorn/src/org/simantics/acorn/lru/LRUObject.java @@ -7,6 +7,8 @@ import java.util.concurrent.TimeUnit; import org.simantics.acorn.FileIO; import org.simantics.acorn.Persistable; +import org.simantics.acorn.exception.AcornAccessVerificationException; +import org.simantics.acorn.exception.IllegalAcornStateException; import org.simantics.utils.datastructures.Pair; public abstract class LRUObject> implements Persistable { @@ -59,10 +61,8 @@ public abstract class LRUObject pair = toBytes(); - byte[] data = pair.first; - int length = pair.second; - FileIO fio = FileIO.get(bytes); - int offset = fio.saveBytes(data, length, overwrite()); - setPosition(offset, length); - } - - public int makeResident() { + if(VERIFY) { + try { + verifyAccess(); + } catch (AcornAccessVerificationException e) { + throw new IOException("Exception occured during toFile for file " + fileName, e); + } + } + try { + Pair pair = toBytes(); + byte[] data = pair.first; + int length = pair.second; + FileIO fio = FileIO.get(bytes); + int offset = fio.saveBytes(data, length, overwrite()); + setPosition(offset, length); + } catch (AcornAccessVerificationException | IllegalAcornStateException e) { + throw new IOException("Exception occured during toFile for file " + fileName, e); + } + } + + public int makeResident() throws AcornAccessVerificationException, IllegalAcornStateException { if(VERIFY) verifyAccess(); return LRU.makeResident(this, false); } - public int makeResident(boolean keepResident) { + public int makeResident(boolean keepResident) throws AcornAccessVerificationException, IllegalAcornStateException { if(VERIFY) verifyAccess(); return LRU.makeResident(this, true); } @@ -111,24 +121,24 @@ public abstract class LRUObject toBytes(); + abstract protected Pair toBytes() throws IllegalAcornStateException; - protected void setDirty() { + protected void setDirty() throws AcornAccessVerificationException { if(VERIFY) verifyAccess(); dirty = true; } - protected void verifyAccess() { - assert(mutex.availablePermits() == 0); + protected void verifyAccess() throws AcornAccessVerificationException { + if (mutex.availablePermits() != 0) + throw new AcornAccessVerificationException("fileName=" + fileName + " mutex has " + mutex.availablePermits() + " available permits, should be 0! Current mutexOwner is " + mutexOwner); } - protected synchronized void cancelForceResident() { + protected synchronized void cancelForceResident() throws AcornAccessVerificationException { setForceResident(false); } @@ -208,27 +219,27 @@ public abstract class LRUObject 0 for " + fileName + " in " + readDirectory.toAbsolutePath() + ", dirty=" + dirty + ", resident=" + resident + ", forceResident=" + forceResident); } - private Path getDirectory() { + private Path getDirectory() throws AcornAccessVerificationException { if(VERIFY) verifyAccess(); return readDirectory; }