From 4bd049e639d80028ccdc909c0fef2de4e810cf50 Mon Sep 17 00:00:00 2001 From: Mauro Sardara Date: Fri, 28 Jul 2017 19:37:14 +0200 Subject: Adding possibility to set lifetime when publishing content using the http helper. Change-Id: I0107bb216e961c189a62f5c6bb3b22fc563919a7 Signed-off-by: Mauro Sardara --- icnet/transport/icnet_transport_content_store.cc | 41 +++++++++++++++--------- 1 file changed, 26 insertions(+), 15 deletions(-) (limited to 'icnet/transport/icnet_transport_content_store.cc') diff --git a/icnet/transport/icnet_transport_content_store.cc b/icnet/transport/icnet_transport_content_store.cc index a9f05658..99700f13 100644 --- a/icnet/transport/icnet_transport_content_store.cc +++ b/icnet/transport/icnet_transport_content_store.cc @@ -28,17 +28,21 @@ ContentStore::~ContentStore() { } void ContentStore::insert(const std::shared_ptr &content_object) { - std::unique_lock lock(cs_mutex_); - if (content_store_hash_table_.size() >= max_content_store_size_) { - // Evict item - content_store_hash_table_.erase(lru_list_.back()); - lru_list_.pop_back(); - } + // Check if the content can be cached + if (content_object->getExpiryTime() > 0) { + std::unique_lock lock(cs_mutex_); + if (content_store_hash_table_.size() >= max_content_store_size_) { + // Evict item + content_store_hash_table_.erase(lru_list_.back()); + lru_list_.pop_back(); + } - // Insert new item - lru_list_.push_back(std::cref(content_object->getName())); - LRUList::iterator pos = lru_list_.end(); - content_store_hash_table_[content_object->getName()] = CcnxContentStoreEntry(content_object, pos); + // Insert new item + lru_list_.push_back(std::cref(content_object->getName())); + LRUList::iterator pos = lru_list_.end(); + content_store_hash_table_[content_object->getName()] = ContentStoreEntry(ObjectTimeEntry(content_object, + std::chrono::steady_clock::now()), pos); + } } @@ -47,13 +51,20 @@ const std::shared_ptr &ContentStore::find(const Interest &interes ContentStoreHashTable::iterator it = content_store_hash_table_.find(interest.getName()); if (it != content_store_hash_table_.end()) { if (it->second.second != lru_list_.begin()) { - // Move element to the top of the LRU list - lru_list_.splice(lru_list_.begin(), lru_list_, it->second.second); + if (std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()).count() + < it->second.first.first->getExpiryTime()) { + // Move element to the top of the LRU list + lru_list_.splice(lru_list_.begin(), lru_list_, it->second.second); + return it->second.first.first; + } else { + // Stale content + content_store_hash_table_.erase(interest.getName()); + } } - return it->second.first; - } else { - return empty_reference_; } + + return empty_reference_; } void ContentStore::erase(const Name &exact_name) { -- cgit 1.2.3-korg