This commit is contained in:
J. Nick Koston
2025-06-28 09:50:27 -05:00
parent df3469efba
commit a9ace366eb

View File

@@ -75,18 +75,18 @@ class Scheduler {
// Bit-packed fields to minimize padding // Bit-packed fields to minimize padding
enum Type : uint8_t { TIMEOUT, INTERVAL } type : 1; enum Type : uint8_t { TIMEOUT, INTERVAL } type : 1;
bool remove : 1; bool remove : 1;
bool owns_name : 1; // True if name_.dynamic_name needs to be freed bool name_is_dynamic : 1; // True if name was dynamically allocated (needs delete[])
// 5 bits padding // 5 bits padding
// Constructor // Constructor
SchedulerItem() SchedulerItem()
: component(nullptr), interval(0), next_execution_(0), type(TIMEOUT), remove(false), owns_name(false) { : component(nullptr), interval(0), next_execution_(0), type(TIMEOUT), remove(false), name_is_dynamic(false) {
name_.static_name = nullptr; name_.static_name = nullptr;
} }
// Destructor to clean up dynamic names // Destructor to clean up dynamic names
~SchedulerItem() { ~SchedulerItem() {
if (owns_name) { if (name_is_dynamic) {
delete[] name_.dynamic_name; delete[] name_.dynamic_name;
} }
} }
@@ -100,14 +100,14 @@ class Scheduler {
SchedulerItem &operator=(SchedulerItem &&) = default; SchedulerItem &operator=(SchedulerItem &&) = default;
// Helper to get the name regardless of storage type // Helper to get the name regardless of storage type
const char *get_name() const { return owns_name ? name_.dynamic_name : name_.static_name; } const char *get_name() const { return name_is_dynamic ? name_.dynamic_name : name_.static_name; }
// Helper to set name with proper ownership // Helper to set name with proper ownership
void set_name(const char *name, bool make_copy = false) { void set_name(const char *name, bool make_copy = false) {
// Clean up old dynamic name if any // Clean up old dynamic name if any
if (owns_name && name_.dynamic_name) { if (name_is_dynamic && name_.dynamic_name) {
delete[] name_.dynamic_name; delete[] name_.dynamic_name;
owns_name = false; name_is_dynamic = false;
} }
if (!name || !name[0]) { if (!name || !name[0]) {
@@ -117,7 +117,7 @@ class Scheduler {
size_t len = strlen(name); size_t len = strlen(name);
name_.dynamic_name = new char[len + 1]; name_.dynamic_name = new char[len + 1];
strcpy(name_.dynamic_name, name); strcpy(name_.dynamic_name, name);
owns_name = true; name_is_dynamic = true;
} else { } else {
// Use static string directly // Use static string directly
name_.static_name = name; name_.static_name = name;