From ebc80d494519697147a7b810234b402cd4b7c0d8 Mon Sep 17 00:00:00 2001 From: cantor Date: Fri, 19 Sep 2008 16:29:14 +0000 Subject: [PATCH] Plug a few memory leaks. git-svn-id: https://svn.middleware.georgetown.edu/cpp-xmltooling/branches/REL_1@521 de75baf8-a10c-0410-a50a-987c0e22f00f --- xmltooling/impl/MemoryStorageService.cpp | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/xmltooling/impl/MemoryStorageService.cpp b/xmltooling/impl/MemoryStorageService.cpp index b297d65..fdef458 100644 --- a/xmltooling/impl/MemoryStorageService.cpp +++ b/xmltooling/impl/MemoryStorageService.cpp @@ -1,6 +1,6 @@ /* * Copyright 2001-2007 Internet2 - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -16,7 +16,7 @@ /** * MemoryStorageService.cpp - * + * * In-memory "persistent" storage, suitable for simple applications. */ @@ -40,12 +40,12 @@ namespace xmltooling { public: MemoryStorageService(const DOMElement* e); virtual ~MemoryStorageService(); - + bool createString(const char* context, const char* key, const char* value, time_t expiration); int readString(const char* context, const char* key, string* pvalue=NULL, time_t* pexpiration=NULL, int version=0); int updateString(const char* context, const char* key, const char* value=NULL, time_t expiration=0, int version=0); bool deleteString(const char* context, const char* key); - + bool createText(const char* context, const char* key, const char* value, time_t expiration) { return createString(context, key, value, expiration); } @@ -58,7 +58,7 @@ namespace xmltooling { bool deleteText(const char* context, const char* key) { return deleteString(context, key); } - + void reap(const char* context); void updateContext(const char* context, time_t expiration); void deleteContext(const char* context) { @@ -69,7 +69,7 @@ namespace xmltooling { private: void cleanup(); - + struct XMLTOOL_DLLLOCAL Record { Record() : expiration(0), version(1) {} Record(const string& s, time_t t) : data(s), expiration(t), version(1) {} @@ -77,7 +77,7 @@ namespace xmltooling { time_t expiration; int version; }; - + struct XMLTOOL_DLLLOCAL Context { Context() {} Context(const Context& src) { @@ -143,6 +143,7 @@ MemoryStorageService::~MemoryStorageService() shutdown_wait->signal(); cleanup_thread->join(NULL); + delete cleanup_thread; delete shutdown_wait; delete m_lock; } @@ -152,7 +153,7 @@ void* MemoryStorageService::cleanup_fn(void* cache_p) MemoryStorageService* cache = reinterpret_cast(cache_p); #ifndef WIN32 - // First, let's block all signals + // First, let's block all signals Thread::mask_all_signals(); #endif @@ -176,14 +177,14 @@ void MemoryStorageService::cleanup() shutdown_wait->timedwait(mutex.get(), m_cleanupInterval); if (shutdown) break; - + unsigned long count=0; time_t now = time(NULL); m_lock->wrlock(); SharedLock locker(m_lock, false); for (map::iterator i=m_contextMap.begin(); i!=m_contextMap.end(); ++i) count += i->second.reap(now); - + if (count) m_log.info("purged %d expired record(s) from storage", count); } @@ -234,9 +235,9 @@ bool MemoryStorageService::createString(const char* context, const char* key, co // It's dead, so we can just remove it now and create the new record. ctx.m_dataMap.erase(i); } - + ctx.m_dataMap[key]=Record(value,expiration); - + m_log.debug("inserted record (%s) in context (%s)", key, context); return true; } @@ -270,7 +271,7 @@ int MemoryStorageService::updateString(const char* context, const char* key, con return 0; else if (time(NULL) >= i->second.expiration) return 0; - + if (version > 0 && version != i->second.version) return -1; // caller's out of sync @@ -278,7 +279,7 @@ int MemoryStorageService::updateString(const char* context, const char* key, con i->second.data = value; ++(i->second.version); } - + if (expiration && expiration != i->second.expiration) i->second.expiration = expiration; @@ -290,7 +291,7 @@ bool MemoryStorageService::deleteString(const char* context, const char* key) { Context& ctx = writeContext(context); SharedLock locker(m_lock, false); - + // Find the record. map::iterator i=ctx.m_dataMap.find(key); if (i!=ctx.m_dataMap.end()) { -- 2.1.4