Skip to content

Commit 8dd140e

Browse files
ArtemArtem
authored andcommitted
Better fix for unique timestamp
1 parent a252974 commit 8dd140e

File tree

1 file changed

+35
-7
lines changed

1 file changed

+35
-7
lines changed

sdk/src/main/java/ly/count/android/sdk/Countly.java

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ of this software and associated documentation files (the "Software"), to deal
3434
import java.util.ArrayList;
3535
import java.util.Arrays;
3636
import java.util.Calendar;
37+
import java.util.Collections;
3738
import java.util.List;
3839
import java.util.Map;
3940
import java.util.HashMap;
@@ -1070,14 +1071,41 @@ static int currentTimestamp() {
10701071
return ((int)(System.currentTimeMillis() / 1000l));
10711072
}
10721073

1073-
private static long lastTsMs;
1074-
static synchronized long currentTimestampMs() {
1075-
long ms = System.currentTimeMillis();
1076-
while (lastTsMs == ms) {
1077-
ms += 1;
1074+
static class TimeUniquesEnsurer {
1075+
List<Long> lastTsMs = new ArrayList<>(10);
1076+
long addition = 0;
1077+
1078+
long currentTimeMillis() {
1079+
return System.currentTimeMillis() + addition;
1080+
}
1081+
1082+
synchronized long uniqueTimestamp() {
1083+
long ms = currentTimeMillis();
1084+
1085+
// change time back case
1086+
if (lastTsMs.size() > 2) {
1087+
long min = Collections.min(lastTsMs);
1088+
if (ms < min) {
1089+
lastTsMs.clear();
1090+
lastTsMs.add(ms);
1091+
return ms;
1092+
}
1093+
}
1094+
// usual case
1095+
while (lastTsMs.contains(ms)) {
1096+
ms += 1;
1097+
}
1098+
while (lastTsMs.size() >= 10) {
1099+
lastTsMs.remove(0);
1100+
}
1101+
lastTsMs.add(ms);
1102+
return ms;
10781103
}
1079-
lastTsMs = ms;
1080-
return ms;
1104+
}
1105+
private static TimeUniquesEnsurer timeGenerator = new TimeUniquesEnsurer();
1106+
1107+
static synchronized long currentTimestampMs() {
1108+
return timeGenerator.uniqueTimestamp();
10811109
}
10821110

10831111
/**

0 commit comments

Comments
 (0)