1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 package org.mozilla.gecko.sync.repositories.uploaders;
6 
7 import android.support.annotation.CheckResult;
8 import android.support.annotation.NonNull;
9 
10 
11 public class UploaderMeta extends BufferSizeTracker {
12     // Will be written and read by different threads.
13     /* @GuardedBy("accessLock") */ private volatile boolean isUnlimited = false;
14 
15     /* @GuardedBy("accessLock") */ private boolean needsCommit = false;
16 
UploaderMeta(@onNull Object payloadLock, long maxBytes, long maxRecords)17     public UploaderMeta(@NonNull Object payloadLock, long maxBytes, long maxRecords) {
18         super(payloadLock, maxBytes, maxRecords);
19     }
20 
setIsUnlimited(boolean isUnlimited)21     protected void setIsUnlimited(boolean isUnlimited) {
22         synchronized (accessLock) {
23             this.isUnlimited = isUnlimited;
24         }
25     }
26 
27     @Override
canFit(long recordDeltaByteCount)28     protected boolean canFit(long recordDeltaByteCount) {
29         synchronized (accessLock) {
30             return isUnlimited || super.canFit(recordDeltaByteCount);
31         }
32     }
33 
34     @Override
35     @CheckResult
addAndEstimateIfFull(long recordDeltaByteCount)36     protected boolean addAndEstimateIfFull(long recordDeltaByteCount) {
37         synchronized (accessLock) {
38             needsCommit = true;
39             boolean isFull = super.addAndEstimateIfFull(recordDeltaByteCount);
40             return !isUnlimited && isFull;
41         }
42     }
43 
needToCommit()44     protected boolean needToCommit() {
45         synchronized (accessLock) {
46             return needsCommit;
47         }
48     }
49 
50     @Override
canFitRecordByteDelta(long byteDelta, long recordCount, long byteCount)51     protected boolean canFitRecordByteDelta(long byteDelta, long recordCount, long byteCount) {
52         return isUnlimited || super.canFitRecordByteDelta(byteDelta, recordCount, byteCount);
53     }
54 
nextUploaderMeta()55     UploaderMeta nextUploaderMeta() {
56         return new UploaderMeta(accessLock, maxBytes, maxRecords);
57     }
58 }