diff --git a/src/process.cpp b/src/process.cpp index 5f42d26..b750590 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -83,10 +83,12 @@ float togbps(u_int64_t bytes) { return (((double)bytes) / PERIOD) / GB; } void process_init() { unknowntcp = new Process(0, "", "unknown TCP"); + unknowntcp->keep = true; processes = new ProcList(unknowntcp, NULL); if (catchall) { unknownudp = new Process(0, "", "unknown UDP"); + unknownudp->keep = true; processes = new ProcList(unknownudp, processes); // unknownip = new Process (0, "", "unknown IP"); // processes = new ProcList (unknownip, processes); @@ -449,4 +451,29 @@ void remove_timed_out_processes() { } } -void garbage_collect_processes() { garbage_collect_inodeproc(); } +void garbage_collect_processes() +{ + garbage_collect_inodeproc(); + + ProcList *previousproc = NULL; + ProcList *curProc = processes; + while (curProc != NULL) { + Process *curProcVal = curProc->getVal(); + if (curProcVal->connections.empty() && curProcVal->keep == false) { + ProcList *toDelete = curProc; + if (previousproc == NULL) { + processes = curProc->next; + }else + { + previousproc->next = curProc->next; + } + curProc = curProc->next; + delete curProcVal; + delete toDelete; + } else { + previousproc = curProc; + curProc = curProc->next; + } + } + +} diff --git a/src/process.h b/src/process.h index 7130bb1..b23c467 100644 --- a/src/process.h +++ b/src/process.h @@ -79,6 +79,7 @@ public: rcvd_by_closed_bytes = 0; sent_last_reported = 0; rcvd_last_reported = 0; + keep = false; } void check() { assert(pid >= 0); } @@ -117,6 +118,8 @@ public: unsigned long getInode() { return inode; } + bool keep; + private: const unsigned long inode; uid_t uid;