Skip to content

Commit

Permalink
Added init path setup and strf_time function
Browse files Browse the repository at this point in the history
  • Loading branch information
aristocratos committed May 22, 2021
1 parent 81f2284 commit b5e709d
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 19 deletions.
44 changes: 39 additions & 5 deletions btop.cpp
Expand Up @@ -78,6 +78,12 @@ namespace Global {

string banner;
const uint banner_width = 49;

fs::path conf_dir;
fs::path conf_file;
fs::path logfile;
fs::path theme_folder;
fs::path user_theme_folder;
}


Expand Down Expand Up @@ -145,22 +151,50 @@ string my_worker(int x){
//? --------------------------------------------- Main starts here! ---------------------------------------------------
int main(int argc, char **argv){

// using namespace std;

//? Init

cout.setf(std::ios::boolalpha);
if (argc > 1) argumentParser(argc, argv);

if (!string(getenv("LANG")).ends_with("UTF-8") && !string(getenv("LANG")).ends_with("utf-8")) {
cout << "WARNING: No UTF-8 locale was detected! Symbols might not look as intended." << endl;
}

#if defined(LINUX)
//? Linux init
Global::proc_path = (fs::is_directory(fs::path("/proc")) && access("/proc", R_OK) != -1) ? fs::path("/proc") : Global::proc_path;
Global::proc_path = (fs::is_directory(fs::path("/proc")) && access("/proc", R_OK) != -1) ? "/proc" : "";
if (Global::proc_path.empty()) {
cout << "ERROR: Proc filesystem not found/readable!" << endl;
cout << "ERROR: Proc filesystem not found or no permission to read from it!" << endl;
exit(1);
}
#endif

//? Setup paths for config, log and themes
for (auto env : {"XDG_CONFIG_HOME", "HOME"}) {
if (getenv(env) != NULL && access(getenv(env), W_OK) != -1) {
Global::conf_dir = fs::path(getenv(env)) / (((string)env == "HOME") ? ".config/btop" : "btop");
break;
}
}
if (!Global::conf_dir.empty()) {
if (!fs::is_directory(Global::conf_dir) && !fs::create_directories(Global::conf_dir)) {
cout << "WARNING: Could not create or access btop config directory. Logging and config saving disabled." << endl;
}
else {
Global::conf_file = Global::conf_dir / "btop.conf";
Global::logfile = Global::conf_dir / "btop.log";
Global::user_theme_folder = Global::conf_dir / "themes";
if (!fs::exists(Global::user_theme_folder) && !fs::create_directory(Global::user_theme_folder)) Global::user_theme_folder.clear();
}
}
for (auto theme_path : {"/usr/local/share/btop/themes", "/usr/share/btop/themes"}) {
if (access(theme_path, R_OK) != -1) {
Global::theme_folder = theme_path;
break;
}
}


//? Initialize terminal and set options
if (!Term::init()) {
cout << "ERROR: No tty detected!" << endl;
Expand Down Expand Up @@ -320,7 +354,7 @@ int main(int argc, char **argv){
if (avgtimes.size() > 100) avgtimes.pop_back();
cout << pbox << ostring << Fx::reset << "\n" << endl;
cout << Mv::to(Term::height - 4, 1) << "Processes call took: " << rjust(to_string(timestamp), 4) << "ms. Average: " << rjust(to_string(accumulate(avgtimes.begin(), avgtimes.end(), 0) / avgtimes.size()), 3) <<
"ms of " << avgtimes.size() << " samples. Drawing took: " << time_ms() - timestamp2 << "ms. Number of processes: " << Proc::numpids << ". Run count: " << ++rcount << " " << endl;
"ms of " << avgtimes.size() << " samples. Drawing took: " << time_ms() - timestamp2 << "ms. Number of processes: " << Proc::numpids << ". Run count: " << ++rcount << ". Time: " << strf_time("%X ") << endl;

while (time_ms() < tsl) {
if (Input::poll(tsl - time_ms())) key = Input::get();
Expand Down
29 changes: 18 additions & 11 deletions src/btop_linux.h
Expand Up @@ -73,8 +73,8 @@ namespace Proc {
fs::path passwd_path;
fs::file_time_type passwd_time;
uint counter = 0;
auto page_size = sysconf(_SC_PAGE_SIZE);
auto clk_tck = sysconf(_SC_CLK_TCK);
long page_size;
long clk_tck;

}

Expand All @@ -93,7 +93,7 @@ namespace Proc {
};
unordered_map<string, uint> sort_map;

//* proc_info: pid, name, cmd, threads, user, mem, cpu_p, cpu_c, state, tty, cpu_n, p_nice, ppid
//* proc_info: pid, name, cmd, threads, user, mem, cpu_p, cpu_c, state, cpu_n, p_nice, ppid
struct proc_info {
uint pid;
string name, cmd;
Expand Down Expand Up @@ -125,8 +125,6 @@ namespace Proc {
auto sortint = (sort_map.contains(sorting)) ? sort_map[sorting] : 7;
vector<proc_info> procs;
procs.reserve((numpids + 10));
vector<uint> c_pids;
c_pids.reserve((numpids + 10));
numpids = 0;

//* Update uid_user map if /etc/passwd changed since last run
Expand Down Expand Up @@ -164,7 +162,6 @@ namespace Proc {
if (d.is_directory() && isdigit(pid_str[0])) {
numpids++;
pid = stoul(pid_str);
c_pids.push_back(pid);

//* Cache program name, command and username
if (!cache.contains(pid)) {
Expand Down Expand Up @@ -215,14 +212,14 @@ namespace Proc {
continue;
}

//* Get cpu usage, cpu cumulative and threads from /proc/[pid]/stat
//* Parse /proc/[pid]/stat
pread.open(d.path() / "stat");
if (pread.good()) {
instr.clear(); s_pos = 0; c_pos = 0; s_count = 0;
getline(pread, instr);
pread.close();

//? Skip pid and comm field and find comm fields closing ')' to avoid names with whitespace or parenthesis
//? Skip pid and comm field and find comm fields closing ')'
s_pos = instr.find_last_of(')') + 2;

do {
Expand Down Expand Up @@ -329,8 +326,11 @@ namespace Proc {
if (++counter >= 10000 || (filter.empty() && cache.size() > procs.size() + 100)) {
unordered_map<uint, p_cache> r_cache;
counter = 0;
for (auto& p : c_pids) r_cache[p] = cache[p];
cache = move(r_cache);
if (filter.empty()) {
for (auto& p : procs) r_cache[p.pid] = cache[p.pid];
cache = move(r_cache);
}
else cache.clear();
}

tstamp = time_ms();
Expand All @@ -341,7 +341,14 @@ namespace Proc {
//* Initialize needed variables for collect
void init(){
tstamp = time_ms();
passwd_path = (access("/etc/passwd", R_OK) != -1) ? fs::path("/etc/passwd") : passwd_path;
passwd_path = (access("/etc/passwd", R_OK) != -1) ? fs::path("/etc/passwd") : passwd_path; //! add logger error

page_size = sysconf(_SC_PAGE_SIZE); //! add logger error
if (page_size <= 0) page_size = 4096;

clk_tck = sysconf(_SC_CLK_TCK); //! add logger error
if (clk_tck <= 0) clk_tck = 100;

uint i = 0;
for (auto& item : sort_array) sort_map[item] = i++;
}
Expand Down
23 changes: 20 additions & 3 deletions src/btop_tools.h
Expand Up @@ -24,6 +24,9 @@ tab-size = 4
#include <vector>
#include <iostream>
#include <chrono>
#include <ctime>
#include <sstream>
#include <iomanip>
#include <regex>
#include <utility>

Expand Down Expand Up @@ -361,9 +364,9 @@ namespace Tools {
m = sec / 60;
sec %= 60;
if (d>0) out = to_string(d) + "d ";
out += (h<10) ? "0" + to_string(h) + ":" : to_string(h) + ":";
out += (m<10) ? "0" + to_string(m) + ":" : to_string(m) + ":";
out += (sec<10) ? "0" + to_string(sec) : to_string(sec);
out += ((h<10) ? "0" : "") + to_string(h) + ":";
out += ((m<10) ? "0" : "") + to_string(m) + ":";
out += ((sec<10) ? "0" : "") + to_string(sec);
return out;
}

Expand Down Expand Up @@ -433,6 +436,20 @@ namespace Tools {
return repeat(std::move(str), n);
}

//* Return current time in <strf> format
std::string strf_time(std::string strf){
auto now = std::chrono::system_clock::now();
auto in_time_t = std::chrono::system_clock::to_time_t(now);
std::tm bt {};
std::stringstream ss;
ss << std::put_time(localtime_r(&in_time_t, &bt), strf.c_str());
return ss.str();
}

}

namespace Logger {
string cur_date = Tools::strf_time("%Y-%m-%d");
}


Expand Down

0 comments on commit b5e709d

Please sign in to comment.