+ // Garbage collect any expired entries.\r
+ unsigned long count=0;\r
+ time_t now=time(NULL)-XMLToolingConfig::getConfig().clock_skew_secs;\r
+ multimap<time_t,string>::iterator stop=m_expMap.upper_bound(now);\r
+ for (multimap<time_t,string>::iterator i=m_expMap.begin(); i!=stop; m_expMap.erase(i++)) {\r
+ m_dataMap.erase(i->second);\r
+ ++count;\r
+ }\r
+\r
+ return count;\r
+}\r
+\r
+void MemoryStorageService::createString(StorageHandle* handle, const char* key, const char* value, time_t expiration)\r
+{\r
+ if (!isValid(handle))\r
+ throw IOException("Invalid storage handle.");\r
+ MemoryHandle* h = static_cast<MemoryHandle*>(handle);\r
+\r
+ // Lock the maps.\r
+ h->m_lock->wrlock();\r
+ SharedLock wrapper(h->m_lock, false);\r
+ \r