diff --git a/cppcache/include/geode/internal/geode_base.hpp b/cppcache/include/geode/internal/geode_base.hpp
index 86ab9e5..1e222c9 100644
--- a/cppcache/include/geode/internal/geode_base.hpp
+++ b/cppcache/include/geode/internal/geode_base.hpp
@@ -55,10 +55,10 @@
 
 /** Deletes x only if it exists */
 #define _GEODE_SAFE_DELETE(x) \
-  {                           \
+  do {                        \
     delete x;                 \
     x = nullptr;              \
-  }
+  } while (0)
 
 /** Deletes array x only if it exists */
 #define _GEODE_SAFE_DELETE_ARRAY(x) \
diff --git a/cppcache/src/TcrConnection.hpp b/cppcache/src/TcrConnection.hpp
index 713c364..c3d09cf 100644
--- a/cppcache/src/TcrConnection.hpp
+++ b/cppcache/src/TcrConnection.hpp
@@ -56,11 +56,11 @@
 
 /** Closes and Deletes connection only if it exists */
 #define GF_SAFE_DELETE_CON(x) \
-  {                           \
+  do {                        \
     x->close();               \
     delete x;                 \
     x = nullptr;              \
-  }
+  } while (0)
 
 namespace apache {
 namespace geode {
diff --git a/cppcache/src/ThinClientPoolDM.cpp b/cppcache/src/ThinClientPoolDM.cpp
index 617343d..c9b9475 100644
--- a/cppcache/src/ThinClientPoolDM.cpp
+++ b/cppcache/src/ThinClientPoolDM.cpp
@@ -31,7 +31,6 @@
 #include "ExecutionImpl.hpp"
 #include "ExpiryHandler_T.hpp"
 #include "ExpiryTaskManager.hpp"
-#include "NonCopyable.hpp"
 #include "TcrConnectionManager.hpp"
 #include "TcrEndpoint.hpp"
 #include "ThinClientRegion.hpp"
@@ -57,7 +56,6 @@
   std::shared_ptr<BucketServerLocation> m_serverLocation;
   TcrMessage* m_request;
   TcrMessageReply* m_reply;
-  MapOfUpdateCounters m_mapOfUpdateCounters;
   bool m_attemptFailover;
   bool m_isBGThread;
   bool m_addToLocalCache;
@@ -106,7 +104,7 @@
     m_reply->setChunkedResultHandler(m_resultCollector);
   }
 
-  ~GetAllWork() {
+  ~GetAllWork() override {
     delete m_request;
     delete m_reply;
     delete m_resultCollector;
@@ -115,7 +113,7 @@
   TcrMessage* getReply() { return m_reply; }
 
   void init() {}
-  GfErrType execute(void) {
+  GfErrType execute() override {
     GuardUserAttributes gua;
 
     if (m_userAttribute != nullptr) {
@@ -191,8 +189,7 @@
   m_memId = cacheImpl->getClientProxyMembershipIDFactory().create(
       hostName, driver, hostPort, clientDurableId.c_str(), durableTimeOut);
 
-  if (m_attrs->m_initLocList.size() == 0 &&
-      m_attrs->m_initServList.size() == 0) {
+  if (m_attrs->m_initLocList.empty() && m_attrs->m_initServList.empty()) {
     std::string msg = "No locators or servers provided for pool named ";
     msg += name;
     throw IllegalStateException(msg);
@@ -205,7 +202,7 @@
   cacheImpl->getStatisticsManager().forceSample();
 
   if (!sysProp.isEndpointShufflingDisabled()) {
-    if (m_attrs->m_initServList.size() > 0) {
+    if (!m_attrs->m_initServList.empty()) {
       RandGen randgen;
       m_server = randgen(static_cast<uint32_t>(m_attrs->m_initServList.size()));
     }
@@ -220,7 +217,6 @@
 void ThinClientPoolDM::init() {
   LOGDEBUG("ThinClientPoolDM::init: Starting pool initialization");
   auto cacheImpl = m_connManager.getCacheImpl();
-  auto& sysProp = cacheImpl->getDistributedSystem().getSystemProperties();
   m_isMultiUserMode = getMultiuserAuthentication();
 
   if (m_isMultiUserMode) {
@@ -257,8 +253,8 @@
         "ThinClientPoolDM::getCredentials: acquired handle to authLoader, "
         "invoking getCredentials %s",
         ep->name().c_str());
-    const auto& tmpAuthIniSecurityProperties = authInitialize->getCredentials(
-        tmpSecurityProperties, ep->name().c_str());
+    const auto& tmpAuthIniSecurityProperties =
+        authInitialize->getCredentials(tmpSecurityProperties, ep->name());
     LOGFINER("Done getting credentials");
     return tmpAuthIniSecurityProperties;
   }
@@ -277,7 +273,7 @@
                     ->getDistributedSystem()
                     .getSystemProperties();
 
-  if (props.onClientDisconnectClearPdxTypeIds() == true) {
+  if (props.onClientDisconnectClearPdxTypeIds()) {
     m_cliCallbackTask =
         std::unique_ptr<Task<ThinClientPoolDM>>(new Task<ThinClientPoolDM>(
             this, &ThinClientPoolDM::cliCallback, "NC_cliCallback"));
@@ -391,9 +387,7 @@
     m_connSema.acquire();
     if (isRunning) {
       manageConnectionsInternal(isRunning);
-      while (m_connSema.tryacquire() != -1) {
-        ;
-      }
+      m_connSema.acquire();
     }
   }
   LOGFINE("ThinClientPoolDM: ending manageConnections thread");
@@ -409,8 +403,6 @@
   auto _idle = getIdleTimeout();
   auto _nextIdle = _idle;
 
-  TcrConnection* conn = nullptr;
-
   std::vector<TcrConnection*> removelist;
   std::set<ServerLocation> excludeServers;
 
@@ -418,7 +410,7 @@
   auto savedConns = 0;
 
   for (unsigned int i = 0; (i < availableConns) && isRunning; i++) {
-    conn = getNoWait();
+    auto* conn = getNoWait();
     if (conn == nullptr) {
       break;
     }
@@ -569,7 +561,7 @@
 std::string ThinClientPoolDM::selectEndpoint(
     std::set<ServerLocation>& excludeServers,
     const TcrConnection* currentServer) {
-  if (m_attrs->m_initLocList.size()) {  // query locators
+  if (!m_attrs->m_initLocList.empty()) {  // query locators
     ServerLocation outEndpoint;
     std::string additionalLoc;
     LOGFINE("Asking locator for server from group [%s]",
@@ -593,8 +585,8 @@
                   outEndpoint.getPort());
     LOGFINE("ThinClientPoolDM: Locator returned endpoint [%s]", epNameStr);
     return epNameStr;
-  } else if (m_attrs->m_initServList
-                 .size()) {  // use specified server endpoints
+  } else if (!m_attrs->m_initServList.empty()) {
+    // use specified server endpoints
     // highly complex round-robin algorithm
     std::lock_guard<decltype(m_endpointSelectionLock)> _guard(
         m_endpointSelectionLock);
@@ -633,8 +625,6 @@
     const char* func, uint8_t getResult, std::chrono::milliseconds timeout,
     std::shared_ptr<Cacheable> args, std::shared_ptr<ResultCollector>& rs,
     std::shared_ptr<CacheableString>& exceptionPtr) {
-  GfErrType err = GF_NOERR;
-
   getStats().setCurClientOps(++m_clientOps);
 
   auto resultCollectorLock = std::make_shared<std::recursive_mutex>();
@@ -670,7 +660,7 @@
   GfErrType finalErrorReturn = GF_NOERR;
 
   for (auto& funcExe : fePtrList) {
-    err = funcExe->getResult();
+    auto err = funcExe->getResult();
     if (err != GF_NOERR) {
       if (funcExe->getException() == nullptr) {
         if (err == GF_TIMEOUT) {
@@ -878,9 +868,6 @@
   if (!(m_remoteQueryServicePtr == nullptr)) {
     return m_remoteQueryServicePtr;
   }
-  auto& props = m_connManager.getCacheImpl()
-                    ->getDistributedSystem()
-                    .getSystemProperties();
 
   LOGWARN("Remote query service is not initialized.");
 
@@ -909,38 +896,19 @@
   }
 }
 
-TcrConnection* ThinClientPoolDM::getConnectionInMultiuserMode(
-    std::shared_ptr<UserAttributes> userAttribute) {
-  LOGDEBUG("ThinClientPoolDM::getConnectionInMultiuserMode:");
-  UserConnectionAttributes* uca = userAttribute->getConnectionAttribute();
-  if (uca != nullptr) {
-    TcrEndpoint* ep = uca->getEndpoint();
-    LOGDEBUG(
-        "ThinClientPoolDM::getConnectionInMultiuserMode endpoint got = %s ",
-        ep->name().c_str());
-    return getFromEP(ep);
-  } else {
-    return nullptr;
-  }
-}
-
 int32_t ThinClientPoolDM::GetPDXIdForType(
     std::shared_ptr<Serializable> pdxType) {
   LOGDEBUG("ThinClientPoolDM::GetPDXIdForType:");
 
-  GfErrType err = GF_NOERR;
-
   TcrMessageGetPdxIdForType request(
       new DataOutput(m_connManager.getCacheImpl()->createDataOutput()), pdxType,
       this);
 
   TcrMessageReply reply(true, this);
 
-  err = sendSyncRequest(request, reply);
+  throwExceptionIfError("Operation Failed", sendSyncRequest(request, reply));
 
-  if (err != GF_NOERR) {
-    throwExceptionIfError("Operation Failed", err);
-  } else if (reply.getMessageType() == TcrMessage::EXCEPTION) {
+  if (reply.getMessageType() == TcrMessage::EXCEPTION) {
     LOGDEBUG("ThinClientPoolDM::GetPDXTypeById: Exception = %s ",
              reply.getException());
     throw IllegalStateException("Failed to register PdxSerializable Type");
@@ -968,19 +936,15 @@
                                   int32_t pdxTypeId) {
   LOGDEBUG("ThinClientPoolDM::GetPDXIdForType:");
 
-  GfErrType err = GF_NOERR;
-
   TcrMessageAddPdxType request(
       new DataOutput(m_connManager.getCacheImpl()->createDataOutput()), pdxType,
       this, pdxTypeId);
 
   TcrMessageReply reply(true, this);
 
-  err = sendSyncRequest(request, reply);
+  throwExceptionIfError("Operation Failed", sendSyncRequest(request, reply));
 
-  if (err != GF_NOERR) {
-    throwExceptionIfError("Operation Failed", err);
-  } else if (reply.getMessageType() == TcrMessage::EXCEPTION) {
+  if (reply.getMessageType() == TcrMessage::EXCEPTION) {
     LOGDEBUG("ThinClientPoolDM::GetPDXTypeById: Exception = %s ",
              reply.getException());
     throw IllegalStateException("Failed to register PdxSerializable Type");
@@ -989,19 +953,15 @@
 std::shared_ptr<Serializable> ThinClientPoolDM::GetPDXTypeById(int32_t typeId) {
   LOGDEBUG("ThinClientPoolDM::GetPDXTypeById:");
 
-  GfErrType err = GF_NOERR;
-
   TcrMessageGetPdxTypeById request(
       new DataOutput(m_connManager.getCacheImpl()->createDataOutput()), typeId,
       this);
 
   TcrMessageReply reply(true, this);
 
-  err = sendSyncRequest(request, reply);
+  throwExceptionIfError("Operation Failed", sendSyncRequest(request, reply));
 
-  if (err != GF_NOERR) {
-    throwExceptionIfError("Operation Failed", err);
-  } else if (reply.getMessageType() == TcrMessage::EXCEPTION) {
+  if (reply.getMessageType() == TcrMessage::EXCEPTION) {
     LOGDEBUG("ThinClientPoolDM::GetPDXTypeById: Exception = %s ",
              reply.getException());
     throw IllegalStateException("Failed to understand PdxSerializable Type");
@@ -1013,19 +973,15 @@
 int32_t ThinClientPoolDM::GetEnumValue(std::shared_ptr<Serializable> enumInfo) {
   LOGDEBUG("ThinClientPoolDM::GetEnumValue:");
 
-  GfErrType err = GF_NOERR;
-
   TcrMessageGetPdxIdForEnum request(
       new DataOutput(m_connManager.getCacheImpl()->createDataOutput()),
       enumInfo, this);
 
   TcrMessageReply reply(true, this);
 
-  err = sendSyncRequest(request, reply);
+  throwExceptionIfError("Operation Failed", sendSyncRequest(request, reply));
 
-  if (err != GF_NOERR) {
-    throwExceptionIfError("Operation Failed", err);
-  } else if (reply.getMessageType() == TcrMessage::EXCEPTION) {
+  if (reply.getMessageType() == TcrMessage::EXCEPTION) {
     LOGDEBUG("ThinClientPoolDM::GetEnumValue: Exception = %s ",
              reply.getException());
     throw IllegalStateException("Failed to register Pdx enum Type");
@@ -1052,19 +1008,15 @@
 std::shared_ptr<Serializable> ThinClientPoolDM::GetEnum(int32_t val) {
   LOGDEBUG("ThinClientPoolDM::GetEnum:");
 
-  GfErrType err = GF_NOERR;
-
   TcrMessageGetPdxEnumById request(
       new DataOutput(m_connManager.getCacheImpl()->createDataOutput()), val,
       this);
 
   TcrMessageReply reply(true, this);
 
-  err = sendSyncRequest(request, reply);
+  throwExceptionIfError("Operation Failed", sendSyncRequest(request, reply));
 
-  if (err != GF_NOERR) {
-    throwExceptionIfError("Operation Failed", err);
-  } else if (reply.getMessageType() == TcrMessage::EXCEPTION) {
+  if (reply.getMessageType() == TcrMessage::EXCEPTION) {
     LOGDEBUG("ThinClientPoolDM::GetEnum: Exception = %s ",
              reply.getException());
     throw IllegalStateException("Failed to understand enum Type");
@@ -1077,19 +1029,15 @@
                                int enumVal) {
   LOGDEBUG("ThinClientPoolDM::AddEnum:");
 
-  GfErrType err = GF_NOERR;
-
   TcrMessageAddPdxEnum request(
       new DataOutput(m_connManager.getCacheImpl()->createDataOutput()),
       enumInfo, this, enumVal);
 
   TcrMessageReply reply(true, this);
 
-  err = sendSyncRequest(request, reply);
+  throwExceptionIfError("Operation Failed", sendSyncRequest(request, reply));
 
-  if (err != GF_NOERR) {
-    throwExceptionIfError("Operation Failed", err);
-  } else if (reply.getMessageType() == TcrMessage::EXCEPTION) {
+  if (reply.getMessageType() == TcrMessage::EXCEPTION) {
     LOGDEBUG("ThinClientPoolDM::AddEnum: Exception = %s ",
              reply.getException());
     throw IllegalStateException("Failed to register enum Type");
@@ -1101,15 +1049,13 @@
     bool isBGThread, bool& isServerException) {
   LOGDEBUG("ThinClientPoolDM::sendUserCredentials:");
 
-  auto err = GF_NOERR;
-
   TcrMessageUserCredential request(
       new DataOutput(m_connManager.getCacheImpl()->createDataOutput()),
       credentials, this);
 
   TcrMessageReply reply(true, this);
 
-  err =
+  auto err =
       conn->getEndpointObject()->sendRequestConnWithRetry(request, reply, conn);
 
   if (conn) {
@@ -1213,7 +1159,7 @@
     // do only for locator
     // if servergroup is there, then verify otherwise you may reach to another
     // group
-    if (m_attrs->m_initLocList.size()) {
+    if (!m_attrs->m_initLocList.empty()) {
       auto&& servGrp = getServerGroup();
       if (servGrp.length() > 0) {
         auto groups = serverLocation->getServerGroups();
@@ -1241,7 +1187,7 @@
 }
 
 TcrEndpoint* ThinClientPoolDM::getEndpoint(const std::string& endpointName) {
-  auto&& guard = m_endpoints.make_lock();
+  m_endpoints.make_lock();
   const auto& find = m_endpoints.find(endpointName);
   if (find == m_endpoints.end()) {
     return nullptr;
@@ -1279,8 +1225,6 @@
 
     for (const auto& locationIter : *locationMap) {
       const auto& serverLocation = locationIter.first;
-      if (serverLocation == nullptr) {
-      }
       const auto& keys = locationIter.second;
       auto worker = std::make_shared<GetAllWork>(
           this, region, serverLocation, keys, attemptFailover, isBGThread,
@@ -1292,7 +1236,7 @@
     reply.setMessageType(TcrMessage::RESPONSE);
 
     for (auto& worker : getAllWorkers) {
-      GfErrType err = worker->getResult();
+      auto err = worker->getResult();
 
       if (err != GF_NOERR) {
         error = err;
@@ -1375,7 +1319,7 @@
     }
 
     GfErrType queueErr = GF_NOERR;
-    uint32_t lastExcludeSize = static_cast<uint32_t>(excludeServers.size());
+    auto lastExcludeSize = static_cast<uint32_t>(excludeServers.size());
     int8_t version = 0;
 
     bool isUserNeedToReAuthenticate = false;
@@ -1397,10 +1341,6 @@
                                      request, version, singleHopConnFound,
                                      connFound, serverLocation);
 
-      LOGDEBUG(
-          "ThinClientPoolDM::sendSyncRequest: after "
-          "getConnectionInMultiuserMode %d",
-          isUserNeedToReAuthenticate);
       if (conn != nullptr) {  // need to chk whether user is already
                               // authenticated to this endpoint or not.
         isUserNeedToReAuthenticate =
@@ -1420,8 +1360,7 @@
         LOGFINE(
             "Need to refresh pr-meta-data timeout in client only  with refresh "
             "metadata");
-        ThinClientRegion* tcrRegion =
-            dynamic_cast<ThinClientRegion*>(region.get());
+        auto* tcrRegion = dynamic_cast<ThinClientRegion*>(region.get());
         tcrRegion->setMetaDataRefreshed(false);
         m_clientMetadataService->enqueueForMetadataRefresh(
             region->getFullPath(), reply.getserverGroupVersion());
@@ -1501,7 +1440,7 @@
                         request.getMessageType() ==
                             TcrMessage::EXECUTE_REGION_FUNCTION_SINGLE_HOP);
           if (conn) {
-            GF_SAFE_DELETE_CON(conn)
+            GF_SAFE_DELETE_CON(conn);
           }
           excludeServers.insert(ServerLocation(ep->name()));
         }
@@ -1550,8 +1489,7 @@
                            // refresh
           {
             LOGFINE("Need to refresh pr-meta-data");
-            ThinClientRegion* tcrRegion =
-                dynamic_cast<ThinClientRegion*>(region.get());
+            auto* tcrRegion = dynamic_cast<ThinClientRegion*>(region.get());
             tcrRegion->setMetaDataRefreshed(false);
           }
           m_clientMetadataService->enqueueForMetadataRefresh(
@@ -2107,9 +2045,7 @@
     m_pingSema.acquire();
     if (isRunning && !m_connManager.isNetDown()) {
       pingServerLocal();
-      while (m_pingSema.tryacquire() != -1) {
-        ;
-      }
+      m_pingSema.acquire();
     }
   }
   LOGFINE("Ending ping thread for pool %s", m_poolName.c_str());
@@ -2126,9 +2062,7 @@
           *(m_connManager.getCacheImpl()->getCache()));
       // this call for cpp client
       m_connManager.getCacheImpl()->getPdxTypeRegistry()->clear();
-      while (m_cliCallbackSema.tryacquire() != -1) {
-        ;
-      }
+      m_cliCallbackSema.acquire();
     }
   }
   LOGFINE("Ending cliCallback thread for pool %s", m_poolName.c_str());
@@ -2179,12 +2113,11 @@
 
   if (conn && candidateForDeletion) {
     TcrEndpoint* endPt = conn->getEndpointObject();
-    bool queue = false;
     {
       ACE_Guard<ACE_Recursive_Thread_Mutex> poolguard(m_queueLock);  // PXR
       std::lock_guard<decltype(endPt->getQueueHostedMutex())> guardQueue(
           endPt->getQueueHostedMutex());
-      queue = endPt->isQueueHosted();
+      bool queue = endPt->isQueueHosted();
       if (queue) {
         TcrConnection* connTemp = getFromEP(endPt);
         if (connTemp) {
@@ -2202,12 +2135,8 @@
 
 bool ThinClientPoolDM::excludeServer(std::string endpoint,
                                      std::set<ServerLocation>& excludeServers) {
-  if (excludeServers.size() == 0 ||
-      excludeServers.find(ServerLocation(endpoint)) == excludeServers.end()) {
-    return false;
-  } else {
-    return true;
-  }
+  return !(excludeServers.empty() || excludeServers.find(ServerLocation(
+                                         endpoint)) == excludeServers.end());
 }
 
 bool ThinClientPoolDM::excludeConnection(
@@ -2217,8 +2146,7 @@
 
 TcrConnection* ThinClientPoolDM::getFromEP(TcrEndpoint* theEP) {
   ACE_Guard<ACE_Recursive_Thread_Mutex> _guard(m_queueLock);
-  for (std::deque<TcrConnection*>::iterator itr = m_queue.begin();
-       itr != m_queue.end(); itr++) {
+  for (auto itr = m_queue.begin(); itr != m_queue.end(); itr++) {
     if ((*itr)->getEndpointObject() == theEP) {
       LOGDEBUG("ThinClientPoolDM::getFromEP got connection");
       TcrConnection* retVal = *itr;
@@ -2232,7 +2160,7 @@
 
 void ThinClientPoolDM::removeEPConnections(TcrEndpoint* theEP) {
   ACE_Guard<ACE_Recursive_Thread_Mutex> _guard(m_queueLock);
-  int32_t size = static_cast<int32_t>(m_queue.size());
+  auto size = static_cast<int32_t>(m_queue.size());
   int numConn = 0;
 
   while (size--) {
@@ -2280,11 +2208,6 @@
   return returnT;
 }
 
-bool ThinClientPoolDM::exclude(TcrConnection* conn,
-                               std::set<ServerLocation>& excludeServers) {
-  return excludeConnection(conn, excludeServers);
-}
-
 void ThinClientPoolDM::incRegionCount() {
   ACE_Guard<ACE_Recursive_Thread_Mutex> _guard(m_queueLock);
 
@@ -2327,7 +2250,7 @@
       new DataOutput(m_connManager.getCacheImpl()->createDataOutput()));
   TcrMessageReply reply(true, nullptr);
 
-  GfErrType err = sendSyncRequest(request, reply);
+  auto err = sendSyncRequest(request, reply);
 
   if (err == GF_NOERR) {
     switch (reply.getMessageType()) {
@@ -2380,7 +2303,7 @@
   match = false;
   std::shared_ptr<BucketServerLocation> slTmp = nullptr;
   if (request.forTransaction()) {
-    bool connFound =
+    connFound =
         m_manager->getStickyConnection(conn, error, excludeServers, true);
     auto txState = TSSTXStateWrapper::get().getTXState();
     if (*error == GF_NOERR && !connFound &&
@@ -2408,7 +2331,7 @@
     }
     if (slTmp != nullptr && m_clientMetadataService != nullptr) {
       if (m_clientMetadataService->isBucketMarkedForTimeout(
-              request.getRegionName().c_str(), slTmp->getBucketId()) == true) {
+              request.getRegionName().c_str(), slTmp->getBucketId())) {
         *error = GF_CLIENT_WAIT_TIMEOUT;
         return nullptr;
       }
@@ -2475,7 +2398,7 @@
       m_connManager.m_cleanupSema, m_connManager.m_redundancySema, this);
 }
 
-GfErrType FunctionExecution::execute(void) {
+GfErrType FunctionExecution::execute() {
   GuardUserAttributes gua;
 
   if (m_userAttr) {
@@ -2488,10 +2411,10 @@
           m_poolDM->getConnectionManager().getCacheImpl()->createDataOutput()),
       funcName, m_args, m_getResult, m_poolDM, m_timeout);
   TcrMessageReply reply(true, m_poolDM);
-  ChunkedFunctionExecutionResponse* resultProcessor(
+  auto resultProcessor = std::unique_ptr<ChunkedFunctionExecutionResponse>(
       new ChunkedFunctionExecutionResponse(reply, (m_getResult & 2) == 2, *m_rc,
                                            m_resultCollectorLock));
-  reply.setChunkedResultHandler(resultProcessor);
+  reply.setChunkedResultHandler(resultProcessor.get());
   reply.setTimeout(m_timeout);
   reply.setDM(m_poolDM);
 
@@ -2503,8 +2426,6 @@
   m_error = m_poolDM->handleEPError(m_ep, reply, m_error);
   if (m_error != GF_NOERR) {
     if (m_error == GF_NOTCON || m_error == GF_IOERR) {
-      delete resultProcessor;
-      resultProcessor = nullptr;
       return GF_NOERR;  // if server is unavailable its not an error for
       // functionexec OnServers() case
     }
@@ -2514,8 +2435,6 @@
       exceptionPtr = CacheableString::create(reply.getException());
     }
 
-    delete resultProcessor;
-    resultProcessor = nullptr;
     return m_error;
   } else if (reply.getMessageType() == TcrMessage::EXCEPTION ||
              reply.getMessageType() == TcrMessage::EXECUTE_FUNCTION_ERROR) {
@@ -2523,10 +2442,7 @@
                                                       reply.getException());
     exceptionPtr = CacheableString::create(reply.getException());
   }
-  if (resultProcessor->getResult() == true) {
-  }
-  delete resultProcessor;
-  resultProcessor = nullptr;
+
   return m_error;
 }
 
diff --git a/cppcache/src/ThinClientPoolDM.hpp b/cppcache/src/ThinClientPoolDM.hpp
index 79e7506..782f2ff 100644
--- a/cppcache/src/ThinClientPoolDM.hpp
+++ b/cppcache/src/ThinClientPoolDM.hpp
@@ -242,8 +242,6 @@
   GfErrType sendUserCredentials(std::shared_ptr<Properties> credentials,
                                 TcrConnection*& conn, bool isBGThread,
                                 bool& isServerException);
-  TcrConnection* getConnectionInMultiuserMode(
-      std::shared_ptr<UserAttributes> userAttribute);
 
   // get endpoint using the endpoint string
   TcrEndpoint* getEndpoint(const std::string& epNameStr);
diff --git a/cppcache/src/util/exception.hpp b/cppcache/src/util/exception.hpp
index c148390..6e472b4 100644
--- a/cppcache/src/util/exception.hpp
+++ b/cppcache/src/util/exception.hpp
@@ -34,11 +34,11 @@
                                                         GfErrType err);
 
 #define throwExceptionIfError(str, err)  \
-  {                                      \
+  do {                                   \
     if (err != GF_NOERR) {               \
       GfErrTypeThrowException(str, err); \
     }                                    \
-  }
+  } while (0)
 
 }  // namespace client
 }  // namespace geode
