Skip to content

Commit

Permalink
iox-eclipse-iceoryx#2157 Replace uint32_t with uint64_t for payload size
Browse files Browse the repository at this point in the history
  • Loading branch information
kozakusek committed Jan 14, 2024
1 parent a2a472f commit 39b82b1
Show file tree
Hide file tree
Showing 78 changed files with 283 additions and 282 deletions.
4 changes: 2 additions & 2 deletions iceoryx_binding_c/include/iceoryx_binding_c/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ void iox_client_deinit(iox_client_t const self);
/// for a custom user-payload alignment please use 'iox_client_loan_aligned_request'
ENUM iox_AllocationResult iox_client_loan_request(iox_client_t const self,
void** const payload,
const uint32_t payloadSize);
const uint64_t payloadSize);

/// @brief allocates a request in the shared memory with a custom alignment for the user-payload
/// @param[in] self handle of the client
Expand All @@ -100,7 +100,7 @@ ENUM iox_AllocationResult iox_client_loan_request(iox_client_t const self,
/// describes the error
ENUM iox_AllocationResult iox_client_loan_aligned_request(iox_client_t const self,
void** const payload,
const uint32_t payloadSize,
const uint64_t payloadSize,
const uint32_t payloadAlignment);


Expand Down
6 changes: 3 additions & 3 deletions iceoryx_binding_c/include/iceoryx_binding_c/publisher.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ void iox_pub_deinit(iox_pub_t const self);
/// for a custom user-payload alignment please use 'iox_pub_loan_aligned_chunk'
ENUM iox_AllocationResult iox_pub_loan_chunk(iox_pub_t const self,
void** const userPayload,
const uint32_t userPayloadSize);
const uint64_t userPayloadSize);

