commit 146253fedac87717f58a806172d62cc0bed96d9d
parent 1db5b34daa9f6b21a0310575b1941ed844d550fd
Author: Kyle Milz <kyle@0x30.net>
Date: Tue, 23 Aug 2016 22:14:58 -0600
src: split out function to scan process dir
Diffstat:
3 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/src/dump_main.cc b/src/dump_main.cc
@@ -41,6 +41,7 @@ main(int argc, char *argv[])
char *sarg = NULL;
int tflag = 0;
+ pdir.scan();
if (argc == 1)
print_summary(pdir);
diff --git a/src/process_dir.cc b/src/process_dir.cc
@@ -1,35 +1,46 @@
#include "process_dir.h"
-#include <sys/types.h>
-
#include <err.h>
#include <cstdlib> // getenv
#include <cstring>
#include <iostream>
-#include <dirent.h> // opendir, readdir
ProcessDir::ProcessDir()
{
- const char *process_dir;
if (std::getenv("CITRUN_TESTING") != NULL)
- process_dir = "runtime/";
+ m_procdir = "runtime/";
else
- process_dir = "/tmp/citrun/";
+ m_procdir = "/tmp/citrun/";
- DIR *dirp;
- if ((dirp = opendir(process_dir)) == NULL)
+ if ((m_dirp = opendir(m_procdir)) == NULL)
err(1, "opendir");
+}
+
+ProcessDir::~ProcessDir()
+{
+ closedir(m_dirp);
+}
+void
+ProcessDir::scan()
+{
struct dirent *dp;
- while ((dp = readdir(dirp)) != NULL) {
+
+ rewinddir(m_dirp);
+ while ((dp = readdir(m_dirp)) != NULL) {
if (std::strcmp(dp->d_name, ".") == 0 ||
std::strcmp(dp->d_name, "..") == 0)
continue;
- std::string p(process_dir);
+ std::string p(m_procdir);
p.append(dp->d_name);
+ if (m_known_files.find(p) != m_known_files.end())
+ // We already know this file.
+ continue;
+
+ m_known_files.insert(p);
m_procfiles.push_back(ProcessFile(p));
}
}
diff --git a/src/process_dir.h b/src/process_dir.h
@@ -1,12 +1,21 @@
#include "process_file.h"
+#include <sys/types.h>
+
+#include <dirent.h> // DIR, opendir, readdir
+#include <unordered_set>
#include <vector>
class ProcessDir {
public:
ProcessDir();
+ ~ProcessDir();
+ void scan();
std::vector<ProcessFile> m_procfiles;
private:
+ const char *m_procdir;
+ DIR *m_dirp;
+ std::unordered_set<std::string> m_known_files;
};