Skip to content

Commit 2f7031e

Browse files
committed
Revert "No need to allocate a new head node."
This reverts commit 46f9138.
1 parent 96786bb commit 2f7031e

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

src/main/java/rx/internal/operators/OperatorReplay.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -897,24 +897,29 @@ final void removeFirst() {
897897
size--;
898898
// can't just move the head because it would retain the very first value
899899
// can't null out the head's value because of late replayers would see null
900-
setFirst(next);
900+
setFirst(next.get());
901901
}
902-
/* test */ final void removeSome(int n) {
902+
final void removeSome(int n) {
903903
Node head = get();
904904
while (n > 0) {
905905
head = head.get();
906906
n--;
907907
size--;
908908
}
909909

910-
setFirst(head);
910+
setFirst(head.get());
911911
}
912912
/**
913913
* Arranges the given node is the new head from now on.
914914
* @param n
915915
*/
916916
final void setFirst(Node n) {
917-
set(n);
917+
Node newHead = new Node(null);
918+
newHead.lazySet(n);
919+
if (n == null) {
920+
tail = newHead;
921+
}
922+
set(newHead);
918923
}
919924

920925
@Override
@@ -1114,23 +1119,21 @@ Object leaveTransform(Object value) {
11141119
void truncate() {
11151120
long timeLimit = scheduler.now() - maxAgeInMillis;
11161121

1117-
Node prev = get();
1118-
Node next = prev.get();
1122+
Node head = get();
1123+
Node next = head.get();
11191124

11201125
int e = 0;
11211126
for (;;) {
11221127
if (next != null) {
11231128
if (size > limit) {
11241129
e++;
11251130
size--;
1126-
prev = next;
11271131
next = next.get();
11281132
} else {
11291133
Timestamped<?> v = (Timestamped<?>)next.value;
11301134
if (v.getTimestampMillis() <= timeLimit) {
11311135
e++;
11321136
size--;
1133-
prev = next;
11341137
next = next.get();
11351138
} else {
11361139
break;
@@ -1141,15 +1144,15 @@ void truncate() {
11411144
}
11421145
}
11431146
if (e != 0) {
1144-
setFirst(prev);
1147+
setFirst(next);
11451148
}
11461149
}
11471150
@Override
11481151
void truncateFinal() {
11491152
long timeLimit = scheduler.now() - maxAgeInMillis;
11501153

1151-
Node prev = get();
1152-
Node next = prev.get();
1154+
Node head = get();
1155+
Node next = head.get();
11531156

11541157
int e = 0;
11551158
for (;;) {
@@ -1158,7 +1161,6 @@ void truncateFinal() {
11581161
if (v.getTimestampMillis() <= timeLimit) {
11591162
e++;
11601163
size--;
1161-
prev = next;
11621164
next = next.get();
11631165
} else {
11641166
break;
@@ -1168,7 +1170,7 @@ void truncateFinal() {
11681170
}
11691171
}
11701172
if (e != 0) {
1171-
setFirst(prev);
1173+
setFirst(next);
11721174
}
11731175
}
11741176
}

0 commit comments

Comments
 (0)