Skip to content

Commit bac9573

Browse files
committed
Fix runtime error if an entry in lscpu isn't an integer but - (or something else).
1 parent 3b08108 commit bac9573

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

include/hws/utility.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ constexpr bool is_vector_v = is_vector<T>::value;
119119
*/
120120
[[nodiscard]] std::vector<std::string_view> split(std::string_view str, char delim = ' ');
121121

122+
/**
123+
* @brief Check whether @p str is an integer
124+
* @param[in] str the string to check
125+
* @return `true` if @p str is an integer, `false` otherwise
126+
*/
127+
[[nodiscard]] bool is_integer(std::string_view str);
128+
122129
/**
123130
* @brief Convert the @p str to a value of type @p T.
124131
* @tparam T the type to convert the string to

src/hws/cpu/hardware_sampler.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,15 @@ void cpu_hardware_sampler::sampling_loop() {
7878
general_samples_.architecture_ = detail::convert_to<decltype(general_samples_.architecture_)::value_type>(value);
7979
} else if (detail::starts_with(line, "Byte Order")) {
8080
general_samples_.byte_order_ = detail::convert_to<decltype(general_samples_.byte_order_)::value_type>(value);
81-
} else if (detail::starts_with(line, "CPU(s)")) {
81+
} else if (detail::starts_with(line, "CPU(s)") && detail::is_integer(value)) {
8282
general_samples_.num_threads_ = detail::convert_to<decltype(general_samples_.num_threads_)::value_type>(value);
83-
} else if (detail::starts_with(line, "Thread(s) per core")) {
83+
} else if (detail::starts_with(line, "Thread(s) per core") && detail::is_integer(value)) {
8484
general_samples_.threads_per_core_ = detail::convert_to<decltype(general_samples_.threads_per_core_)::value_type>(value);
85-
} else if (detail::starts_with(line, "Core(s) per socket")) {
85+
} else if (detail::starts_with(line, "Core(s) per socket") && detail::is_integer(value)) {
8686
general_samples_.cores_per_socket_ = detail::convert_to<decltype(general_samples_.cores_per_socket_)::value_type>(value);
87-
} else if (detail::starts_with(line, "Socket(s)")) {
87+
} else if (detail::starts_with(line, "Socket(s)") && detail::is_integer(value)) {
8888
general_samples_.num_sockets_ = detail::convert_to<decltype(general_samples_.num_sockets_)::value_type>(value);
89-
} else if (detail::starts_with(line, "NUMA node(s)")) {
89+
} else if (detail::starts_with(line, "NUMA node(s)") && detail::is_integer(value)) {
9090
general_samples_.numa_nodes_ = detail::convert_to<decltype(general_samples_.numa_nodes_)::value_type>(value);
9191
} else if (detail::starts_with(line, "Vendor ID")) {
9292
general_samples_.vendor_id_ = detail::convert_to<decltype(general_samples_.vendor_id_)::value_type>(value);

src/hws/utility.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
#include "hws/utility.hpp"
99

10-
#include <algorithm> // std::min, std::transform
11-
#include <cctype> // std::tolower
10+
#include <algorithm> // std::min, std::transform, std::all_of
11+
#include <cctype> // std::tolower, std::isdigit
1212
#include <string> // std::string
1313
#include <string_view> // std::string_view
1414
#include <vector> // std::vector
@@ -57,4 +57,8 @@ std::vector<std::string_view> split(const std::string_view str, const char delim
5757
return split_str;
5858
}
5959

60+
bool is_integer(std::string_view str) {
61+
return std::all_of(str.cbegin(), str.cend(), [](const char c) { return std::isdigit(static_cast<unsigned char>(c)); });
62+
}
63+
6064
} // namespace hws::detail

0 commit comments

Comments
 (0)