Convert from NULL macro to nullptr.
[shibboleth/cpp-xmltooling.git] / xmltooling / impl / MemoryStorageService.cpp
index af0fd71..7592ce8 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *  Copyright 2001-2007 Internet2
- * 
+ *  Copyright 2001-2010 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.
  */
 
 #include "util/Threads.h"
 #include "util/XMLHelper.h"
 
+#include <memory>
 #include <xercesc/util/XMLUniDefs.hpp>
 
 using namespace xmltooling::logging;
 using namespace xmltooling;
 using namespace std;
 
+using xercesc::DOMElement;
+
 namespace xmltooling {
     class XMLTOOL_DLLLOCAL MemoryStorageService : public StorageService
     {
     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);
+        int readString(const char* context, const char* key, string* pvalue=nullptr, time_t* pexpiration=nullptr, int version=0);
+        int updateString(const char* context, const char* key, const char* value=nullptr, 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);
         }
-        int readText(const char* context, const char* key, string* pvalue=NULL, time_t* pexpiration=NULL, int version=0) {
+        int readText(const char* context, const char* key, string* pvalue=nullptr, time_t* pexpiration=nullptr, int version=0) {
             return readString(context, key, pvalue, pexpiration, version);
         }
-        int updateText(const char* context, const char* key, const char* value=NULL, time_t expiration=0, int version=0) {
+        int updateText(const char* context, const char* key, const char* value=nullptr, time_t expiration=0, int version=0) {
             return updateString(context, key, value, expiration, version);
         }
         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) {
@@ -67,8 +70,6 @@ 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) {}
@@ -76,7 +77,7 @@ namespace xmltooling {
             time_t expiration;
             int version;
         };
-        
+
         struct XMLTOOL_DLLLOCAL Context {
             Context() {}
             Context(const Context& src) {
@@ -120,10 +121,10 @@ namespace xmltooling {
 static const XMLCh cleanupInterval[] = UNICODE_LITERAL_15(c,l,e,a,n,u,p,I,n,t,e,r,v,a,l);
 
 MemoryStorageService::MemoryStorageService(const DOMElement* e)
-    : m_lock(NULL), shutdown_wait(NULL), cleanup_thread(NULL), shutdown(false), m_cleanupInterval(0),
+    : m_lock(nullptr), shutdown_wait(nullptr), cleanup_thread(nullptr), shutdown(false), m_cleanupInterval(0),
         m_log(Category::getInstance(XMLTOOLING_LOGCAT".StorageService"))
 {
-    const XMLCh* tag=e ? e->getAttributeNS(NULL,cleanupInterval) : NULL;
+    const XMLCh* tag=e ? e->getAttributeNS(nullptr,cleanupInterval) : nullptr;
     if (tag && *tag) {
         m_cleanupInterval = XMLString::parseInt(tag);
     }
@@ -140,28 +141,22 @@ MemoryStorageService::~MemoryStorageService()
     // Shut down the cleanup thread and let it know...
     shutdown = true;
     shutdown_wait->signal();
-    cleanup_thread->join(NULL);
+    cleanup_thread->join(nullptr);
 
+    delete cleanup_thread;
     delete shutdown_wait;
     delete m_lock;
 }
 
-void* MemoryStorageService::cleanup_fn(void* cache_p)
+void* MemoryStorageService::cleanup_fn(void* pv)
 {
-    MemoryStorageService* cache = reinterpret_cast<MemoryStorageService*>(cache_p);
+    MemoryStorageService* cache = reinterpret_cast<MemoryStorageService*>(pv);
 
 #ifndef WIN32
-    // First, let's block all signals 
+    // First, let's block all signals
     Thread::mask_all_signals();
 #endif
 
-    // Now run the cleanup process.
-    cache->cleanup();
-    return NULL;
-}
-
-void MemoryStorageService::cleanup()
-{
 #ifdef _DEBUG
     NDC ndc("cleanup");
 #endif
@@ -169,35 +164,35 @@ void MemoryStorageService::cleanup()
     auto_ptr<Mutex> mutex(Mutex::create());
     mutex->lock();
 
-    m_log.info("cleanup thread started...running every %d seconds", m_cleanupInterval);
+    cache->m_log.info("cleanup thread started...running every %d seconds", cache->m_cleanupInterval);
 
-    while (!shutdown) {
-        shutdown_wait->timedwait(mutex.get(), m_cleanupInterval);
-        if (shutdown)
+    while (!cache->shutdown) {
+        cache->shutdown_wait->timedwait(mutex.get(), cache->m_cleanupInterval);
+        if (cache->shutdown)
             break;
-        
+
         unsigned long count=0;
-        time_t now = time(NULL);
-        m_lock->wrlock();
-        SharedLock locker(m_lock, false);
-        for (map<string,Context>::iterator i=m_contextMap.begin(); i!=m_contextMap.end(); ++i)
+        time_t now = time(nullptr);
+        cache->m_lock->wrlock();
+        SharedLock locker(cache->m_lock, false);
+        for (map<string,Context>::iterator i=cache->m_contextMap.begin(); i!=cache->m_contextMap.end(); ++i)
             count += i->second.reap(now);
-        
+
         if (count)
-            m_log.info("purged %d expired record(s) from storage", count);
+            cache->m_log.info("purged %d expired record(s) from storage", count);
     }
 
-    m_log.info("cleanup thread finished");
+    cache->m_log.info("cleanup thread finished");
 
     mutex->unlock();
-    Thread::exit(NULL);
+    return nullptr;
 }
 
 void MemoryStorageService::reap(const char* context)
 {
     Context& ctx = writeContext(context);
     SharedLock locker(m_lock, false);
-    ctx.reap(time(NULL));
+    ctx.reap(time(nullptr));
 }
 
 unsigned long MemoryStorageService::Context::reap(time_t exp)
@@ -228,14 +223,14 @@ bool MemoryStorageService::createString(const char* context, const char* key, co
     map<string,Record>::iterator i=ctx.m_dataMap.find(key);
     if (i!=ctx.m_dataMap.end()) {
         // Not yet expired?
-        if (time(NULL) < i->second.expiration)
+        if (time(nullptr) < i->second.expiration)
             return false;
         // 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;
 }
@@ -248,7 +243,7 @@ int MemoryStorageService::readString(const char* context, const char* key, strin
     map<string,Record>::iterator i=ctx.m_dataMap.find(key);
     if (i==ctx.m_dataMap.end())
         return 0;
-    else if (time(NULL) >= i->second.expiration)
+    else if (time(nullptr) >= i->second.expiration)
         return 0;
     if (pexpiration)
         *pexpiration = i->second.expiration;
@@ -267,9 +262,9 @@ int MemoryStorageService::updateString(const char* context, const char* key, con
     map<string,Record>::iterator i=ctx.m_dataMap.find(key);
     if (i==ctx.m_dataMap.end())
         return 0;
-    else if (time(NULL) >= i->second.expiration)
+    else if (time(nullptr) >= i->second.expiration)
         return 0;
-    
+
     if (version > 0 && version != i->second.version)
         return -1;  // caller's out of sync
 
@@ -277,7 +272,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;
 
@@ -289,7 +284,7 @@ bool MemoryStorageService::deleteString(const char* context, const char* key)
 {
     Context& ctx = writeContext(context);
     SharedLock locker(m_lock, false);
-    
+
     // Find the record.
     map<string,Record>::iterator i=ctx.m_dataMap.find(key);
     if (i!=ctx.m_dataMap.end()) {
@@ -307,7 +302,7 @@ void MemoryStorageService::updateContext(const char* context, time_t expiration)
     Context& ctx = writeContext(context);
     SharedLock locker(m_lock, false);
 
-    time_t now = time(NULL);
+    time_t now = time(nullptr);
     map<string,Record>::iterator stop=ctx.m_dataMap.end();
     for (map<string,Record>::iterator i = ctx.m_dataMap.begin(); i!=stop; ++i) {
         if (now < i->second.expiration)