};
-inline void LRUObject::lru_pin()
-{
+inline void LRUObject::lru_pin() {
+ if (lru && !lru_pinned) {
+ lru->lru_num_pinned++;
+ lru->lru_adjust();
+ }
lru_pinned = true;
- if (lru) lru->lru_num_pinned++;
}
+
inline void LRUObject::lru_unpin() {
- lru_pinned = false;
- if (lru) {
+ if (lru && lru_pinned) {
lru->lru_num_pinned--;
// move from pintail -> bot
lru->lru_pintail.remove(this);
lru->lru_bot.insert_tail(this);
}
+ lru->lru_adjust();
}
+ lru_pinned = false;
}
#endif
ASSERT_EQ(100, lru.lru_get_size());
}
+TEST(lru, Pinning) {
+ LRU lru = LRU();
+
+ Item *ob0 = new Item(0);
+ Item *ob1 = new Item(1);
+
+ // test before ob1 are in a LRU
+ ob1->lru_pin();
+ ASSERT_FALSE(ob1->lru_is_expireable());
+
+ ob1->lru_unpin();
+ ASSERT_TRUE(ob1->lru_is_expireable());
+
+ // test when ob1 are in a LRU
+ lru.lru_touch(ob0);
+ lru.lru_touch(ob1);
+
+ ob1->lru_pin();
+ ob1->lru_pin(); // Verify that, one incr.
+ ASSERT_EQ(1, lru.lru_get_num_pinned());
+ ASSERT_FALSE(ob1->lru_is_expireable());
+
+ ob1->lru_unpin();
+ ob1->lru_unpin(); // Verify that, one decr.
+ ASSERT_EQ(0, lru.lru_get_num_pinned());
+ ASSERT_TRUE(ob1->lru_is_expireable());
+
+ ASSERT_EQ(0, (static_cast<Item*>(lru.lru_expire()))->id);
+ ob0->lru_pin();
+ ASSERT_EQ(1, (static_cast<Item*>(lru.lru_expire()))->id);
+}
+
/*
* Local Variables: