/* PIP - Platform Independent Primitives Introspection module - implementation of containers Copyright (C) 2019 Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "piintrospection_containers_p.h" #include PIIntrospectionContainers::Type::Type() { count = items = 0u; bytes_allocated = bytes_used = 0U; } PIIntrospectionContainers::PIIntrospectionContainers() { //printf("PIIntrospectionContainers %p\n", this); crc = standardCRC_32(); } void PIIntrospectionContainers::containerNew(const char * tn) { uint id = typeID(tn); PIMutexLocker _ml(mutex); //printf("containerNew lock\n"); typenames[id] = tn; data[id].count++; //printf("containerNew unlock\n"); } void PIIntrospectionContainers::containerDelete(const char * tn) { PIMutexLocker _ml(mutex); data[typeID(tn)].count--; } 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; } uint PIIntrospectionContainers::typeID(const char * tn) { if (!tn) return 0u; size_t l = strlen(tn); if (l == 0) return 0u; return crc.calculate(tn, int(l)); } PIByteArray & operator <<(PIByteArray & s, const std::map & v) { PIMap m; for (typename std::map::const_iterator i = v.cbegin(); i != v.cend(); ++i) { m[i->first] = PIStringAscii(i->second.c_str()); } s << m; return s; } PIByteArray & operator <<(PIByteArray & s, const PIIntrospectionContainers::Type & v) { s << v.count << v.items << v.bytes_allocated << v.bytes_used; return s; } PIByteArray & operator >>(PIByteArray & s, PIIntrospectionContainers::Type & v) { s >> v.count >> v.items >> v.bytes_allocated >> v.bytes_used; return s; }