From 1f527d8e1411393d3b6c15914d9fdc6d4845ebd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Sat, 22 Jun 2019 20:37:09 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/pip@804 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5 --- src_main/containers/pideque.h | 2 + src_main/core/pistring.h | 45 ++++++++++--------- src_main/introspection/piintrospection_base.h | 10 ++++- .../piintrospection_containers.cpp | 2 + .../piintrospection_containers.h | 8 ++-- .../piintrospection_containers_p.cpp | 9 ++++ .../introspection/piintrospection_server.cpp | 28 +++++++----- .../introspection/piintrospection_server.h | 3 +- .../piintrospection_server_p.cpp | 26 +++++++++++ .../introspection/piintrospection_server_p.h | 15 +++++++ .../introspection/piintrospection_threads.cpp | 2 + .../introspection/piintrospection_threads.h | 2 +- 12 files changed, 110 insertions(+), 42 deletions(-) diff --git a/src_main/containers/pideque.h b/src_main/containers/pideque.h index 5d4abbf0..4b65cb9c 100755 --- a/src_main/containers/pideque.h +++ b/src_main/containers/pideque.h @@ -35,6 +35,7 @@ template class PIDeque { public: inline PIDeque(): pid_data(0), pid_size(0), pid_rsize(0), pid_start(0) { + //piCout << "PIDeque"; PIINTROSPECTION_CONTAINER_NEW(T) } inline PIDeque(const PIDeque & other): pid_data(0), pid_size(0), pid_rsize(0), pid_start(0) { @@ -52,6 +53,7 @@ public: resize(pid_size, f); } inline virtual ~PIDeque() { + //piCout << "~PIDeque"; PIINTROSPECTION_CONTAINER_DELETE(T) PIINTROSPECTION_CONTAINER_FREE(T, (pid_rsize)*sizeof(T)) deleteT(pid_data + pid_start, pid_size); diff --git a/src_main/core/pistring.h b/src_main/core/pistring.h index 4f9a4eff..f0adf1a1 100755 --- a/src_main/core/pistring.h +++ b/src_main/core/pistring.h @@ -26,6 +26,7 @@ #define PISTRING_H #include "pibytearray.h" + #define PIStringAscii PIString::fromAscii @@ -36,7 +37,7 @@ class PIP_EXPORT PIString: public PIDeque friend PIByteArray & operator >>(PIByteArray & s, PIString & v); public: //! Contructs an empty string - PIString(): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--;} + PIString(): PIDeque() {} //inline PIString & operator +=(const char c) {push_back(c); return *this;} PIString & operator +=(const PIChar & c) {push_back(c); return *this;} @@ -46,55 +47,55 @@ public: PIString & operator +=(const PIString & str); //PIString(const char c) {*this += c;} - PIString(const PIString & o): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this += o;} + PIString(const PIString & o): PIDeque() {*this += o;} //! Contructs string with single symbol "c" - PIString(const PIChar & c): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this += c;} - PIString(const char c): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this += PIChar(c);} + PIString(const PIChar & c): PIDeque() {*this += c;} + PIString(const char c): PIDeque() {*this += PIChar(c);} /*! \brief Contructs string from c-string "str" * \details "str" should be null-terminated\n * Example: \snippet pistring.cpp PIString(char * ) */ - PIString(const char * str): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this += str;} + PIString(const char * str): PIDeque() {*this += str;} /*! \brief Contructs string from \c wchar_t c-string "str" * \details "str" should be null-terminated\n * Example: \snippet pistring.cpp PIString(wchar_t * ) */ - PIString(const wchar_t * str): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this += str;} + PIString(const wchar_t * str): PIDeque() {*this += str;} //! Contructs string from byte array "ba" - PIString(const PIByteArray & ba): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this += ba;} + PIString(const PIByteArray & ba): PIDeque() {*this += ba;} //! \brief Contructs string from "len" characters of buffer "str" - PIString(const PIChar * str, const int len): PIDeque(str, size_t(len)) {/*reserve(4); */piMonitor.strings++; piMonitor.containers--;} + PIString(const PIChar * str, const int len): PIDeque(str, size_t(len)) {} /*! \brief Contructs string from "len" characters of buffer "str" * \details Example: \snippet pistring.cpp PIString(char * , int) */ - PIString(const char * str, const int len): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; appendFromChars(str, len);} + PIString(const char * str, const int len): PIDeque() {appendFromChars(str, len);} /*! \brief Contructs string as sequence of characters "c" of buffer with length "len" * \details Example: \snippet pistring.cpp PIString(int, char) */ - PIString(const int len, const char c): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; for (int i = 0; i < len; ++i) push_back(c);} + PIString(const int len, const char c): PIDeque() {for (int i = 0; i < len; ++i) push_back(c);} /*! \brief Contructs string as sequence of symbols "c" of buffer with length "len" * \details Example: \snippet pistring.cpp PIString(int, PIChar) */ - PIString(const int len, const PIChar & c): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; for (int i = 0; i < len; ++i) push_back(c);} + PIString(const int len, const PIChar & c): PIDeque() {for (int i = 0; i < len; ++i) push_back(c);} -// PIString(const short & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const ushort & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const int & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const uint & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const long & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const ulong & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const llong & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const ullong & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const float & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} -// PIString(const double & value): PIDeque() {/*reserve(4); */piMonitor.strings++; piMonitor.containers--; *this = fromNumber(value);} +// PIString(const short & value): PIDeque() {*this = fromNumber(value);} +// PIString(const ushort & value): PIDeque() {*this = fromNumber(value);} +// PIString(const int & value): PIDeque() {*this = fromNumber(value);} +// PIString(const uint & value): PIDeque() {*this = fromNumber(value);} +// PIString(const long & value): PIDeque() {*this = fromNumber(value);} +// PIString(const ulong & value): PIDeque() {*this = fromNumber(value);} +// PIString(const llong & value): PIDeque() {*this = fromNumber(value);} +// PIString(const ullong & value): PIDeque() {*this = fromNumber(value);} +// PIString(const float & value): PIDeque() {*this = fromNumber(value);} +// PIString(const double & value): PIDeque() {*this = fromNumber(value);} - ~PIString() {piMonitor.strings--; piMonitor.containers++;} + ~PIString() {} PIString & operator =(const PIString & o) {if (this == &o) return *this; clear(); *this += o; return *this;} diff --git a/src_main/introspection/piintrospection_base.h b/src_main/introspection/piintrospection_base.h index a6c5a906..ee82c158 100644 --- a/src_main/introspection/piintrospection_base.h +++ b/src_main/introspection/piintrospection_base.h @@ -29,7 +29,13 @@ class PITimer; class PIPeer; class PIIntrospection; -#define __PIINTROSPECTION_SINGLETON__(T) \ - static PIIntrospection##T##Interface * instance() {static PIIntrospection##T##Interface ret; return &ret;} \ +#define __PIINTROSPECTION_SINGLETON_H__(T) \ + static PIIntrospection##T##Interface * instance(); + +#define __PIINTROSPECTION_SINGLETON_CPP__(T) \ + PIIntrospection##T##Interface * PIIntrospection##T##Interface::instance() {\ + static PIIntrospection##T##Interface ret;\ + return &ret;\ + } #endif // PIINTROSPECTION_BASE_H diff --git a/src_main/introspection/piintrospection_containers.cpp b/src_main/introspection/piintrospection_containers.cpp index a723d12f..6c7cdc21 100644 --- a/src_main/introspection/piintrospection_containers.cpp +++ b/src_main/introspection/piintrospection_containers.cpp @@ -20,6 +20,8 @@ #include "piintrospection_containers.h" #include "piintrospection_containers_p.h" +__PIINTROSPECTION_SINGLETON_CPP__(Containers) + PIIntrospectionContainersInterface::PIIntrospectionContainersInterface() { p = new PIIntrospectionContainers(); diff --git a/src_main/introspection/piintrospection_containers.h b/src_main/introspection/piintrospection_containers.h index 46c470d2..fe6fdd63 100644 --- a/src_main/introspection/piintrospection_containers.h +++ b/src_main/introspection/piintrospection_containers.h @@ -24,7 +24,7 @@ class PIIntrospectionContainers; -#define PIINTROSPECTION_CONTAINERS (PIIntrospectionContainersInterface::instance()) +#define PIINTROSPECTION_CONTAINERS (PIIntrospectionContainersInterface::instance())//(PIIntrospectionContainersInterface::instance()) //#if defined(__PIIS__) //# undef __PIIS__ @@ -55,11 +55,12 @@ class PIIntrospectionContainers; # define PIINTROSPECTION_CONTAINER_UNUSED(t, cnt) #endif + class PIP_EXPORT PIIntrospectionContainersInterface { friend class PIIntrospection; friend class PIIntrospectionServer; public: - __PIINTROSPECTION_SINGLETON__(Containers) + __PIINTROSPECTION_SINGLETON_H__(Containers) void containerNew (const char * tn); void containerDelete(const char * tn); @@ -68,12 +69,13 @@ public: void containerUsed (const char * tn, ullong cnt); void containerUnused(const char * tn, ullong cnt); + PIIntrospectionContainers * p; private: PIIntrospectionContainersInterface(); ~PIIntrospectionContainersInterface(); - PIIntrospectionContainers * p; }; + #endif // PIINTROSPECTION_CONTAINERS_H diff --git a/src_main/introspection/piintrospection_containers_p.cpp b/src_main/introspection/piintrospection_containers_p.cpp index 4d9e2b6c..8b8b950b 100644 --- a/src_main/introspection/piintrospection_containers_p.cpp +++ b/src_main/introspection/piintrospection_containers_p.cpp @@ -30,6 +30,7 @@ PIIntrospectionContainers::Type::Type() { PIIntrospectionContainers::PIIntrospectionContainers() { + //printf("PIIntrospectionContainers %p\n", this); crc = standardCRC_32(); } @@ -51,24 +52,32 @@ void PIIntrospectionContainers::containerDelete(const char * tn) { void PIIntrospectionContainers::containerAlloc(const char * tn, ullong cnt) { + //printf(" alloc %s %d\n", tn, cnt); + if (cnt == 0) return; PIMutexLocker _ml(mutex); data[typeID(tn)].bytes_allocated += cnt; } void PIIntrospectionContainers::containerFree(const char * tn, ullong cnt) { + //printf(" free %s %d\n", tn, cnt); + if (cnt == 0) return; PIMutexLocker _ml(mutex); data[typeID(tn)].bytes_allocated -= cnt; } void PIIntrospectionContainers::containerUsed(const char * tn, ullong cnt) { + //printf(" used %s %d\n", tn, cnt); + if (cnt == 0) return; PIMutexLocker _ml(mutex); data[typeID(tn)].bytes_used += cnt; } void PIIntrospectionContainers::containerUnused(const char * tn, ullong cnt) { + //printf("unused %s %d\n", tn, cnt); + if (cnt == 0) return; PIMutexLocker _ml(mutex); data[typeID(tn)].bytes_used -= cnt; } diff --git a/src_main/introspection/piintrospection_server.cpp b/src_main/introspection/piintrospection_server.cpp index 7ecdd0ae..eb77d4e1 100644 --- a/src_main/introspection/piintrospection_server.cpp +++ b/src_main/introspection/piintrospection_server.cpp @@ -29,21 +29,15 @@ PRIVATE_DEFINITION_END(PIIntrospectionServer) PIIntrospectionServer::PIIntrospectionServer(): PIPeer(genName()) { PRIVATE->process_info = PIIntrospection::getInfo(); - CONNECTU(&itimer, tickEvent, this, timerEvent); } PIIntrospectionServer::~PIIntrospectionServer() { - itimer.stop(false); - if (!itimer.waitForFinish(1000)) { - PIINTROSPECTION_CONTAINERS->p->mutex.unlock(); - } PIPeer::stop(); } void PIIntrospectionServer::start() { - itimer.start(1000); PIPeer::start(); } @@ -54,14 +48,24 @@ PIString PIIntrospectionServer::genName() { } -void PIIntrospectionServer::timerEvent() { +void PIIntrospectionServer::dataReceived(const PIString & from, const PIByteArray & data) { + if (data.size() < 8) return; + PIByteArray rba(data); + uint _sign(0); rba >> _sign; + if (_sign != PIIntrospection::sign) return; + PIIntrospection::RequiredInfo ri; + rba >> ri; PIChunkStream cs; - cs.add(1, PIIntrospection::packInfo()) - .add(2, PIIntrospection::packContainers()) - .add(3, PIIntrospection::packThreads()) - .add(4, PIIntrospection::packObjects()); + if (ri.types[PIIntrospection::itInfo]) + cs.add(PIIntrospection::itInfo, PIIntrospection::packInfo()); + if (ri.types[PIIntrospection::itContainers]) + cs.add(PIIntrospection::itContainers, PIIntrospection::packContainers()); + if (ri.types[PIIntrospection::itThreads]) + cs.add(PIIntrospection::itThreads, PIIntrospection::packThreads()); + if (ri.types[PIIntrospection::itObjects]) + cs.add(PIIntrospection::itObjects, PIIntrospection::packObjects()); PIByteArray ba; ba << PIIntrospection::sign; ba.append(cs.data()); - send("__introspection_client__", ba); + send(from, ba); } diff --git a/src_main/introspection/piintrospection_server.h b/src_main/introspection/piintrospection_server.h index 2818f14b..d6546e9e 100644 --- a/src_main/introspection/piintrospection_server.h +++ b/src_main/introspection/piintrospection_server.h @@ -44,12 +44,11 @@ private: ~PIIntrospectionServer(); NO_COPY_CLASS(PIIntrospectionServer) - EVENT_HANDLER(void, timerEvent); PIString genName(); + virtual void dataReceived(const PIString & from, const PIByteArray & data); PRIVATE_DECLARATION PITimer itimer; - }; #endif // PIINTROSPECTION_SERVER_H diff --git a/src_main/introspection/piintrospection_server_p.cpp b/src_main/introspection/piintrospection_server_p.cpp index b6a7cd67..c73b54cf 100644 --- a/src_main/introspection/piintrospection_server_p.cpp +++ b/src_main/introspection/piintrospection_server_p.cpp @@ -29,6 +29,11 @@ const uint PIIntrospection::sign = 0x0F1C2B3A; +PIIntrospection::RequiredInfo::RequiredInfo() { + types = itInfo; +} + + PIIntrospection::ProcessInfo::ProcessInfo() { processorsCount = 0; } @@ -91,6 +96,27 @@ PIByteArray & operator <<(PIByteArray & s, const std::unordered_map>(PIByteArray & b, PIIntrospection::RequiredInfo & v) { + PIByteArray csba; b >> csba; + PIChunkStream cs(csba); + while (!cs.atEnd()) { + switch (cs.read()) { + case 1: cs.get(v.types); break; + default: break; + } + } + return b; +} + + PIByteArray & operator <<(PIByteArray & b, const PIIntrospection::ProcessInfo & v) { PIChunkStream cs; cs.add(1, v.architecture).add(2, v.execCommand).add(3, v.execDateTime).add(4, v.hostname).add(5, v.OS_name) diff --git a/src_main/introspection/piintrospection_server_p.h b/src_main/introspection/piintrospection_server_p.h index 686d6506..4b734e99 100644 --- a/src_main/introspection/piintrospection_server_p.h +++ b/src_main/introspection/piintrospection_server_p.h @@ -30,6 +30,18 @@ class PIIntrospection { public: + enum InfoTypes { + itInfo = 0x01, + itContainers = 0x02, + itObjects = 0x04, + itThreads = 0x08, + }; + + struct RequiredInfo { + RequiredInfo(); + PIFlags types; + }; + struct ProcessInfo { ProcessInfo(); @@ -70,6 +82,9 @@ public: PIByteArray & operator <<(PIByteArray & s, const std::unordered_map & v); +PIByteArray & operator <<(PIByteArray & b, const PIIntrospection::RequiredInfo & v); +PIByteArray & operator >>(PIByteArray & b, PIIntrospection::RequiredInfo & v); + PIByteArray & operator <<(PIByteArray & b, const PIIntrospection::ProcessInfo & v); PIByteArray & operator >>(PIByteArray & b, PIIntrospection::ProcessInfo & v); diff --git a/src_main/introspection/piintrospection_threads.cpp b/src_main/introspection/piintrospection_threads.cpp index 5cf0577f..6ce5d2f0 100644 --- a/src_main/introspection/piintrospection_threads.cpp +++ b/src_main/introspection/piintrospection_threads.cpp @@ -20,6 +20,8 @@ #include "piintrospection_threads.h" #include "piintrospection_threads_p.h" +__PIINTROSPECTION_SINGLETON_CPP__(Threads) + PIIntrospectionThreadsInterface::PIIntrospectionThreadsInterface() { p = new PIIntrospectionThreads(); diff --git a/src_main/introspection/piintrospection_threads.h b/src_main/introspection/piintrospection_threads.h index 27d85a48..f176c331 100644 --- a/src_main/introspection/piintrospection_threads.h +++ b/src_main/introspection/piintrospection_threads.h @@ -47,7 +47,7 @@ class PIIntrospectionThreads; class PIP_EXPORT PIIntrospectionThreadsInterface { friend class PIIntrospection; public: - __PIINTROSPECTION_SINGLETON__(Threads) + __PIINTROSPECTION_SINGLETON_H__(Threads) void threadNew (PIThread * t); void threadDelete (PIThread * t);