Loading ndb/include/mgmapi/mgmapi.h +1 −0 Original line number Diff line number Diff line Loading @@ -733,6 +733,7 @@ extern "C" { int param, unsigned long long * value); int ndb_mgm_get_string_parameter(const ndb_mgm_configuration_iterator*, int param, const char ** value); int ndb_mgm_purge_stale_sessions(NdbMgmHandle handle, char **); #ifdef __cplusplus } #endif Loading ndb/include/util/Bitmask.hpp +34 −0 Original line number Diff line number Diff line Loading @@ -104,6 +104,11 @@ public: */ static void bitXOR(unsigned size, Uint32 data[], const Uint32 data2[]); /** * bitXORC - Bitwise (x ^ ~y) into first operand. */ static void bitXORC(unsigned size, Uint32 data[], const Uint32 data2[]); /** * contains - Check if all bits set in data2 are set in data */ Loading Loading @@ -261,6 +266,14 @@ BitmaskImpl::bitXOR(unsigned size, Uint32 data[], const Uint32 data2[]) } } inline void BitmaskImpl::bitXORC(unsigned size, Uint32 data[], const Uint32 data2[]) { for (unsigned i = 0; i < size; i++) { data[i] ^= ~data2[i]; } } inline bool BitmaskImpl::contains(unsigned size, Uint32 data[], const Uint32 data2[]) { Loading Loading @@ -451,6 +464,12 @@ public: static void bitXOR(Uint32 data[], const Uint32 data2[]); BitmaskPOD<size>& bitXOR(const BitmaskPOD<size>& mask2); /** * bitXORC - Bitwise (x ^ ~y) into first operand. */ static void bitXORC(Uint32 data[], const Uint32 data2[]); BitmaskPOD<size>& bitXORC(const BitmaskPOD<size>& mask2); /** * contains - Check if all bits set in data2 (that) are also set in data (this) */ Loading Loading @@ -712,6 +731,21 @@ BitmaskPOD<size>::bitXOR(const BitmaskPOD<size>& mask2) return *this; } template <unsigned size> inline void BitmaskPOD<size>::bitXORC(Uint32 data[], const Uint32 data2[]) { BitmaskImpl::bitXORC(size,data, data2); } template <unsigned size> inline BitmaskPOD<size>& BitmaskPOD<size>::bitXORC(const BitmaskPOD<size>& mask2) { BitmaskPOD<size>::bitXORC(rep.data, mask2.rep.data); return *this; } template <unsigned size> char * BitmaskPOD<size>::getText(const Uint32 data[], char* buf) Loading ndb/include/util/SocketServer.hpp +3 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ public: public: virtual ~Session() {} virtual void runSession(){} virtual void stopSession(){} virtual void stopSession(){ m_stop = true; } protected: friend class SocketServer; friend void* sessionThread_C(void*); Loading Loading @@ -98,6 +98,8 @@ public: */ void stopSessions(bool wait = false); void foreachSession(void (*f)(SocketServer::Session*, void*), void *data); private: struct SessionInstance { Service * m_service; Loading ndb/src/common/util/SocketServer.cpp +13 −2 Original line number Diff line number Diff line Loading @@ -258,6 +258,15 @@ transfer(NDB_SOCKET_TYPE sock){ return true; } void SocketServer::foreachSession(void (*func)(SocketServer::Session*, void *), void *data) { for(int i = m_sessions.size() - 1; i >= 0; i--){ (*func)(m_sessions[i].m_session, data); } checkSessions(); } void SocketServer::checkSessions(){ for(int i = m_sessions.size() - 1; i >= 0; i--){ Loading @@ -278,8 +287,10 @@ void SocketServer::stopSessions(bool wait){ int i; for(i = m_sessions.size() - 1; i>=0; i--) m_sessions[i].m_session->m_stop = true; { m_sessions[i].m_session->stopSession(); m_sessions[i].m_session->m_stop = true; // to make sure } for(i = m_services.size() - 1; i>=0; i--) m_services[i].m_service->stopSessions(); Loading ndb/src/mgmapi/mgmapi.cpp +42 −0 Original line number Diff line number Diff line Loading @@ -1834,4 +1834,46 @@ ndb_mgm_set_string_parameter(NdbMgmHandle handle, return res; } extern "C" int ndb_mgm_purge_stale_sessions(NdbMgmHandle handle, char **purged){ CHECK_HANDLE(handle, 0); CHECK_CONNECTED(handle, 0); Properties args; const ParserRow<ParserDummy> reply[]= { MGM_CMD("purge stale sessions reply", NULL, ""), MGM_ARG("purged", String, Optional, ""), MGM_ARG("result", String, Mandatory, "Error message"), MGM_END() }; const Properties *prop; prop= ndb_mgm_call(handle, reply, "purge stale sessions", &args); if(prop == NULL) { SET_ERROR(handle, EIO, "Unable to purge stale sessions"); return -1; } int res= -1; do { const char * buf; if(!prop->get("result", &buf) || strcmp(buf, "Ok") != 0){ ndbout_c("ERROR Message: %s\n", buf); break; } if (purged) { if (prop->get("purged", &buf)) *purged= strdup(buf); else *purged= 0; } res= 0; } while(0); delete prop; return res; } template class Vector<const ParserRow<ParserDummy>*>; Loading
ndb/include/mgmapi/mgmapi.h +1 −0 Original line number Diff line number Diff line Loading @@ -733,6 +733,7 @@ extern "C" { int param, unsigned long long * value); int ndb_mgm_get_string_parameter(const ndb_mgm_configuration_iterator*, int param, const char ** value); int ndb_mgm_purge_stale_sessions(NdbMgmHandle handle, char **); #ifdef __cplusplus } #endif Loading
ndb/include/util/Bitmask.hpp +34 −0 Original line number Diff line number Diff line Loading @@ -104,6 +104,11 @@ public: */ static void bitXOR(unsigned size, Uint32 data[], const Uint32 data2[]); /** * bitXORC - Bitwise (x ^ ~y) into first operand. */ static void bitXORC(unsigned size, Uint32 data[], const Uint32 data2[]); /** * contains - Check if all bits set in data2 are set in data */ Loading Loading @@ -261,6 +266,14 @@ BitmaskImpl::bitXOR(unsigned size, Uint32 data[], const Uint32 data2[]) } } inline void BitmaskImpl::bitXORC(unsigned size, Uint32 data[], const Uint32 data2[]) { for (unsigned i = 0; i < size; i++) { data[i] ^= ~data2[i]; } } inline bool BitmaskImpl::contains(unsigned size, Uint32 data[], const Uint32 data2[]) { Loading Loading @@ -451,6 +464,12 @@ public: static void bitXOR(Uint32 data[], const Uint32 data2[]); BitmaskPOD<size>& bitXOR(const BitmaskPOD<size>& mask2); /** * bitXORC - Bitwise (x ^ ~y) into first operand. */ static void bitXORC(Uint32 data[], const Uint32 data2[]); BitmaskPOD<size>& bitXORC(const BitmaskPOD<size>& mask2); /** * contains - Check if all bits set in data2 (that) are also set in data (this) */ Loading Loading @@ -712,6 +731,21 @@ BitmaskPOD<size>::bitXOR(const BitmaskPOD<size>& mask2) return *this; } template <unsigned size> inline void BitmaskPOD<size>::bitXORC(Uint32 data[], const Uint32 data2[]) { BitmaskImpl::bitXORC(size,data, data2); } template <unsigned size> inline BitmaskPOD<size>& BitmaskPOD<size>::bitXORC(const BitmaskPOD<size>& mask2) { BitmaskPOD<size>::bitXORC(rep.data, mask2.rep.data); return *this; } template <unsigned size> char * BitmaskPOD<size>::getText(const Uint32 data[], char* buf) Loading
ndb/include/util/SocketServer.hpp +3 −1 Original line number Diff line number Diff line Loading @@ -37,7 +37,7 @@ public: public: virtual ~Session() {} virtual void runSession(){} virtual void stopSession(){} virtual void stopSession(){ m_stop = true; } protected: friend class SocketServer; friend void* sessionThread_C(void*); Loading Loading @@ -98,6 +98,8 @@ public: */ void stopSessions(bool wait = false); void foreachSession(void (*f)(SocketServer::Session*, void*), void *data); private: struct SessionInstance { Service * m_service; Loading
ndb/src/common/util/SocketServer.cpp +13 −2 Original line number Diff line number Diff line Loading @@ -258,6 +258,15 @@ transfer(NDB_SOCKET_TYPE sock){ return true; } void SocketServer::foreachSession(void (*func)(SocketServer::Session*, void *), void *data) { for(int i = m_sessions.size() - 1; i >= 0; i--){ (*func)(m_sessions[i].m_session, data); } checkSessions(); } void SocketServer::checkSessions(){ for(int i = m_sessions.size() - 1; i >= 0; i--){ Loading @@ -278,8 +287,10 @@ void SocketServer::stopSessions(bool wait){ int i; for(i = m_sessions.size() - 1; i>=0; i--) m_sessions[i].m_session->m_stop = true; { m_sessions[i].m_session->stopSession(); m_sessions[i].m_session->m_stop = true; // to make sure } for(i = m_services.size() - 1; i>=0; i--) m_services[i].m_service->stopSessions(); Loading
ndb/src/mgmapi/mgmapi.cpp +42 −0 Original line number Diff line number Diff line Loading @@ -1834,4 +1834,46 @@ ndb_mgm_set_string_parameter(NdbMgmHandle handle, return res; } extern "C" int ndb_mgm_purge_stale_sessions(NdbMgmHandle handle, char **purged){ CHECK_HANDLE(handle, 0); CHECK_CONNECTED(handle, 0); Properties args; const ParserRow<ParserDummy> reply[]= { MGM_CMD("purge stale sessions reply", NULL, ""), MGM_ARG("purged", String, Optional, ""), MGM_ARG("result", String, Mandatory, "Error message"), MGM_END() }; const Properties *prop; prop= ndb_mgm_call(handle, reply, "purge stale sessions", &args); if(prop == NULL) { SET_ERROR(handle, EIO, "Unable to purge stale sessions"); return -1; } int res= -1; do { const char * buf; if(!prop->get("result", &buf) || strcmp(buf, "Ok") != 0){ ndbout_c("ERROR Message: %s\n", buf); break; } if (purged) { if (prop->get("purged", &buf)) *purged= strdup(buf); else *purged= 0; } res= 0; } while(0); delete prop; return res; } template class Vector<const ParserRow<ParserDummy>*>;