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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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

Checkout URI https://github.com/PickNikRobotics/data_tamer.git
VCS Type git
VCS Version main
Last Updated 2026-10-18
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

  • Breaking, headers: the public headers move from data_tamer/ to data_tamer_v2/ (#include "data_tamer_v2/channel.hpp"), and the standalone parser from data_tamer_parser/data_tamer_parser.hpp to data_tamer_v2/data_tamer_parser.hpp, so that 2.x installs side by side with 1.x, whose headers keep their paths.
  • ABI: ChannelSharedState, its WriteMutex and the series flag words are library-private (src/): the headers details/shared_state.hpp, details/write_mutex.hpp and details/spin_pause.hpp are no longer installed, and consumers see ChannelSharedState only as an incomplete type. LoggedValue reaches its enabled flag through the exported details::setSeriesEnabled() and isSeriesEnabled(), so the flag encoding and these layouts can change in a 2.x minor release. WriteTransaction is a class at namespace scope (it was the alias ChannelSharedState::Transaction), declared in details/locked_reference.hpp and still returned by scopedWrite(). Rebuild consumers built against earlier headers.
  • Behaviour change, parser and Python decoder: a schema text in the line format needs its ### version: line before the fields; without one both throw, naming the supported versions (4 and 5, 6 in YAML). The C++ parser read such a text as an upper-case "name TYPE" format that no release wrote, or as version 5, and the Python decoder as version 5. Texts of the releases before 0.7.0 (late 2023) fail with that message, among them the header-less <type> <name> lines of the 0.3 to 0.5 ROS 2 publisher, which both used to read (docs/wire_format.md, section 2).
  • Fixed, Python decoder: verify_hash=True (parse_schema(), SchemaRegistry, iter_mcap()) rejected every data_tamer 1.x file (schema version 4). Its hash came from the writer's std::hash and cannot be recomputed, so it is accepted as declared. The C++ check_hash still recomputes it, which agrees only with the writer's standard library (docs/wire_format.md, section 5).
  • Docs: docs/MIGRATION.md lists what code written for 1.x must change for 2.0, with the behaviour changes that compile silently.
  • Real-time: the first access of the transaction state on a thread no longer allocates when libdata_tamer is loaded with dlopen() (a plugin, pluginlib, ros2_control), so a scopedWrite() on each real-time thread during setup is no longer needed. The library's one thread-local is initial-exec TLS (glibc): dlopen() takes one pointer of glibc's static TLS surplus.
  • ABI: the WriteTransaction constructor and destructor (behind scopedWrite(), the guards and non-scalar LoggedValues) and ChannelSharedState::inTransactionOnThisThread() are defined in the library, with the thread-local chain. The chain is no longer an inline protocol, so later 2.x releases can change it; only the size of WriteTransaction is pinned. Rebuild consumers built against earlier headers.
  • API: data_tamer_v2/data_tamer.hpp includes channel.hpp again, as in 1.x, so one include gives ChannelsRegistry, LogChannel, LoggedValue and the sink interface. data_tamer_v2/fwd.hpp stays for headers that only name the types.
  • API: takeSnapshot() is no longer [[nodiscard]]: stats() counts every outcome, and most loops don't act on each call. tryTakeSnapshot() still is.
  • API: no LogChannel::droppedSnapshots(), which no release had: read stats().dropped_by_sink. LogChannel::sinkDropped() and ChannelDefaults::resolve() (with ChannelDefaults::Sizes) are private: they are the building blocks of stats() and setChannelDefaults(). Their symbols stay exported (the inline stats() calls sinkDropped()).
  • 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(); the transaction code is defined in the library only.
  • 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

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