Returning the evicted element from CircularQueue.

Calling destroy() on the returned element in CloudSearchPerUserService

Bug: 228848922
Test: Added new CTS test
Change-Id: Iebbcb44f5bfdbc5085c202ceb39301c83ca3c6cf
This commit is contained in:
Shashwat Razdan
2022-04-27 15:24:31 -07:00
parent 6037653177
commit cad7af2dde
3 changed files with 15 additions and 7 deletions

View File

@@ -147,7 +147,10 @@ public class CloudSearchPerUserService extends
}
});
if (sessionInfo.linkToDeath()) {
mCallbackQueue.put(requestId, sessionInfo);
CloudSearchCallbackInfo removedInfo = mCallbackQueue.put(requestId, sessionInfo);
if (removedInfo != null) {
removedInfo.destroy();
}
} else {
// destroy the session if calling process is already dead
onDestroyLocked(requestId);

View File

@@ -16,6 +16,7 @@
package com.android.server;
import android.annotation.Nullable;
import android.util.ArrayMap;
import java.util.Collection;
@@ -43,16 +44,19 @@ public class CircularQueue<K, V> extends LinkedList<K> {
/**
* Put a (key|value) pair in the CircularQueue. Only the key will be added to the queue. Value
* will be added to the ArrayMap.
* @return {@code true} (as specified by {@link Collection#add})
* @return the most recently removed value if keys were removed, or {@code null} if no keys were
* removed.
*/
public boolean put(K key, V value) {
@Nullable
public V put(K key, V value) {
super.add(key);
mArrayMap.put(key, value);
V removedValue = null;
while (size() > mLimit) {
K removedKey = super.remove();
mArrayMap.remove(removedKey);
removedValue = mArrayMap.remove(removedKey);
}
return true;
return removedValue;
}
/**

View File

@@ -43,11 +43,12 @@ public class CircularQueueTest {
mQueue = new CircularQueue<>(LIMIT);
mQueue.put(1, "A");
mQueue.put(2, "B");
mQueue.put(3, "C");
String removedElement = mQueue.put(3, "C");
assertNull(mQueue.getElement(1));
assertEquals(mQueue.getElement(2), "B");
assertEquals(mQueue.getElement(3), "C");
// Confirming that put is returning the deleted element
assertEquals(removedElement, "A");
}
@Test