/// @brief allocates a chunk in the shared memory with a custom alignment for the user-payload
/// @param[in] self handle of the publisher
Expand All @@ -98,7 +98,7 @@ ENUM iox_AllocationResult iox_pub_loan_chunk(iox_pub_t const self,
/// describes the error
ENUM iox_AllocationResult iox_pub_loan_aligned_chunk(iox_pub_t const self,
void** const userPayload,
const uint32_t userPayloadSize,
const uint64_t userPayloadSize,
const uint32_t userPayloadAlignment);

/// @brief allocates a chunk in the shared memory with a section for the user-header and a custom alignment for the
Expand All @@ -113,7 +113,7 @@ ENUM iox_AllocationResult iox_pub_loan_aligned_chunk(iox_pub_t const self,
/// describes the error
ENUM iox_AllocationResult iox_pub_loan_aligned_chunk_with_user_header(iox_pub_t const self,
void** const userPayload,
const uint32_t userPayloadSize,
const uint64_t userPayloadSize,
const uint32_t userPayloadAlignment,
const uint32_t userHeaderSize,
const uint32_t userHeaderAlignment);
Expand Down
4 changes: 2 additions & 2 deletions iceoryx_binding_c/include/iceoryx_binding_c/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ void iox_server_release_request(iox_server_t const self, const void* const paylo
ENUM iox_AllocationResult iox_server_loan_response(iox_server_t const self,
const void* const requestPayload,
void** const payload,
const uint32_t payloadSize);
const uint64_t payloadSize);

/// @brief allocates a response in the shared memory
/// @param[in] self handle of the server
Expand All @@ -116,7 +116,7 @@ ENUM iox_AllocationResult iox_server_loan_response(iox_server_t const self,
ENUM iox_AllocationResult iox_server_loan_aligned_response(iox_server_t const self,
const void* const requestPayload,
void** const payload,
const uint32_t payloadSize,
const uint64_t payloadSize,
const uint32_t payloadAlignment);

/// @brief sends a previously loaned response
Expand Down
4 changes: 2 additions & 2 deletions iceoryx_binding_c/source/c_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,14 +92,14 @@ void iox_client_deinit(iox_client_t const self)
delete self;
}

iox_AllocationResult iox_client_loan_request(iox_client_t const self, void** const payload, const uint32_t payloadSize)
iox_AllocationResult iox_client_loan_request(iox_client_t const self, void** const payload, const uint64_t payloadSize)
{
return iox_client_loan_aligned_request(self, payload, payloadSize, IOX_C_CHUNK_DEFAULT_USER_PAYLOAD_ALIGNMENT);
}

iox_AllocationResult iox_client_loan_aligned_request(iox_client_t const self,
void** const payload,
const uint32_t payloadSize,
const uint64_t payloadSize,
const uint32_t payloadAlignment)
{
IOX_EXPECTS(self != nullptr);
Expand Down
6 changes: 3 additions & 3 deletions iceoryx_binding_c/source/c_publisher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ void iox_pub_deinit(iox_pub_t const self)
delete self;
}

iox_AllocationResult iox_pub_loan_chunk(iox_pub_t const self, void** const userPayload, const uint32_t userPayloadSize)
iox_AllocationResult iox_pub_loan_chunk(iox_pub_t const self, void** const userPayload, const uint64_t userPayloadSize)
{
return iox_pub_loan_aligned_chunk_with_user_header(self,
userPayload,
Expand All @@ -125,7 +125,7 @@ iox_AllocationResult iox_pub_loan_chunk(iox_pub_t const self, void** const userP

iox_AllocationResult iox_pub_loan_aligned_chunk(iox_pub_t const self,
void** const userPayload,
const uint32_t userPayloadSize,
const uint64_t userPayloadSize,
const uint32_t userPayloadAlignment)
{
return iox_pub_loan_aligned_chunk_with_user_header(self,
Expand All @@ -138,7 +138,7 @@ iox_AllocationResult iox_pub_loan_aligned_chunk(iox_pub_t const self,

iox_AllocationResult iox_pub_loan_aligned_chunk_with_user_header(iox_pub_t const self,
void** const userPayload,
const uint32_t userPayloadSize,
const uint64_t userPayloadSize,
const uint32_t userPayloadAlignment,
const uint32_t userHeaderSize,
const uint32_t userHeaderAlignment)
Expand Down
4 changes: 2 additions & 2 deletions iceoryx_binding_c/source/c_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ void iox_server_release_request(iox_server_t const self, const void* const paylo
iox_AllocationResult iox_server_loan_response(iox_server_t const self,
const void* const requestPayload,
void** const payload,
const uint32_t payloadSize)
const uint64_t payloadSize)
{
return iox_server_loan_aligned_response(
self, requestPayload, payload, payloadSize, IOX_C_CHUNK_DEFAULT_USER_PAYLOAD_ALIGNMENT);
Expand All @@ -124,7 +124,7 @@ iox_AllocationResult iox_server_loan_response(iox_server_t const self,
iox_AllocationResult iox_server_loan_aligned_response(iox_server_t const self,
const void* const requestPayload,
void** const payload,
const uint32_t payloadSize,
const uint64_t payloadSize,
const uint32_t payloadAlignment)
{
IOX_EXPECTS(self != nullptr);
Expand Down
12 changes: 6 additions & 6 deletions iceoryx_binding_c/test/moduletests/test_chunk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ class Chunk_test : public RouDi_GTest
TEST_F(Chunk_test, GettingChunkHeaderFromNonConstUserPayloadWorks)
{
::testing::Test::RecordProperty("TEST_ID", "a044b28d-ad7e-45ed-a0e2-e431ef1eacf0");
constexpr uint32_t USER_PAYLOAD_SIZE(42U);
constexpr uint64_t USER_PAYLOAD_SIZE(42U);
void* userPayload{nullptr};
ASSERT_EQ(iox_pub_loan_chunk(publisher, &userPayload, USER_PAYLOAD_SIZE), AllocationResult_SUCCESS);

Expand All @@ -76,7 +76,7 @@ TEST_F(Chunk_test, GettingChunkHeaderFromNonConstUserPayloadWorks)
TEST_F(Chunk_test, GettingChunkHeaderFromConstUserPayloadWorks)
{
::testing::Test::RecordProperty("TEST_ID", "9f7bb07a-f0dd-4b58-af84-5daec365d9e2");
constexpr uint32_t USER_PAYLOAD_SIZE(42U);
constexpr uint64_t USER_PAYLOAD_SIZE(42U);
void* userPayload{nullptr};
ASSERT_EQ(iox_pub_loan_chunk(publisher, &userPayload, USER_PAYLOAD_SIZE), AllocationResult_SUCCESS);
const void* constUserPayload = userPayload;
Expand All @@ -93,7 +93,7 @@ TEST_F(Chunk_test, GettingChunkHeaderFromConstUserPayloadWorks)
TEST_F(Chunk_test, UserPayloadChunkHeaderUserPayloadRoundtripWorksForNonConst)
{
::testing::Test::RecordProperty("TEST_ID", "ea220aac-4d7d-41c2-92ea-7f929b824555");
constexpr uint32_t USER_PAYLOAD_SIZE(42U);
constexpr uint64_t USER_PAYLOAD_SIZE(42U);
void* userPayload{nullptr};
ASSERT_EQ(iox_pub_loan_chunk(publisher, &userPayload, USER_PAYLOAD_SIZE), AllocationResult_SUCCESS);
const void* constUserPayload = userPayload;
Expand All @@ -107,7 +107,7 @@ TEST_F(Chunk_test, UserPayloadChunkHeaderUserPayloadRoundtripWorksForNonConst)
TEST_F(Chunk_test, UserPayloadChunkHeaderUserPayloadRoundtripWorksForConst)
{
::testing::Test::RecordProperty("TEST_ID", "e094616d-6d99-4b7f-a619-dd98ec7d1e44");
constexpr uint32_t USER_PAYLOAD_SIZE(42U);
constexpr uint64_t USER_PAYLOAD_SIZE(42U);
void* userPayload{nullptr};
ASSERT_EQ(iox_pub_loan_chunk(publisher, &userPayload, USER_PAYLOAD_SIZE), AllocationResult_SUCCESS);

Expand All @@ -120,7 +120,7 @@ TEST_F(Chunk_test, UserPayloadChunkHeaderUserPayloadRoundtripWorksForConst)
TEST_F(Chunk_test, GettingUserHeaderFromNonConstChunkHeaderWorks)
{
::testing::Test::RecordProperty("TEST_ID", "a0df7284-a377-4c6a-b22b-454d3f7c7b88");
constexpr uint32_t USER_PAYLOAD_SIZE(42U);
constexpr uint64_t USER_PAYLOAD_SIZE(42U);
constexpr uint32_t USER_PAYLOAD_ALIGNMENT(64U);
constexpr uint32_t USER_HEADER_SIZE = 16U;
constexpr uint32_t USER_HEADER_ALIGNMENT = 8U;
Expand All @@ -146,7 +146,7 @@ TEST_F(Chunk_test, GettingUserHeaderFromNonConstChunkHeaderWorks)
TEST_F(Chunk_test, GettingUserHeaderFromConstChunkHeaderWorks)
{
::testing::Test::RecordProperty("TEST_ID", "77f4a193-7f44-43ce-8bd8-f9916b8d83dd");
constexpr uint32_t USER_PAYLOAD_SIZE(42U);
constexpr uint64_t USER_PAYLOAD_SIZE(42U);
constexpr uint32_t USER_PAYLOAD_ALIGNMENT(64U);
constexpr uint32_t USER_HEADER_SIZE = 16U;
constexpr uint32_t USER_HEADER_ALIGNMENT = 8U;
Expand Down
6 changes: 3 additions & 3 deletions iceoryx_binding_c/test/moduletests/test_listener.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ class iox_listener_test : public Test
vector<iox_user_trigger_t, MAX_NUMBER_OF_EVENTS_PER_LISTENER + 1U> m_userTrigger;

static constexpr uint32_t NUM_CHUNKS_IN_POOL = MAX_CHUNKS_HELD_PER_SUBSCRIBER_SIMULTANEOUSLY + 2U;
static constexpr uint32_t CHUNK_SIZE = 128U;
static constexpr uint64_t CHUNK_SIZE = 128U;
static constexpr uint64_t MEMORY_SIZE = 1024U * 1024U * 100U;
uint8_t m_memory[MEMORY_SIZE];
BumpAllocator m_memoryAllocator{m_memory, MEMORY_SIZE};
Expand Down Expand Up @@ -511,7 +511,7 @@ TIMING_TEST_F(iox_listener_test, SubscriberCallbackIsCalledSampleIsReceived, Rep
Eq(iox_ListenerResult::ListenerResult_SUCCESS));

Subscribe(m_subscriber[0U]);
constexpr uint32_t USER_PAYLOAD_SIZE{100U};
constexpr uint64_t USER_PAYLOAD_SIZE{100U};

auto chunkSettingsResult = ChunkSettings::create(USER_PAYLOAD_SIZE, iox::CHUNK_DEFAULT_USER_PAYLOAD_ALIGNMENT);
ASSERT_FALSE(chunkSettingsResult.has_error());
Expand All @@ -537,7 +537,7 @@ TIMING_TEST_F(iox_listener_test, SubscriberCallbackWithContextDataIsCalledSample
Eq(iox_ListenerResult::ListenerResult_SUCCESS));

Subscribe(m_subscriber[0U]);
constexpr uint32_t USER_PAYLOAD_SIZE{100U};
constexpr uint64_t USER_PAYLOAD_SIZE{100U};

auto chunkSettingsResult = ChunkSettings::create(USER_PAYLOAD_SIZE, iox::CHUNK_DEFAULT_USER_PAYLOAD_ALIGNMENT);
ASSERT_FALSE(chunkSettingsResult.has_error());
Expand Down
4 changes: 2 additions & 2 deletions iceoryx_binding_c/test/moduletests/test_notification_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class iox_notification_info_test : public Test

iox::mepoo::SharedChunk getChunkFromMemoryManager()
{
constexpr uint32_t USER_PAYLOAD_SIZE{100U};
constexpr uint64_t USER_PAYLOAD_SIZE{100U};

auto chunkSettingsResult = ChunkSettings::create(USER_PAYLOAD_SIZE, iox::CHUNK_DEFAULT_USER_PAYLOAD_ALIGNMENT);
IOX_ENSURES(chunkSettingsResult.has_value());
Expand All @@ -105,7 +105,7 @@ class iox_notification_info_test : public Test
UserTrigger m_userTrigger;

static constexpr uint32_t NUM_CHUNKS_IN_POOL = MAX_CHUNKS_HELD_PER_SUBSCRIBER_SIMULTANEOUSLY + 2;
static constexpr uint32_t CHUNK_SIZE = 128U;
static constexpr uint64_t CHUNK_SIZE = 128U;
static constexpr size_t MEMORY_SIZE = 1024 * 1024 * 100;
uint8_t m_memory[MEMORY_SIZE];
BumpAllocator m_memoryAllocator{m_memory, MEMORY_SIZE};
Expand Down
4 changes: 2 additions & 2 deletions iceoryx_binding_c/test/moduletests/test_publisher.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ class iox_pub_test : public Test
static constexpr size_t MEMORY_SIZE = 1024 * 1024;
uint8_t m_memory[MEMORY_SIZE];
static constexpr uint32_t NUM_CHUNKS_IN_POOL = 20;
static constexpr uint32_t CHUNK_SIZE = 256;
static constexpr uint64_t CHUNK_SIZE = 256;

using ChunkQueueData_t = popo::ChunkQueueData<DefaultChunkQueueConfig, popo::ThreadSafePolicy>;
ChunkQueueData_t m_chunkQueueData{iox::popo::QueueFullPolicy::DISCARD_OLDEST_DATA,
Expand Down Expand Up @@ -284,7 +284,7 @@ TEST_F(iox_pub_test, allocate_chunkFailsWhenHoldingToManyChunksInParallel)
TEST_F(iox_pub_test, allocate_chunkFailsWhenOutOfChunks)
{
::testing::Test::RecordProperty("TEST_ID", "7563ed4c-a6d5-487d-9c6c-937d8e8c3d1d");
constexpr uint32_t USER_PAYLOAD_SIZE{100U};
constexpr uint64_t USER_PAYLOAD_SIZE{100U};

auto chunkSettingsResult = ChunkSettings::create(USER_PAYLOAD_SIZE, iox::CHUNK_DEFAULT_USER_PAYLOAD_ALIGNMENT);
ASSERT_FALSE(chunkSettingsResult.has_error());
Expand Down
2 changes: 1 addition & 1 deletion iceoryx_binding_c/test/moduletests/test_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ class iox_server_test : public Test
return &*sutPort;
}

void receiveRequest(const int64_t requestValue = 0, const uint32_t chunkSize = sizeof(int64_t))
void receiveRequest(const int64_t requestValue = 0, const uint64_t chunkSize = sizeof(int64_t))
{
auto chunk = memoryManager.getChunk(*iox::mepoo::ChunkSettings::create(
chunkSize, iox::CHUNK_DEFAULT_USER_PAYLOAD_ALIGNMENT, sizeof(RequestHeader)));
Expand Down
4 changes: 2 additions & 2 deletions iceoryx_binding_c/test/moduletests/test_subscriber.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class iox_sub_test : public Test

iox::mepoo::SharedChunk getChunkFromMemoryManager()
{
constexpr uint32_t USER_PAYLOAD_SIZE{100U};
constexpr uint64_t USER_PAYLOAD_SIZE{100U};

auto chunkSettingsResult = ChunkSettings::create(USER_PAYLOAD_SIZE, iox::CHUNK_DEFAULT_USER_PAYLOAD_ALIGNMENT);
IOX_ENSURES(chunkSettingsResult.has_value());
Expand All @@ -104,7 +104,7 @@ class iox_sub_test : public Test
static constexpr size_t MEMORY_SIZE = 1024 * 1024 * 100;
uint8_t m_memory[MEMORY_SIZE];
static constexpr uint32_t NUM_CHUNKS_IN_POOL = MAX_CHUNKS_HELD_PER_SUBSCRIBER_SIMULTANEOUSLY + 2U;
static constexpr uint32_t CHUNK_SIZE = 128U;
static constexpr uint64_t CHUNK_SIZE = 128U;

BumpAllocator m_memoryAllocator{m_memory, MEMORY_SIZE};
MePooConfig m_mempoolconf;
Expand Down
8 changes: 4 additions & 4 deletions iceoryx_examples/iceperf/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,8 @@ struct PerfSettings

struct PerfTopic
{
uint32_t payloadSize{0};
uint32_t subPackets{0};
uint64_t payloadSize{0};
uint64_t subPackets{0};
RunFlag runFlag{RunFlag::RUN};
};
```
Expand Down Expand Up @@ -260,8 +260,8 @@ void IcePerfLeader::doMeasurement(IcePerfBase& ipcTechnology) noexcept
return (std::make_tuple(memorySize, iox::string<2>("B")));
};

std::vector<std::tuple<uint32_t, iox::units::Duration>> latencyMeasurements;
const std::vector<uint32_t> payloadSizes{16,
std::vector<std::tuple<uint64_t, iox::units::Duration>> latencyMeasurements;
const std::vector<uint64_t> payloadSizes{16,
32,
64,
128,
Expand Down
2 changes: 1 addition & 1 deletion iceoryx_examples/iceperf/base.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
#include "base.hpp"


void IcePerfBase::preLatencyPerfTestLeader(const uint32_t payloadSizeInBytes) noexcept
void IcePerfBase::preLatencyPerfTestLeader(const uint64_t payloadSizeInBytes) noexcept
{
sendPerfTopic(payloadSizeInBytes, RunFlag::RUN);
}
Expand Down
6 changes: 3 additions & 3 deletions iceoryx_examples/iceperf/base.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,22 +28,22 @@
class IcePerfBase
{
public:
static constexpr uint32_t ONE_KILOBYTE = 1024U;
static constexpr uint64_t ONE_KILOBYTE = 1024U;

virtual ~IcePerfBase() = default;

virtual void initLeader() noexcept = 0;
virtual void initFollower() noexcept = 0;
virtual void shutdown() noexcept = 0;

void preLatencyPerfTestLeader(const uint32_t payloadSizeInBytes) noexcept;
void preLatencyPerfTestLeader(const uint64_t payloadSizeInBytes) noexcept;
void postLatencyPerfTestLeader() noexcept;
void releaseFollower() noexcept;
iox::units::Duration latencyPerfTestLeader(const uint64_t numRoundTrips) noexcept;
void latencyPerfTestFollower() noexcept;

private:
virtual void sendPerfTopic(const uint32_t payloadSizeInBytes, const RunFlag runFlag) noexcept = 0;
virtual void sendPerfTopic(const uint64_t payloadSizeInBytes, const RunFlag runFlag) noexcept = 0;
virtual PerfTopic receivePerfTopic() noexcept = 0;
};

Expand Down
2 changes: 1 addition & 1 deletion iceoryx_examples/iceperf/iceoryx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ void Iceoryx::shutdown() noexcept
std::cout << " [ finished ]" << std::endl;
}

void Iceoryx::sendPerfTopic(const uint32_t payloadSizeInBytes, const RunFlag runFlag) noexcept
void Iceoryx::sendPerfTopic(const uint64_t payloadSizeInBytes, const RunFlag runFlag) noexcept
{
m_publisher.loan(payloadSizeInBytes).and_then([&](auto& userPayload) {
auto sendSample = static_cast<PerfTopic*>(userPayload);
Expand Down
2 changes: 1 addition & 1 deletion iceoryx_examples/iceperf/iceoryx.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class Iceoryx : public IcePerfBase
const iox::capro::IdString_t& subscriberName,
const iox::capro::IdString_t& eventName) noexcept;
virtual void init() noexcept;
void sendPerfTopic(const uint32_t payloadSizeInBytes, const RunFlag runFlag) noexcept override;
void sendPerfTopic(const uint64_t payloadSizeInBytes, const RunFlag runFlag) noexcept override;
PerfTopic receivePerfTopic() noexcept override;

iox::popo::UntypedPublisher m_publisher;
Expand Down
6 changes: 3 additions & 3 deletions iceoryx_examples/iceperf/iceoryx_c.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@ IceoryxC::IceoryxC(const iox::capro::IdString_t& publisherName, const iox::capro
{
iox_pub_options_t publisherOptions;
iox_pub_options_init(&publisherOptions);
publisherOptions.historyCapacity = 1U;
publisherOptions.historyCapacity = 0U;
m_publisher = iox_pub_init(&m_publisherStorage, "IcePerf", publisherName.c_str(), "C-API", &publisherOptions);

iox_sub_options_t subscriberOptions;
iox_sub_options_init(&subscriberOptions);
subscriberOptions.queueCapacity = 1U;
subscriberOptions.historyRequest = 1U;
subscriberOptions.historyRequest = 0U;
m_subscriber = iox_sub_init(&m_subscriberStorage, "IcePerf", subscriberName.c_str(), "C-API", &subscriberOptions);
}

Expand Down Expand Up @@ -83,7 +83,7 @@ void IceoryxC::shutdown() noexcept
std::cout << " [ finished ]" << std::endl;
}

void IceoryxC::sendPerfTopic(const uint32_t payloadSizeInBytes, const RunFlag runFlag) noexcept
void IceoryxC::sendPerfTopic(const uint64_t payloadSizeInBytes, const RunFlag runFlag) noexcept
{
void* userPayload = nullptr;
if (iox_pub_loan_chunk(m_publisher, &userPayload, payloadSizeInBytes) == AllocationResult_SUCCESS)
Expand Down
Loading

0 comments on commit 39b82b1

Please sign in to comment.