Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
jazzy

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
kilted

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
lyrical

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
rolling

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro ardent showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro bouncy showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro crystal showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro eloquent showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro dashing showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro galactic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro foxy showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro iron showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro lunar showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro jade showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro indigo showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro hydro showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro kinetic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro melodic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange

No version for distro noetic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

data_tamer_cpp package from data_tamer repo

data_tamer_cpp data_tamer_msgs

ROS Distro
humble

Package Summary

Version 2.0.0
License MIT
Build type AMENT_CMAKE
Use RECOMMENDED

Repository Summary

Description C++ library for Fearless Timeseries Logging
Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-09
Dev Status MAINTAINED
Released RELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

DataTamer data logging library

Maintainers

  • Davide Faconti
  • Henry Moore
  • Nathan Brooks

Authors

  • Davide Faconti
README
No README found. See repository README.
CHANGELOG

Changelog for package data_tamer

Unreleased

  • Fixed, deadlocks: unregister(), removeDataSink() or a LoggedValue destructor inside scopedWrite() while a snapshot waited; a const query inside scopedWrite() while another thread ran one of those, or startLogging(); startLogging() inside scopedWrite(). The snapshot path takes the write mutex before its epoch, and startLogging() before the control mutex.
  • Behaviour change: a snapshot taken by a thread that holds the channel's transaction or a LoggedValue guard returns blocked (it hung).
  • New: several threads may take snapshots of one channel; they take turns on the write mutex. blocked now takes precedence over pool_exhausted.
  • Fixed: a consumer built with -fvisibility=hidden against a shared libdata_tamer hung in LoggedValue::set() inside scopedWrite(); ChannelSharedState has default visibility.
  • Behaviour change: SinkWorker::stop(), start() and drain() throw std::logic_error from a callback of their own sink (they deadlocked, or stop() closed the worker silently). Concurrent stop() and start(), two stopAll() included, are serialized (they hung). A callback that releases the last reference to its own worker no longer calls std::terminate.
  • Fixed: a sink attached during a failing startLogging() could miss the final schema, and a concurrent addDataSink() of one worker announced it twice.
  • Real-time: no notify_all() per snapshot or refused push unless a thread waits; each one could be a futex call.
  • Behaviour change: names must be non-empty and free of whitespace and control characters (only the space was refused); IsCanonicalName() agrees. A ninth default sink throws in addDefaultSink() (it made every later getChannel() throw).
  • Behaviour change: custom type names, their field names, the typeName() of a registerCustomValue() serializer and channel names are checked too: a line break in any of them split the schema text, and a space in a type or field name broke its field line. Type and field names follow the value name rules, and the registration throws std::runtime_error. A channel name can contain spaces, but LogChannel::create() and getChannel() throw for an empty one or one with a control character.
  • Fixed: a registration that throws leaves the channel unchanged (custom types, an allocation failure, createLoggedValue()). Two C++ types that return one custom type name in a channel make registerValue() throw (the second used the first one's serializer and read past its object). ToStr(Schema) rethrows allocation failures.
  • Fixed: long long, unsigned long long, wchar_t, char16_t, char32_t and enums over them are recorded by size and signedness; they were recorded as other, which no decoder reads. long double is a compile error. A class template with two or more type parameters can have a TypeDefinition.
  • Fixed: a vector of structs was sized with padding, so tryTakeSnapshot() could return oversize for a payload that fit. ValuePtr checks the room before writing a number and writes little-endian on any host; a custom type without a serializer throws std::invalid_argument.
  • Fixed, wire: a std::string, registered or inside a custom type, is written as char[] (a uint32 count and the characters), as its schema says. It carried a 16-bit length that no decoder could read, and a string over 65535 bytes made the snapshot throw.
  • Fixed: MCAPSink reset without rollover and restartRecording() of the file in use wrote the old footer into the new file; the old writer is now closed first, and a failed reopen of that file stops the sink. A rollover that cannot open its next file is counted once and retried after another reset time.
  • Fixed: MCAPRingSink::flushPendingDump() and stop() on an untriggered request use the newest timestamp of the current run, so a simulation reset no longer dumps the previous run. dumps_written and dumps_failed count a dump before its callback.
  • Fixed: MCAPRingSink starts a new run only when a channel's clock steps back by more than window. Snapshots of one channel taken by several threads can arrive slightly out of order, and each step back started a run, so a flush right after ended its dump before the newest snapshot.
  • Behaviour change: MCAP sinks reject a negative snapshot timestamp (counted in errors(), not written), and mcap_encoding::WriteMessage() throws for one.
  • Parser and Python decoder: the work of a decode is bounded by the payload (a zero-size element type looped for minutes); a bool is true for any non-zero byte; empty schema text is rejected; ### key:value headers are read; version and hash are strict unsigned decimals; a separator is a whole line of at least 30 =; ENCODING: sections are opaque types and must follow MSG:; upper-case legacy names are read only without a ### version: line. New SplitMcapMessage() and split_mcap_message(), used by mcap_reader.
  • Breaking, parser: ParseSnapshot() loses its unused callback_custom parameter; SizeOf, kMaxSchemaDepth and ParseSnapshotRecursive move to DataTamerParser::detail and NullCustomCallback is removed; the header needs a little endian host and no longer includes <iostream>.
  • SerializeMe: bounds checks for byte vectors and 1-byte arrays, exact BufferSize() for arrays and padded structs, bool decoding, a container of 2\^32 elements or more throws, an ADL TypeDefinition() may return const char* or std::string, Span<const T> from std::array, and the big endian path compiles for enums and std::byte.
  • API: [[nodiscard]] on trySetEnabled(),

File truncated at 100 lines see the full file

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged data_tamer_cpp at Robotics Stack Exchange