From 3ba713aabf20279c5d83d039e5a7ac906b79c783 Mon Sep 17 00:00:00 2001 From: Jaume Pujantell Date: Sun, 17 Mar 2024 20:23:18 +0100 Subject: [PATCH] add isMobileApp util function to reduce ifdefs Removed all MOBILEAPP preprocessor conditionals from Util.hpp/.cpp Added isMobileApp function to help remove further conditionals. Signed-off-by: Jaume Pujantell Change-Id: I038a4db47ec2a2c7bb10f5696df5571b13bd9a61 --- Makefile.am | 14 +- android/lib/src/main/cpp/CMakeLists.txt.in | 1 + common/Util-desktop.cpp | 426 +++++++++++++++++++++ common/Util-mobile.cpp | 42 ++ common/Util.cpp | 387 ------------------- common/Util.hpp | 23 +- gtk/Makefile.am | 3 +- ios/Mobile.xcodeproj/project.pbxproj | 4 + test/Makefile.am | 3 +- wasm/Makefile.am | 1 + 10 files changed, 490 insertions(+), 414 deletions(-) create mode 100644 common/Util-desktop.cpp create mode 100644 common/Util-mobile.cpp diff --git a/Makefile.am b/Makefile.am index fe1bade13b..764603e100 100644 --- a/Makefile.am +++ b/Makefile.am @@ -116,6 +116,7 @@ shared_sources = common/FileUtil.cpp \ common/SpookyV2.cpp \ common/Unit.cpp \ common/Util.cpp \ + common/Util-desktop.cpp \ common/ConfigUtil.cpp \ common/Authorization.cpp \ common/CommandControl.cpp \ @@ -180,7 +181,8 @@ connect_SOURCES = tools/Connect.cpp \ common/Log.cpp \ common/Protocol.cpp \ common/StringVector.cpp \ - common/Util.cpp + common/Util.cpp \ + common/Util-desktop.cpp lokitclient_SOURCES = common/Log.cpp \ common/DummyTraceEventEmitter.cpp \ @@ -188,7 +190,8 @@ lokitclient_SOURCES = common/Log.cpp \ common/Protocol.cpp \ common/StringVector.cpp \ common/TraceEvent.cpp \ - common/Util.cpp + common/Util.cpp \ + common/Util-desktop.cpp noinst_LIBRARIES = libsimd.a libsimd_a_SOURCES = kit/DeltaSimd.c @@ -265,7 +268,8 @@ clientnb_SOURCES = net/clientnb.cpp \ common/DummyTraceEventEmitter.cpp \ common/Log.cpp \ common/StringVector.cpp \ - common/Util.cpp + common/Util.cpp \ + common/Util-desktop.cpp coolmount_SOURCES = tools/mount.cpp @@ -276,6 +280,7 @@ coolbench_SOURCES = tools/Benchmark.cpp \ common/Log.cpp \ common/StringVector.cpp \ common/Util.cpp \ + common/Util-desktop.cpp \ common/Simd.cpp coolbench_LDADD = libsimd.a @@ -292,7 +297,8 @@ coolconfig_SOURCES = tools/Config.cpp \ common/Crypto.cpp \ common/Log.cpp \ common/StringVector.cpp \ - common/Util.cpp + common/Util.cpp \ + common/Util-desktop.cpp coolsocketdump_SOURCES = tools/WebSocketDump.cpp \ common/DummyTraceEventEmitter.cpp \ diff --git a/android/lib/src/main/cpp/CMakeLists.txt.in b/android/lib/src/main/cpp/CMakeLists.txt.in index 06a966da3c..45f04353b4 100644 --- a/android/lib/src/main/cpp/CMakeLists.txt.in +++ b/android/lib/src/main/cpp/CMakeLists.txt.in @@ -20,6 +20,7 @@ add_library(androidapp SHARED ../../../../../common/SpookyV2.cpp ../../../../../common/Unit.cpp ../../../../../common/Util.cpp + ../../../../../common/Util-mobile.cpp ../../../../../kit/ChildSession.cpp ../../../../../kit/DeltaSimd.c ../../../../../kit/Kit.cpp diff --git a/common/Util-desktop.cpp b/common/Util-desktop.cpp new file mode 100644 index 0000000000..f904d256bd --- /dev/null +++ b/common/Util-desktop.cpp @@ -0,0 +1,426 @@ +/* + * Copyright the Collabora Online contributors. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include + +#include "Util.hpp" + +#ifdef __linux__ +#include +#elif defined __FreeBSD__ +#include +#endif + +#include +#include + +#include +#include + +#include "Log.hpp" + +namespace Util +{ +bool isMobileApp() { return false; } + +DirectoryCounter::DirectoryCounter(const char* procPath) + : _tasks(opendir(procPath)) +{ + if (!_tasks) + LOG_ERR("No proc mounted, can't count threads"); +} + +DirectoryCounter::~DirectoryCounter() { closedir(reinterpret_cast(_tasks)); } + +int DirectoryCounter::count() +{ + auto dir = reinterpret_cast(_tasks); + + if (!dir) + return -1; + + rewinddir(dir); + + int tasks = 0; + struct dirent* i; + while ((i = readdir(dir))) + { + if (i->d_name[0] != '.') + tasks++; + } + + return tasks; +} + +int spawnProcess(const std::string& cmd, const StringVector& args) +{ + // Create a vector of zero-terminated strings. + std::vector argStrings; + for (const auto& arg : args) + argStrings.push_back(args.getParam(arg)); + + std::vector params; + params.push_back(const_cast(cmd.c_str())); + for (const auto& i : argStrings) + params.push_back(const_cast(i.c_str())); + params.push_back(nullptr); + + pid_t pid = -1; + int status = posix_spawn(&pid, params[0], nullptr, nullptr, params.data(), environ); + if (status < 0) + { + LOG_ERR("Failed to posix_spawn for command '" << cmd); + throw Poco::SystemException("Failed to fork posix_spawn command ", cmd); + } + + return pid; +} + +static const char* startsWith(const char* line, const char* tag, std::size_t tagLen) +{ + assert(strlen(tag) == tagLen); + + std::size_t len = tagLen; + if (!strncmp(line, tag, len)) + { + while (!isdigit(line[len]) && line[len] != '\0') + ++len; + + return line + len; + } + + return nullptr; +} + +std::string getHumanizedBytes(unsigned long nBytes) +{ + constexpr unsigned factor = 1024; + short count = 0; + float val = nBytes; + while (val >= factor && count < 4) + { + val /= factor; + count++; + } + std::string unit; + switch (count) + { + case 0: + unit = ""; + break; + case 1: + unit = "ki"; + break; + case 2: + unit = "Mi"; + break; + case 3: + unit = "Gi"; + break; + case 4: + unit = "Ti"; + break; + default: + assert(false); + } + + unit += 'B'; + std::stringstream ss; + ss << std::fixed << std::setprecision(1) << val << ' ' << unit; + return ss.str(); +} + +std::size_t getTotalSystemMemoryKb() +{ + std::size_t totalMemKb = 0; + FILE* file = fopen("/proc/meminfo", "r"); + if (file != nullptr) + { + char line[4096] = { 0 }; + // coverity[tainted_data_argument : FALSE] - we trust the kernel-provided data + while (fgets(line, sizeof(line), file)) + { + const char* value; + if ((value = startsWith(line, "MemTotal:", 9))) + { + totalMemKb = atoll(value); + break; + } + } + fclose(file); + } + + return totalMemKb; +} + +std::size_t getFromCGroup(const std::string& group, const std::string& key) +{ + std::size_t num = 0; + + std::string groupPath; + FILE* cg = fopen("/proc/self/cgroup", "r"); + if (cg != nullptr) + { + char line[4096] = { 0 }; + while (fgets(line, sizeof(line), cg)) + { + StringVector bits = StringVector::tokenize(line, strlen(line), ':'); + if (bits.size() > 2 && bits[1] == group) + { + groupPath = "/sys/fs/cgroup/" + group + bits[2]; + break; + } + } + LOG_TRC("control group path for " << group << " is " << groupPath); + fclose(cg); + } + + if (groupPath.empty()) + return 0; + + std::string path = groupPath + "/" + key; + LOG_TRC("Read from " << path); + FILE* file = fopen(path.c_str(), "r"); + if (file != nullptr) + { + char line[4096] = { 0 }; + if (fgets(line, sizeof(line), file)) + num = atoll(line); + fclose(file); + } + + return num; +} + +std::size_t getCGroupMemLimit() +{ +#ifdef __linux__ + return getFromCGroup("memory", "memory.limit_in_bytes"); +#else + return 0; +#endif +} + +std::size_t getCGroupMemSoftLimit() +{ +#ifdef __linux__ + return getFromCGroup("memory", "memory.soft_limit_in_bytes"); +#else + return 0; +#endif +} + +std::pair getPssAndDirtyFromSMaps(FILE* file) +{ + std::size_t numPSSKb = 0; + std::size_t numDirtyKb = 0; + if (file) + { + rewind(file); + char line[4096] = { 0 }; + while (fgets(line, sizeof(line), file)) + { + if (line[0] != 'P') + continue; + + const char* value; + + // Shared_Dirty is accounted for by forkit's RSS + if ((value = startsWith(line, "Private_Dirty:", 14))) + { + numDirtyKb += atoi(value); + } + else if ((value = startsWith(line, "Pss:", 4))) + { + numPSSKb += atoi(value); + } + } + } + + return std::make_pair(numPSSKb, numDirtyKb); +} + +std::string getMemoryStats(FILE* file) +{ + const std::pair pssAndDirtyKb = getPssAndDirtyFromSMaps(file); + std::ostringstream oss; + oss << "procmemstats: pid=" << getpid() << " pss=" << pssAndDirtyKb.first + << " dirty=" << pssAndDirtyKb.second; + LOG_TRC("Collected " << oss.str()); + return oss.str(); +} + +std::size_t getMemoryUsagePSS(const pid_t pid) +{ + if (pid > 0) + { + // beautifully aggregated data in a single entry: + const auto cmd_rollup = "/proc/" + std::to_string(pid) + "/smaps_rollup"; + FILE* fp = fopen(cmd_rollup.c_str(), "r"); + if (!fp) + { + const auto cmd = "/proc/" + std::to_string(pid) + "/smaps"; + fp = fopen(cmd.c_str(), "r"); + } + + if (fp != nullptr) + { + const std::size_t pss = getPssAndDirtyFromSMaps(fp).first; + fclose(fp); + return pss; + } + } + + return 0; +} + +std::size_t getMemoryUsageRSS(const pid_t pid) +{ + static const int pageSizeBytes = getpagesize(); + std::size_t rss = 0; + + if (pid > 0) + { + rss = getStatFromPid(pid, 23); + rss *= pageSizeBytes; + rss /= 1024; + return rss; + } + return 0; +} + +size_t getCurrentThreadCount() +{ + DIR* dir = opendir("/proc/self/task"); + if (!dir) + { + LOG_TRC("Failed to open /proc/self/task"); + return 0; + } + + size_t threads = 0; + struct dirent* it; + while ((it = readdir(dir)) != nullptr) + { + if (it->d_name[0] == '.') + continue; + threads++; + } + closedir(dir); + LOG_TRC("We have " << threads << " threads"); + return threads; +} + +std::size_t getCpuUsage(const pid_t pid) +{ + if (pid > 0) + { + std::size_t totalJiffies = 0; + totalJiffies += getStatFromPid(pid, 13); + totalJiffies += getStatFromPid(pid, 14); + return totalJiffies; + } + return 0; +} + +std::size_t getStatFromPid(const pid_t pid, int ind) +{ + if (pid > 0) + { + const auto cmd = "/proc/" + std::to_string(pid) + "/stat"; + FILE* fp = fopen(cmd.c_str(), "r"); + if (fp != nullptr) + { + char line[4096] = { 0 }; + if (fgets(line, sizeof(line), fp)) + { + const std::string s(line); + int index = 1; + std::size_t pos = s.find(' '); + while (pos != std::string::npos) + { + if (index == ind) + { + fclose(fp); + return strtol(&s[pos], nullptr, 10); + } + ++index; + pos = s.find(' ', pos + 1); + } + } + fclose(fp); + } + } + return 0; +} + +void setProcessAndThreadPriorities(const pid_t pid, int prio) +{ + int res = setpriority(PRIO_PROCESS, pid, prio); + LOG_TRC("Lowered kit [" << (int)pid << "] priority: " << prio << " with result: " << res); + +#ifdef __linux__ + // rely on Linux thread-id priority setting to drop this thread' priority + pid_t tid = getThreadId(); + res = setpriority(PRIO_PROCESS, tid, prio); + LOG_TRC("Lowered own thread [" << (int)tid << "] priority: " << prio + << " with result: " << res); +#endif +} +// If OS is not mobile, it must be Linux. +std::string getLinuxVersion() +{ + // Read operating system info. We can read "os-release" file, located in /etc. + std::ifstream ifs("/etc/os-release"); + std::string str(std::istreambuf_iterator{ ifs }, {}); + std::vector infoList = Util::splitStringToVector(str, '\n'); + std::map releaseInfo = Util::stringVectorToMap(infoList, '='); + + auto it = releaseInfo.find("PRETTY_NAME"); + if (it != releaseInfo.end()) + { + std::string name = it->second; + + // See os-release(5). It says that the lines are "environment-like shell-compatible + // variable assignments". What that means, *exactly*, is up for debate, but probably + // of mainly academic interest. (It does say that variable expansion at least is not + // supported, that is a relief.) + + // The value of PRETTY_NAME might be quoted with double-quotes or + // single-quotes. + + // FIXME: In addition, it might contain backslash-escaped special + // characters, but we ignore that possibility for now. + + // FIXME: In addition, if it really does support shell syntax (except variable + // expansion), it could for instance consist of multiple concatenated quoted strings (with no + // whitespace inbetween), as in: + // PRETTY_NAME="Foo "'bar'" mumble" + // But I guess that is a pretty remote possibility and surely no other code that + // reads /etc/os-release handles that like a proper shell, either. + + if (name.length() >= 2 && ((name[0] == '"' && name[name.length() - 1] == '"') || + (name[0] == '\'' && name[name.length() - 1] == '\''))) + name = name.substr(1, name.length() - 2); + return name; + } + else + { + return "unknown"; + } +} + +#if defined(BUILDING_TESTS) +/// No-op implementation in the test programs +void alertAllUsers(const std::string&) {} + +/// No-op implementation in the test programs +void alertAllUsers(const std::string&, const std::string&) {} +#endif +} diff --git a/common/Util-mobile.cpp b/common/Util-mobile.cpp new file mode 100644 index 0000000000..b66fb5b2bc --- /dev/null +++ b/common/Util-mobile.cpp @@ -0,0 +1,42 @@ +/* + * Copyright the Collabora Online contributors. + * + * SPDX-License-Identifier: MPL-2.0 + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#include + +#include "Util.hpp" + +namespace Util +{ +bool isMobileApp() { return true; } + +/// No-op implementation of desktop only functions +DirectoryCounter::DirectoryCounter(const char* procPath) {} +DirectoryCounter::~DirectoryCounter() {} +int DirectoryCounter::count() { return 0; } +int spawnProcess(const std::string& cmd, const StringVector& args) { return 0; } + +std::string getHumanizedBytes(unsigned long nBytes) { return std::string(); } +size_t getTotalSystemMemoryKb() { return 0; } +std::size_t getFromFile(const char* path) { return 0; } +std::size_t getCGroupMemLimit() { return 0; } +std::size_t getCGroupMemSoftLimit() { return 0; } +size_t getMemoryUsagePSS(const pid_t pid) { return 0; } +size_t getMemoryUsageRSS(const pid_t pid) { return 0; } +size_t getCurrentThreadCount() { return 0; } +std::string getMemoryStats(FILE* file) { return std::string(); } +std::pair getPssAndDirtyFromSMaps(FILE* file) { return std::make_pair(0, 0); } +size_t getCpuUsage(const pid_t pid) { return 0; } +size_t getStatFromPid(const pid_t pid, int ind) { return 0; } +void setProcessAndThreadPriorities(const pid_t pid, int prio) {} + +std::string getLinuxVersion() { return "unknown"; } + +void alertAllUsers(const std::string&) {} +void alertAllUsers(const std::string&, const std::string&) {} +} diff --git a/common/Util.cpp b/common/Util.cpp index b090912931..649d5f6687 100644 --- a/common/Util.cpp +++ b/common/Util.cpp @@ -190,65 +190,6 @@ namespace Util } } -#if !MOBILEAPP - DirectoryCounter::DirectoryCounter(const char *procPath) : - _tasks(opendir(procPath)) - { - if (!_tasks) - LOG_ERR("No proc mounted, can't count threads"); - } - - DirectoryCounter::~DirectoryCounter() - { - closedir(reinterpret_cast(_tasks)); - } - - int DirectoryCounter::count() - { - auto dir = reinterpret_cast(_tasks); - - if (!dir) - return -1; - - rewinddir(dir); - - int tasks = 0; - struct dirent *i; - while ((i = readdir(dir))) - { - if (i->d_name[0] != '.') - tasks++; - } - - return tasks; - } - - int spawnProcess(const std::string &cmd, const StringVector &args) - { - // Create a vector of zero-terminated strings. - std::vector argStrings; - for (const auto& arg : args) - argStrings.push_back(args.getParam(arg)); - - std::vector params; - params.push_back(const_cast(cmd.c_str())); - for (const auto& i : argStrings) - params.push_back(const_cast(i.c_str())); - params.push_back(nullptr); - - pid_t pid = -1; - int status = posix_spawn(&pid, params[0], nullptr, nullptr, params.data(), environ); - if (status < 0) - { - LOG_ERR("Failed to posix_spawn for command '" << cmd); - throw Poco::SystemException("Failed to fork posix_spawn command ", cmd); - } - - return pid; - } - -#endif - std::string encodeId(const std::uint64_t number, const int padding) { std::ostringstream oss; @@ -274,290 +215,6 @@ namespace Util void setKitInProcess(bool value) { kitInProcess = value; } bool isKitInProcess() { return kitInProcess || isFuzzing(); } -#if !MOBILEAPP - - static const char *startsWith(const char *line, const char *tag, std::size_t tagLen) - { - assert(strlen(tag) == tagLen); - - std::size_t len = tagLen; - if (!strncmp(line, tag, len)) - { - while (!isdigit(line[len]) && line[len] != '\0') - ++len; - - return line + len; - } - - return nullptr; - } - - std::string getHumanizedBytes(unsigned long nBytes) - { - constexpr unsigned factor = 1024; - short count = 0; - float val = nBytes; - while (val >= factor && count < 4) { - val /= factor; - count++; - } - std::string unit; - switch (count) - { - case 0: unit = ""; break; - case 1: unit = "ki"; break; - case 2: unit = "Mi"; break; - case 3: unit = "Gi"; break; - case 4: unit = "Ti"; break; - default: assert(false); - } - - unit += 'B'; - std::stringstream ss; - ss << std::fixed << std::setprecision(1) << val << ' ' << unit; - return ss.str(); - } - - std::size_t getTotalSystemMemoryKb() - { - std::size_t totalMemKb = 0; - FILE* file = fopen("/proc/meminfo", "r"); - if (file != nullptr) - { - char line[4096] = { 0 }; - // coverity[tainted_data_argument : FALSE] - we trust the kernel-provided data - while (fgets(line, sizeof(line), file)) - { - const char* value; - if ((value = startsWith(line, "MemTotal:", 9))) - { - totalMemKb = atoll(value); - break; - } - } - fclose(file); - } - - return totalMemKb; - } - - std::size_t getFromCGroup(const std::string &group, const std::string &key) - { - std::size_t num = 0; - - std::string groupPath; - FILE* cg = fopen("/proc/self/cgroup", "r"); - if (cg != nullptr) - { - - char line[4096] = { 0 }; - while (fgets(line, sizeof(line), cg)) - { - StringVector bits = StringVector::tokenize(line, strlen (line), ':'); - if (bits.size() > 2 && bits[1] == group) - { - groupPath = "/sys/fs/cgroup/" + group + bits[2]; - break; - } - } - LOG_TRC("control group path for " << group << " is " << groupPath); - fclose(cg); - } - - if (groupPath.empty()) - return 0; - - std::string path = groupPath + "/" + key; - LOG_TRC("Read from " << path); - FILE* file = fopen(path.c_str(), "r"); - if (file != nullptr) - { - char line[4096] = { 0 }; - if (fgets(line, sizeof(line), file)) - num = atoll(line); - fclose(file); - } - - return num; - } - - std::size_t getCGroupMemLimit() - { -#ifdef __linux__ - return getFromCGroup("memory", "memory.limit_in_bytes"); -#else - return 0; -#endif - } - - std::size_t getCGroupMemSoftLimit() - { -#ifdef __linux__ - return getFromCGroup("memory", "memory.soft_limit_in_bytes"); -#else - return 0; -#endif - } - - std::pair getPssAndDirtyFromSMaps(FILE* file) - { - std::size_t numPSSKb = 0; - std::size_t numDirtyKb = 0; - if (file) - { - rewind(file); - char line[4096] = { 0 }; - while (fgets(line, sizeof (line), file)) - { - if (line[0] != 'P') - continue; - - const char *value; - - // Shared_Dirty is accounted for by forkit's RSS - if ((value = startsWith(line, "Private_Dirty:", 14))) - { - numDirtyKb += atoi(value); - } - else if ((value = startsWith(line, "Pss:", 4))) - { - numPSSKb += atoi(value); - } - } - } - - return std::make_pair(numPSSKb, numDirtyKb); - } - - std::string getMemoryStats(FILE* file) - { - const std::pair pssAndDirtyKb = getPssAndDirtyFromSMaps(file); - std::ostringstream oss; - oss << "procmemstats: pid=" << getpid() - << " pss=" << pssAndDirtyKb.first - << " dirty=" << pssAndDirtyKb.second; - LOG_TRC("Collected " << oss.str()); - return oss.str(); - } - - std::size_t getMemoryUsagePSS(const pid_t pid) - { - if (pid > 0) - { - // beautifully aggregated data in a single entry: - const auto cmd_rollup = "/proc/" + std::to_string(pid) + "/smaps_rollup"; - FILE* fp = fopen(cmd_rollup.c_str(), "r"); - if (!fp) - { - const auto cmd = "/proc/" + std::to_string(pid) + "/smaps"; - fp = fopen(cmd.c_str(), "r"); - } - - if (fp != nullptr) - { - const std::size_t pss = getPssAndDirtyFromSMaps(fp).first; - fclose(fp); - return pss; - } - } - - return 0; - } - - std::size_t getMemoryUsageRSS(const pid_t pid) - { - static const int pageSizeBytes = getpagesize(); - std::size_t rss = 0; - - if (pid > 0) - { - rss = getStatFromPid(pid, 23); - rss *= pageSizeBytes; - rss /= 1024; - return rss; - } - return 0; - } - - size_t getCurrentThreadCount() - { - DIR *dir = opendir("/proc/self/task"); - if (!dir) - { - LOG_TRC("Failed to open /proc/self/task"); - return 0; - } - - size_t threads = 0; - struct dirent *it; - while ((it = readdir(dir)) != nullptr) { - if (it->d_name[0] == '.') - continue; - threads++; - } - closedir(dir); - LOG_TRC("We have " << threads << " threads"); - return threads; - } - - std::size_t getCpuUsage(const pid_t pid) - { - if (pid > 0) - { - std::size_t totalJiffies = 0; - totalJiffies += getStatFromPid(pid, 13); - totalJiffies += getStatFromPid(pid, 14); - return totalJiffies; - } - return 0; - } - - std::size_t getStatFromPid(const pid_t pid, int ind) - { - if (pid > 0) - { - const auto cmd = "/proc/" + std::to_string(pid) + "/stat"; - FILE* fp = fopen(cmd.c_str(), "r"); - if (fp != nullptr) - { - char line[4096] = { 0 }; - if (fgets(line, sizeof (line), fp)) - { - const std::string s(line); - int index = 1; - std::size_t pos = s.find(' '); - while (pos != std::string::npos) - { - if (index == ind) - { - fclose(fp); - return strtol(&s[pos], nullptr, 10); - } - ++index; - pos = s.find(' ', pos + 1); - } - } - fclose(fp); - } - } - return 0; - } - - void setProcessAndThreadPriorities(const pid_t pid, int prio) - { - int res = setpriority(PRIO_PROCESS, pid, prio); - LOG_TRC("Lowered kit [" << (int)pid << "] priority: " << prio << " with result: " << res); - -#ifdef __linux__ - // rely on Linux thread-id priority setting to drop this thread' priority - pid_t tid = getThreadId(); - res = setpriority(PRIO_PROCESS, tid, prio); - LOG_TRC("Lowered own thread [" << (int)tid << "] priority: " << prio << " with result: " << res); -#endif - } - -#endif // !MOBILEAPP - std::string replace(std::string result, const std::string& a, const std::string& b) { const std::size_t aSize = a.size(); @@ -1123,50 +780,6 @@ namespace Util return ApplicationPath; } - #if !MOBILEAPP - // If OS is not mobile, it must be Linux. - std::string getLinuxVersion(){ - // Read operating system info. We can read "os-release" file, located in /etc. - std::ifstream ifs("/etc/os-release"); - std::string str(std::istreambuf_iterator{ifs}, {}); - std::vector infoList = Util::splitStringToVector(str, '\n'); - std::map releaseInfo = Util::stringVectorToMap(infoList, '='); - - auto it = releaseInfo.find("PRETTY_NAME"); - if (it != releaseInfo.end()) - { - std::string name = it->second; - - // See os-release(5). It says that the lines are "environment-like shell-compatible - // variable assignments". What that means, *exactly*, is up for debate, but probably - // of mainly academic interest. (It does say that variable expansion at least is not - // supported, that is a relief.) - - // The value of PRETTY_NAME might be quoted with double-quotes or - // single-quotes. - - // FIXME: In addition, it might contain backslash-escaped special - // characters, but we ignore that possibility for now. - - // FIXME: In addition, if it really does support shell syntax (except variable - // expansion), it could for instance consist of multiple concatenated quoted strings (with no - // whitespace inbetween), as in: - // PRETTY_NAME="Foo "'bar'" mumble" - // But I guess that is a pretty remote possibility and surely no other code that - // reads /etc/os-release handles that like a proper shell, either. - - if (name.length() >= 2 && ((name[0] == '"' && name[name.length()-1] == '"') || - (name[0] == '\'' && name[name.length()-1] == '\''))) - name = name.substr(1, name.length()-2); - return name; - } - else - { - return "unknown"; - } - } - #endif - int safe_atoi(const char* p, int len) { long ret{}; diff --git a/common/Util.hpp b/common/Util.hpp index ee2bd62718..e66c897880 100644 --- a/common/Util.hpp +++ b/common/Util.hpp @@ -131,7 +131,6 @@ namespace Util std::chrono::steady_clock::time_point _startTime; }; -#if !MOBILEAPP class DirectoryCounter { void *_tasks; @@ -159,8 +158,6 @@ namespace Util /// Spawn a process. int spawnProcess(const std::string &cmd, const StringVector &args); -#endif - /// Convert unsigned char data to hex. /// @buffer can be either std::vector or std::string. /// @offset the offset within the buffer to start from. @@ -214,8 +211,6 @@ namespace Util bool windowingAvailable(); -#if !defined(BUILDING_TESTS) && !MOBILEAPP - /// Send a message to all clients. void alertAllUsers(const std::string& msg); @@ -225,18 +220,6 @@ namespace Util /// coolwsd for redistribution. (This function must be implemented separately in each program /// that uses it, it is not in Util.cpp.) void alertAllUsers(const std::string& cmd, const std::string& kind); -#else - - /// No-op implementation in the test programs - inline void alertAllUsers(const std::string&) - { - } - - /// No-op implementation in the test programs - inline void alertAllUsers(const std::string&, const std::string&) - { - } -#endif /// Assert that a lock is already taken. template void assertIsLocked([[maybe_unused]] const T& lock) @@ -253,7 +236,6 @@ namespace Util #endif } -#if !MOBILEAPP /// Print given number of bytes in human-understandable form (KB,MB, etc.) std::string getHumanizedBytes(unsigned long nBytes); @@ -292,7 +274,6 @@ namespace Util /// Sets priorities for a given pid & the current thread void setProcessAndThreadPriorities(const pid_t pid, int prio); -#endif /// Replace substring @a in string @s with string @b. std::string replace(std::string s, const std::string& a, const std::string& b); @@ -1322,6 +1303,8 @@ int main(int argc, char**argv) */ bool isFuzzing(); + bool isMobileApp(); + void setKitInProcess(bool value); bool isKitInProcess(); @@ -1354,10 +1337,8 @@ int main(int argc, char**argv) */ std::map stringVectorToMap(const std::vector& strvector, const char delimiter); -#if !MOBILEAPP // If OS is not mobile, it must be Linux. std::string getLinuxVersion(); -#endif /// Convert a string to 32-bit signed int. /// Returns the parsed value and a boolean indicating success or failure. diff --git a/gtk/Makefile.am b/gtk/Makefile.am index aab887e17b..c1f5a8cc30 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -31,7 +31,8 @@ common_sources = \ ../common/StringVector.cpp \ ../common/TraceEvent.cpp \ ../common/Unit.cpp \ - ../common/Util.cpp + ../common/Util.cpp \ + ../common/Util-mobile.cpp kit_sources = ../kit/ChildSession.cpp \ ../kit/Kit.cpp \ diff --git a/ios/Mobile.xcodeproj/project.pbxproj b/ios/Mobile.xcodeproj/project.pbxproj index 62e3d85ee5..bf516d8cf8 100644 --- a/ios/Mobile.xcodeproj/project.pbxproj +++ b/ios/Mobile.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 1F957DC22BA8229A006C9E78 /* Util-mobile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1F957DC12BA82296006C9E78 /* Util-mobile.cpp */; }; 1FCFA28A2B2AF13F007EE2DF /* coolwsd-fork.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1FCFA2892B2AF13C007EE2DF /* coolwsd-fork.cpp */; }; 3F3B54DD2A3928D100063C01 /* HttpRequest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3F3B54DB2A39288500063C01 /* HttpRequest.cpp */; }; 3F3B54E02A392CCB00063C01 /* NetUtil.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3F3B54DE2A392C9C00063C01 /* NetUtil.cpp */; }; @@ -84,6 +85,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 1F957DC12BA82296006C9E78 /* Util-mobile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "Util-mobile.cpp"; sourceTree = ""; }; 1FCFA2892B2AF13C007EE2DF /* coolwsd-fork.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "coolwsd-fork.cpp"; sourceTree = ""; }; 3F3B54DB2A39288500063C01 /* HttpRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HttpRequest.cpp; sourceTree = ""; }; 3F3B54DC2A39288500063C01 /* HttpRequest.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = HttpRequest.hpp; sourceTree = ""; }; @@ -2203,6 +2205,7 @@ BEA28376214FFD8C00848631 /* Unit.cpp */, BEA283782150172600848631 /* Unit.hpp */, BE5EB5BC213FE29900E0826C /* Util.cpp */, + 1F957DC12BA82296006C9E78 /* Util-mobile.cpp */, BE58E12C217F295B00249358 /* Util.hpp */, ); path = common; @@ -3671,6 +3674,7 @@ BE8D772F2136762500AC58EA /* DocumentBrowserViewController.mm in Sources */, BE9ADE3F265D046600BC034A /* TraceEvent.cpp in Sources */, BE5EB5D0213FE2D000E0826C /* TileCache.cpp in Sources */, + 1F957DC22BA8229A006C9E78 /* Util-mobile.cpp in Sources */, BE5EB5C5213FE29900E0826C /* MessageQueue.cpp in Sources */, BE7228E22417BC9F000ADABD /* StringVector.cpp in Sources */, BE55E0EB2653FCCB007DDF29 /* ConfigUtil.cpp in Sources */, diff --git a/test/Makefile.am b/test/Makefile.am index a6ad80ac4a..fe069a5ca3 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -146,6 +146,7 @@ common_sources = \ ../common/Unit.cpp \ ../common/FileUtil.cpp \ ../common/Util.cpp \ + ../common/Util-desktop.cpp \ ../common/StringVector.cpp \ ../common/TraceEvent.cpp \ ../common/Simd.cpp \ @@ -178,7 +179,7 @@ unit_base_la_LIBADD += -lssl -lcrypto endif fakesockettest_CPPFLAGS = -g -fakesockettest_SOURCES = fakesockettest.cpp ../net/FakeSocket.cpp ../common/DummyTraceEventEmitter.cpp ../common/Log.cpp ../common/Util.cpp +fakesockettest_SOURCES = fakesockettest.cpp ../net/FakeSocket.cpp ../common/DummyTraceEventEmitter.cpp ../common/Log.cpp ../common/Util.cpp ../common/Util-desktop.cpp fakesockettest_LDADD = $(CPPUNIT_LIBS) # old-style unit tests - bootstrapped via UnitClient diff --git a/wasm/Makefile.am b/wasm/Makefile.am index 480e75be69..30b35deecc 100644 --- a/wasm/Makefile.am +++ b/wasm/Makefile.am @@ -36,6 +36,7 @@ online_SOURCES = \ ../common/SpookyV2.cpp \ ../common/Unit.cpp \ ../common/Util.cpp \ + ../common/Util-mobile.cpp \ ../kit/ChildSession.cpp \ ../kit/Kit.cpp \ ../kit/KitWebSocket.cpp \