Issue: #96 - Garbage collect inodeproc once every 50 ui refresh as default.

- Reduce default frequency to avoid performance issue.
- The frequency of it can be modified with `-g` option
  and can be disabled with `-g 0`.
This commit is contained in:
Kondo Takeo
2021-02-17 23:02:27 +09:00
parent 12dbf5e28a
commit b97fb4cfdf
3 changed files with 20 additions and 3 deletions

View File

@@ -235,7 +235,8 @@ static quad_t get_ms() {
static void get_pids(std::set<pid_t> *pids) {
DIR *proc = opendir("/proc");
if (proc == 0) {
std::cerr << "Error reading /proc, needed to get inode-to-pid-mapping" << std::endl;
std::cerr << "Error reading /proc, needed to get inode-to-pid-mapping"
<< std::endl;
exit(1);
}
dirent *entry;

View File

@@ -46,6 +46,8 @@ static void help(bool iserror) {
output << " -a : monitor all devices, even loopback/stopped "
"ones.\n";
output << " -C : capture TCP and UDP.\n";
output << " -g : garbage collection period in number of refresh. "
"default is 50.\n";
output << " -f : EXPERIMENTAL: specify string pcap filter (like "
"tcpdump)."
" This may be removed or changed in a future version.\n";
@@ -140,9 +142,10 @@ int main(int argc, char **argv) {
int promisc = 0;
bool all = false;
char *filter = NULL;
int garbage_collection_period = 50;
int opt;
while ((opt = getopt(argc, argv, "Vhbtpsd:v:c:laf:C")) != -1) {
while ((opt = getopt(argc, argv, "Vhbtpsd:v:c:laf:Cg:")) != -1) {
switch (opt) {
case 'V':
versiondisplay();
@@ -184,6 +187,9 @@ int main(int argc, char **argv) {
case 'C':
catchall = true;
break;
case 'g':
garbage_collection_period = (time_t)atoi(optarg);
break;
default:
help(true);
exit(EXIT_FAILURE);
@@ -294,6 +300,7 @@ int main(int argc, char **argv) {
struct dpargs *userdata = (dpargs *)malloc(sizeof(struct dpargs));
// Main loop:
int refresh_count = 0;
while (1) {
bool packets_read = false;
@@ -322,7 +329,12 @@ int main(int argc, char **argv) {
ui_tick();
}
do_refresh();
garbage_collect_processes();
++refresh_count;
if ((garbage_collection_period > 0) &&
(refresh_count % garbage_collection_period == 0)) {
garbage_collect_processes();
}
}
// if not packets, do a select() until next packet