Skip to content

Commit 1e1d2e3

Browse files
committed
hmon: type-safe tags
Replace `IdentTag` with type-safe types.
1 parent 74707b4 commit 1e1d2e3

18 files changed

Lines changed: 516 additions & 348 deletions

File tree

examples/cpp_supervised_app/main.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,14 @@ int main(int argc, char** argv)
118118

119119
auto builder_mon =
120120
deadline::DeadlineMonitorBuilder()
121-
.add_deadline(IdentTag("deadline_1"),
121+
.add_deadline(DeadlineTag("deadline_1"),
122122
TimeRange(std::chrono::milliseconds(50), std::chrono::milliseconds(150)))
123-
.add_deadline(IdentTag("deadline_2"),
123+
.add_deadline(DeadlineTag("deadline_2"),
124124
TimeRange(std::chrono::milliseconds(2),
125125
std::chrono::milliseconds(20))); // Not used, only shows
126126
// that multiple deadlines can be added
127127

128-
IdentTag ident("monitor");
128+
MonitorTag ident("monitor");
129129

130130
{
131131
auto hm = HealthMonitorBuilder()
@@ -146,7 +146,7 @@ int main(int argc, char** argv)
146146

147147
auto deadline_mon = std::move(*deadline_monitor_res);
148148

149-
auto deadline_res = deadline_mon.get_deadline(IdentTag("deadline_1"));
149+
auto deadline_res = deadline_mon.get_deadline(DeadlineTag("deadline_1"));
150150
while (!exitRequested)
151151
{
152152
if (stopReportingCheckpoints.load())

examples/rust_supervised_app/src/main.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,21 +57,21 @@ fn set_process_name() {
5757
fn main_logic(args: &Args, stop: Arc<AtomicBool>) -> Result<(), Box<dyn std::error::Error>> {
5858
let mut builder = deadline::DeadlineMonitorBuilder::new();
5959
builder = builder.add_deadline(
60-
&IdentTag::from("deadline1"),
60+
DeadlineTag::from("deadline1"),
6161
TimeRange::new(
6262
std::time::Duration::from_millis(50),
6363
std::time::Duration::from_millis(150),
6464
),
6565
);
6666

6767
let mut hm = HealthMonitorBuilder::new()
68-
.add_deadline_monitor(&IdentTag::from("mon1"), builder)
68+
.add_deadline_monitor(MonitorTag::from("mon1"), builder)
6969
.with_supervisor_api_cycle(std::time::Duration::from_millis(50))
7070
.with_internal_processing_cycle(std::time::Duration::from_millis(50))
7171
.build();
7272

7373
let mon = hm
74-
.get_deadline_monitor(&IdentTag::from("mon1"))
74+
.get_deadline_monitor(MonitorTag::from("mon1"))
7575
.expect("Failed to get monitor");
7676

7777
hm.start();
@@ -83,7 +83,7 @@ fn main_logic(args: &Args, stop: Arc<AtomicBool>) -> Result<(), Box<dyn std::err
8383

8484
while !stop.load(Ordering::Relaxed) {
8585
let mut deadline = mon
86-
.get_deadline(&IdentTag::from("deadline1"))
86+
.get_deadline(DeadlineTag::from("deadline1"))
8787
.expect("Failed to get deadline");
8888

8989
let _res = deadline.start();

src/health_monitoring_lib/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ CC_SOURCES = [
3333

3434
CC_HDRS = [
3535
"cpp/include/score/hm/common.h",
36+
"cpp/include/score/hm/tag.h",
3637
"cpp/include/score/hm/deadline/deadline_monitor.h",
3738
"cpp/include/score/hm/health_monitor.h",
3839
]

src/health_monitoring_lib/cpp/deadline_monitor.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ using namespace score::hm::deadline;
2424
FFICode deadline_monitor_builder_create(FFIHandle* deadline_monitor_builder_handle_out);
2525
FFICode deadline_monitor_builder_destroy(FFIHandle deadline_monitor_builder_handle);
2626
FFICode deadline_monitor_builder_add_deadline(FFIHandle deadline_monitor_builder_handle,
27-
const IdentTag* deadline_tag,
27+
const DeadlineTag* deadline_tag,
2828
uint32_t min_ms,
2929
uint32_t max_ms);
3030
FFICode deadline_monitor_get_deadline(FFIHandle deadline_monitor_handle,
31-
const IdentTag* deadline_tag,
31+
const DeadlineTag* deadline_tag,
3232
FFIHandle* deadline_handle_out);
3333
FFICode deadline_monitor_destroy(FFIHandle deadline_monitor_handle);
3434
FFICode deadline_destroy(FFIHandle deadline_handle);
@@ -55,26 +55,26 @@ DeadlineMonitorBuilder::DeadlineMonitorBuilder()
5555
{
5656
}
5757

58-
DeadlineMonitorBuilder DeadlineMonitorBuilder::add_deadline(const IdentTag& tag, const TimeRange& range) &&
58+
DeadlineMonitorBuilder DeadlineMonitorBuilder::add_deadline(const DeadlineTag& deadline_tag, const TimeRange& range) &&
5959
{
6060
auto handle = monitor_builder_handler_.as_rust_handle();
6161
SCORE_LANGUAGE_FUTURECPP_PRECONDITION(handle.has_value());
6262

63-
auto result{deadline_monitor_builder_add_deadline(handle.value(), &tag, range.min_ms(), range.max_ms())};
63+
auto result{deadline_monitor_builder_add_deadline(handle.value(), &deadline_tag, range.min_ms(), range.max_ms())};
6464
abort_on_error(result);
6565

6666
return std::move(*this);
6767
}
6868

6969
DeadlineMonitor::DeadlineMonitor(FFIHandle handle) : monitor_handle_(handle, &deadline_monitor_destroy) {}
7070

71-
score::cpp::expected<Deadline, score::hm::Error> DeadlineMonitor::get_deadline(const IdentTag& tag)
71+
score::cpp::expected<Deadline, score::hm::Error> DeadlineMonitor::get_deadline(const DeadlineTag& deadline_tag)
7272
{
7373
auto handle = monitor_handle_.as_rust_handle();
7474
SCORE_LANGUAGE_FUTURECPP_PRECONDITION(handle.has_value());
7575

7676
FFIHandle ret = nullptr;
77-
auto result = deadline_monitor_get_deadline(handle.value(), &tag, &ret);
77+
auto result = deadline_monitor_get_deadline(handle.value(), &deadline_tag, &ret);
7878
if (result != kSuccess)
7979
{
8080
return score::cpp::unexpected(static_cast<Error>(result));

src/health_monitoring_lib/cpp/health_monitor.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ FFICode health_monitor_builder_build(FFIHandle health_monitor_builder_handle,
2828
uint32_t internal_cycle_ms,
2929
FFIHandle* health_monitor_handle_out);
3030
FFICode health_monitor_builder_add_deadline_monitor(FFIHandle health_monitor_builder_handle,
31-
const IdentTag* monitor_tag,
31+
const MonitorTag* monitor_tag,
3232
FFIHandle deadline_monitor_builder_handle);
3333
FFICode health_monitor_get_deadline_monitor(FFIHandle health_monitor_handle,
34-
const IdentTag* monitor_tag,
34+
const MonitorTag* monitor_tag,
3535
FFIHandle* deadline_monitor_handle_out);
3636
FFICode health_monitor_start(FFIHandle health_monitor_handle);
3737
FFICode health_monitor_destroy(FFIHandle health_monitor_handle);
@@ -57,15 +57,15 @@ HealthMonitorBuilder::HealthMonitorBuilder()
5757
{
5858
}
5959

60-
HealthMonitorBuilder HealthMonitorBuilder::add_deadline_monitor(const IdentTag& tag,
60+
HealthMonitorBuilder HealthMonitorBuilder::add_deadline_monitor(const MonitorTag& monitor_tag,
6161
DeadlineMonitorBuilder&& monitor) &&
6262
{
6363
auto monitor_handle = monitor.drop_by_rust();
6464
SCORE_LANGUAGE_FUTURECPP_PRECONDITION(monitor_handle.has_value());
6565
SCORE_LANGUAGE_FUTURECPP_PRECONDITION(health_monitor_builder_handle_.as_rust_handle().has_value());
6666

6767
auto result{health_monitor_builder_add_deadline_monitor(
68-
health_monitor_builder_handle_.as_rust_handle().value(), &tag, monitor_handle.value())};
68+
health_monitor_builder_handle_.as_rust_handle().value(), &monitor_tag, monitor_handle.value())};
6969
abort_on_error(result);
7070

7171
return std::move(*this);
@@ -110,10 +110,10 @@ HealthMonitor::HealthMonitor(HealthMonitor&& other)
110110
other.health_monitor_ = nullptr;
111111
}
112112

113-
score::cpp::expected<DeadlineMonitor, Error> HealthMonitor::get_deadline_monitor(const IdentTag& tag)
113+
score::cpp::expected<DeadlineMonitor, Error> HealthMonitor::get_deadline_monitor(const MonitorTag& monitor_tag)
114114
{
115115
FFIHandle handle{nullptr};
116-
auto result{health_monitor_get_deadline_monitor(health_monitor_, &tag, &handle)};
116+
auto result{health_monitor_get_deadline_monitor(health_monitor_, &monitor_tag, &handle)};
117117
if (result != kSuccess)
118118
{
119119
return score::cpp::unexpected(static_cast<Error>(result));

src/health_monitoring_lib/cpp/include/score/hm/common.h

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
#include <cassert>
1717
#include <chrono>
18-
#include <cstdint>
1918
#include <optional>
2019

2120
namespace score::hm
@@ -91,24 +90,6 @@ enum class Error : internal::FFICode
9190
Failed
9291
};
9392

94-
///
95-
/// Identifier tag used to uniquely identify entities within the health monitoring system.
96-
///
97-
class IdentTag
98-
{
99-
public:
100-
/// Create a new IdentTag from a C-style string.
101-
template <size_t N>
102-
explicit IdentTag(const char (&tag)[N]) : tag_(tag), len_(N - 1)
103-
{
104-
}
105-
106-
private:
107-
/// SAFETY: This has to be FFI compatible with the Rust side representation.
108-
const char* const tag_;
109-
size_t len_;
110-
};
111-
11293
///
11394
/// Time range representation with minimum and maximum durations in milliseconds.
11495
///

src/health_monitoring_lib/cpp/include/score/hm/deadline/deadline_monitor.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include <score/expected.hpp>
1717
#include <score/hm/common.h>
18+
#include <score/hm/tag.h>
1819
#include <functional>
1920
#include <optional>
2021

@@ -47,7 +48,7 @@ class DeadlineMonitorBuilder final : public internal::RustDroppable<DeadlineMoni
4748
DeadlineMonitorBuilder& operator=(DeadlineMonitorBuilder&&) = delete;
4849

4950
/// Adds a deadline with the given tag and duration range to the monitor.
50-
DeadlineMonitorBuilder add_deadline(const IdentTag& tag, const TimeRange& range) &&;
51+
DeadlineMonitorBuilder add_deadline(const DeadlineTag& deadline_tag, const TimeRange& range) &&;
5152

5253
protected:
5354
std::optional<internal::FFIHandle> __drop_by_rust_impl()
@@ -75,7 +76,7 @@ class DeadlineMonitor final
7576
DeadlineMonitor(DeadlineMonitor&& other) noexcept = default;
7677
DeadlineMonitor& operator=(DeadlineMonitor&& other) noexcept = default;
7778

78-
::score::cpp::expected<Deadline, score::hm::Error> get_deadline(const IdentTag& tag);
79+
::score::cpp::expected<Deadline, score::hm::Error> get_deadline(const DeadlineTag& deadline_tag);
7980

8081
private:
8182
explicit DeadlineMonitor(internal::FFIHandle handle);

src/health_monitoring_lib/cpp/include/score/hm/health_monitor.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include <score/hm/common.h>
1717
#include <score/hm/deadline/deadline_monitor.h>
18+
#include <score/hm/tag.h>
1819

1920
namespace score::hm
2021
{
@@ -38,7 +39,8 @@ class HealthMonitorBuilder final
3839
HealthMonitorBuilder& operator=(HealthMonitorBuilder&&) = delete;
3940

4041
/// Adds a deadline monitor to the builder to construct DeadlineMonitor instances during HealthMonitor build.
41-
HealthMonitorBuilder add_deadline_monitor(const IdentTag& tag, deadline::DeadlineMonitorBuilder&& monitor) &&;
42+
HealthMonitorBuilder add_deadline_monitor(const MonitorTag& monitor_tag,
43+
deadline::DeadlineMonitorBuilder&& monitor) &&;
4244

4345
/// Sets the cycle duration for supervisor API notifications.
4446
/// This duration determines how often the health monitor notifies the supervisor that the system is alive.
@@ -69,7 +71,7 @@ class HealthMonitor final
6971

7072
~HealthMonitor();
7173

72-
score::cpp::expected<deadline::DeadlineMonitor, Error> get_deadline_monitor(const IdentTag& tag);
74+
score::cpp::expected<deadline::DeadlineMonitor, Error> get_deadline_monitor(const MonitorTag& monitor_tag);
7375

7476
void start();
7577

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/********************************************************************************
2+
* Copyright (c) 2026 Contributors to the Eclipse Foundation
3+
*
4+
* See the NOTICE file(s) distributed with this work for additional
5+
* information regarding copyright ownership.
6+
*
7+
* This program and the accompanying materials are made available under the
8+
* terms of the Apache License Version 2.0 which is available at
9+
* https://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* SPDX-License-Identifier: Apache-2.0
12+
********************************************************************************/
13+
14+
#ifndef SCORE_HM_TAG_H
15+
#define SCORE_HM_TAG_H
16+
17+
#include <cstddef>
18+
19+
namespace score::hm
20+
{
21+
22+
/// Common string-based tag.
23+
template <typename T>
24+
class Tag
25+
{
26+
public:
27+
/// Create a new tag from a C-style string.
28+
template <size_t N>
29+
explicit Tag(const char (&tag)[N]) : data_(tag), length_(N - 1)
30+
{
31+
}
32+
33+
private:
34+
/// SAFETY: This has to be FFI compatible with the Rust side representation.
35+
const char* const data_;
36+
size_t length_;
37+
};
38+
39+
/// Monitor tag.
40+
class MonitorTag : public Tag<MonitorTag>
41+
{
42+
public:
43+
/// Create a new MonitorTag from a C-style string.
44+
template <size_t N>
45+
explicit MonitorTag(const char (&tag)[N]) : Tag{tag}
46+
{
47+
}
48+
};
49+
50+
/// Deadline tag.
51+
class DeadlineTag : public Tag<DeadlineTag>
52+
{
53+
public:
54+
/// Create a new DeadlineTag from a C-style string.
55+
template <size_t N>
56+
explicit DeadlineTag(const char (&tag)[N]) : Tag{tag}
57+
{
58+
}
59+
};
60+
61+
} // namespace score::hm
62+
63+
#endif // SCORE_HM_TAG_H

src/health_monitoring_lib/cpp/tests/health_monitor_test.cpp

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
********************************************************************************/
1313
#include "score/hm/health_monitor.h"
1414
#include "score/hm/common.h"
15+
#include "score/hm/tag.h"
1516
#include <gmock/gmock.h>
1617
#include <gtest/gtest.h>
1718

@@ -24,34 +25,37 @@ class HealthMonitorTest : public ::testing::Test
2425
// For first review round, only single test case to show up API
2526
TEST_F(HealthMonitorTest, TestName)
2627
{
27-
auto builder_mon = deadline::DeadlineMonitorBuilder()
28-
.add_deadline(IdentTag("deadline_1"),
29-
TimeRange(std::chrono::milliseconds(100), std::chrono::milliseconds(200)))
30-
.add_deadline(IdentTag("deadline_2"),
31-
TimeRange(std::chrono::milliseconds(100), std::chrono::milliseconds(200)));
32-
33-
IdentTag ident("monitor");
28+
// Setup deadline monitor construction.
29+
const MonitorTag deadline_monitor_tag{"deadline_monitor"};
30+
auto deadline_monitor_builder =
31+
deadline::DeadlineMonitorBuilder()
32+
.add_deadline(DeadlineTag("deadline_1"),
33+
TimeRange(std::chrono::milliseconds(100), std::chrono::milliseconds(200)))
34+
.add_deadline(DeadlineTag("deadline_2"),
35+
TimeRange(std::chrono::milliseconds(100), std::chrono::milliseconds(200)));
3436

3537
auto hm = HealthMonitorBuilder()
36-
.add_deadline_monitor(ident, std::move(builder_mon))
38+
.add_deadline_monitor(deadline_monitor_tag, std::move(deadline_monitor_builder))
3739
.with_internal_processing_cycle(std::chrono::milliseconds(50))
3840
.with_supervisor_api_cycle(std::chrono::milliseconds(50))
3941
.build();
4042

41-
auto deadline_monitor_res = hm.get_deadline_monitor(ident);
43+
// Obtain deadline monitor from HMON.
44+
auto deadline_monitor_res = hm.get_deadline_monitor(deadline_monitor_tag);
4245
EXPECT_TRUE(deadline_monitor_res.has_value());
4346

4447
{
45-
// Try again to get the same monitor
46-
auto deadline_monitor_res = hm.get_deadline_monitor(ident);
48+
// Try again to get the same monitor.
49+
auto deadline_monitor_res = hm.get_deadline_monitor(deadline_monitor_tag);
4750
EXPECT_FALSE(deadline_monitor_res.has_value());
4851
}
4952

5053
auto deadline_mon = std::move(*deadline_monitor_res);
5154

55+
// Start HMON.
5256
hm.start();
5357

54-
auto deadline_res = deadline_mon.get_deadline(IdentTag("deadline_1"));
58+
auto deadline_res = deadline_mon.get_deadline(DeadlineTag("deadline_1"));
5559

5660
{
5761
auto deadline_guard = deadline_res.value().start().value();

0 commit comments

Comments
 (0)