Здравствуйте, уважаемые!
У меня 2 потока. один пишет в QList другой оттуда читает и обрабатывает. Работают на mutex и waitcondition.
Все работает, все хорошо. НО! Как только размер List сильно возрастает например до 1 гига. Память после его обработки не очищается или очищается не полностью. Причем так происходит когда с данными работает функция Parce.
Вот код:
Обрабатывающий поток:
void ReadThread::run()
{
ushort portS;
ushort portD;
QString sourceIP;
QString targetIP;
while (!stopped || getUsedSpace()!=0)
{
mutexLock();
while (getUsedSpace() == 0)
{
threadWait();
if (stopped)
break;
}
if (stopped && getUsedSpace()==0)
{
mutexUnlock();
break;
}
pkt_data=&(getPacListAt(0)->pkt[0]);
iph=((ip_header*)pkt_data);
if (iph->type!=0)
{
portS=*((ushort*)(pkt_data+34));
portD=*((ushort*)(pkt_data+36));
revert(portS);
revert(portD);
ToIPString(iph->sourceIP, sourceIP);
ToIPString(iph->targetIP, targetIP);
parce(sourceIP, targetIP,pkt_data, portS, portD, getPacListAt(0)->header);
}
delPacListAt(0);
mutexUnlock();
}
stopped=false;
}
Читающий поток:
void ScanThread::run()
{
while (!stopped)
{
mutexLock();
pacListAdd(tpkt_data, header);
threadWakeAll();
mutexUnlock();
}
threadWakeAll();
stopped=false;
}
Функция parce:
bool ReadThread::parce(const QString &sourceIP, const QString &targetIP,uchar *pkt_data, ushort & portS, ushort & portD, pcap_pkthdr & header)
{
destIPAdd(targetIP,portD);
}
void ReadThread::destIPAdd(const QString &IP, const ushort &port)
{
if (!isFromNetwork(IP))
if (!destIP.contains(IP) && (port>1000 || port==80 || port==8080 || port==443))
{
destIP.insert(IP, port);
emit SdestIPAdd(IP, port);
}
}
Функции работы со списком:
struct packet
{
pcap_pkthdr header;
u_char pkt[pkt_len];
};
static QList<packet *> pacList;
void Global::pacListAdd(const u_char *pkt_data, pcap_pkthdr *h)
{
if (h->len<2000)
{
packet * p=new packet;
p->header=*h;
const u_char *ppkt_data=pkt_data;
for (uint i=0;i<h->len;i++)
p.pkt[i]=*ppkt_data++;
pacList.append(p);
p=NULL;
}
}
void Global::delPacListAt(int pos)
{
delete pacList[pos];
pacList.removeAt(pos);
}
Если убрать все функции обработки и оставить только заполнение + обработку все работает отлично.
Потоки самозабвенно сражаются за память, все чиститься.
Но с функцией память либо вообще не чиститься либо не полностью.
Причем!!! Если в функции обработки добавить : QString Data=""; а остальное убрать, куски памяти все равно чиститься не будут!
Сломал на этом мозг!
Работает все это на Linux. За ответы заранее спасибо!)