package org.eclipse.tracecompass.internal.tmf.core.synchronization;
+import java.io.IOException;
+import java.io.ObjectInputStream;
import java.math.BigDecimal;
import java.math.MathContext;
private final int fDeltaBits;
private final int fHashCode;
- private long fOffset;
-
+ private transient long fOffset;
private transient long fRangeStart;
private transient long fScaleMiss;
private transient long fScaleHit;
fDeltaBits = Math.max(Math.min(width, DECIMAL_BITS), 0);
fDeltaMax = 1 << fDeltaBits;
fAlphaLong = fAlpha.multiply(BigDecimal.valueOf(fDeltaMax), MC).longValue();
- fRangeStart = 0L;
- fOffset = 0L;
+ rescale(0);
fScaleMiss = 0;
fScaleHit = 0;
fHashCode = HASHER.newHasher()
*
* TODO: use exact math arithmetic to detect overflow when switching to Java 8
*/
- fRangeStart = timestamp - (timestamp % fDeltaMax);
- fOffset = BigDecimal.valueOf(fRangeStart).multiply(fAlpha, MC).add(fBeta, MC).longValue();
+ rescale(timestamp);
delta = Math.abs(timestamp - fRangeStart);
fScaleMiss++;
} else {
return ((fAlphaLong * delta) >> fDeltaBits) + fOffset;
}
+ private void rescale(long timestamp) {
+ fRangeStart = timestamp - (timestamp % fDeltaMax);
+ fOffset = BigDecimal.valueOf(fRangeStart).multiply(fAlpha, MC).add(fBeta, MC).longValue();
+ }
+
//-------------------------------------------------------------------------
// Transform composition
//-------------------------------------------------------------------------
return fHashCode;
}
+ // Deserialization method, make sure there is a first scaling
+ private void readObject(ObjectInputStream stream)
+ throws IOException, ClassNotFoundException {
+ stream.defaultReadObject();
+
+ rescale(0);
+ }
+
}
\ No newline at end of file