# Tango C++ library 10.3.0 Release Notes

February 06, 2026

## Breaking changes

- The `class_factory` mechanism has changed to requiring device servers to subclass the `DServer` class, providing an override for the virtual `class_factory` member function, then registering a constructor to this derived class with `Util::register_dserver_constructor` before calling `server_init`.  This can be handled in a backwards compatible manner regenerating with pogo version 9.10.6 and onwards. See [TangoTest!71](https://gitlab.com/tango-controls/TangoTest/-/merge_requests/71) for an example of migrating. #933
- The layout of header files has been drastically reworked so that we have roughly one header file per class.  Users just including "tango/tango.h" (such as those using pogo) should not be affected, however, if users are including a specific file from the tango directory it is likely this will no longer work. #1561
- Version information has been moved into the header "tango/common/version.h". #1591
- `*EventData` classes are no longer default constructible. #1485
- cppTango now requires opentelemetry version 1.16 or newer when building with `TANGO_USE_TELEMETRY=ON`. #1528

## Features

- Tango now provides TANGO_MAKE_VERSION and TANGO_VERSION macros to allow easier version checking. #1520
- Add support for configuring telemetry at runtime using DServer commands and at initialisation time using device properties. !1517
- Add support for multiple telemetry exporters/endpoints. #1517
- Add telemetry span attributes that identify the client. #1539
- Add support for filtering telemetry spans based on topics. Note, no currently emitted spans have topics yet. !1517
- Add `ApiUtil::query_event_system` allowing pure clients to query how the event system is being used. #1522
- Telemetry related DeviceImpl methods are now virtual. #1601
- Add `Util::cleanup` static method to allow stopping and restarting Tango in the same process. #1556

## Bug fixes

- Fix Attribute::reset_value to also clear the data_size to 0, avoiding potential crashes. #1585
- Fix `DeviceAttribute` methods to correctly accept C-style enums. #1579
- Fix installed "tango.pc" when `CMAKE_INSTALL_LIBDIR` is absolute. #1578
- Fix precompiled header compatibility with CMake 4.2.0. #1535
- Fix incorrect name mangling of `DServer::class_factory` with some MSVC compilers. #933
- Fix crash when using Tango telemetry from an `atexit` handler. #1400
- Fix re-connection to Tango events after call to `ApiUtil.cleanup()`. #1514
- Fix push events from Tango devices without even the nodb database (i.e. the TangoDatabase device itself). #1542
- Avoid duplicate events when an old client subscribes. #1531
- Fix wrong IDL used when re-connecting to events. #1506
- Fix ALARM EVENT stopping after a certain period by ensuring the server does not incorrectly reject re-subscription requests. #1605
- Avoid potential deadlocks by clearing ApiUtil singleton in child process after fork(). !1526
- Avoid potential deadlocks by prohibiting use of a Util singleton in a child process if it existed when we fork(). !1526

## Other changes

- Completely incorporated log4tango into cppTango.  #958
- Update to LLVM 21 for CI testing. #1586
- Replace API "Except" classes such as `ApiConnExcept` with aliases to template instantiations to avoid macro use. !1559
- Update header files to be self-contained, making it easier to include them directly. #1587
- Use internal macOS CI runners. !1556
- Fix old test setup script to launch MySQL container with a higher ulimit. #1570
- Generate tango/tango.h. !1522
- Standardise header include guards. !1545
- Clarify licensing. #1393, #1392, #1059
- Adopt SPDX license headers. #863
- Include existing exception when throwing from `Attribute::set_upd_properties`. #1548
- Use omniORB 4.3.3 on Windows CI. #1461
- Replace micromamba with pixi on macOS CI. !1516

## 10.3.0 - Source Code Comparison With Version 10.1.0

You can view the source code comparison with Tango 10.3.0, as well as the
commits and contributors on this page:
https://gitlab.com/tango-controls/cppTango/-/compare/10.1.0...10.3.0

## 10.3.0 - Milestone

All the issues and Merge Requests associated to the 10.3.0 milestone can be
found here: https://gitlab.com/tango-controls/cppTango/-/milestones/18


# Tango C++ library 10.1.0 Release Notes

August 14th, 2025

## Features

- Add performance monitoring for ZMQ event system #1403
- Greatly improve command line help output for device servers #1299
- Don't block signals anymore on posix platforms #1215
- Fix all known memory leaks #1363, #1339, #1337, #1381, #1232, #368, #1402, !1431, #1474
- Add new event subscription modes supporting asynchronous subscription with/without entity reading #1344, #1498

## Bug fixes

- Fix error reporting for async attribute reading #1231 and writing #1361
- Pushing events from read method does not clear value flag #1407
- Fix "re-activating" callbacks scheduled for unsubscription  #1408
- Avoid crash on shutdown with several unsubscribe events #1409, #620, #540, #1319
- Fix overflow on the check_rds function on w_attribute #1038
- Fix UserDefaultAttrprop::set_enum_labels: appending enum labels #1368
- Fix timestamps in event classes for DataReadyEventData/DevIntrChangeEventData #1341
- Keep ZMQ error information when port binding fails #1405
- Fix create_cpp_class not working with new prefix logic #1373
- Fix `Database::get_device_attribute_property_history`: the attribute name and the property name are the
  wrong way around #1414
- server/utils.cpp: Use tango error streams for error message #1472
- Fix the version sorting in the documentation page popup menu #1332
- Handle exceptions in async callbacks #1423
- Simplify telemetry function signatures #1434
- Fix no callback/event queue data when stateless subscription fails #1445
- Fix cannot extract DeviceDataHistory for DevVarBooleanArray commands #1449
- Attribute::set_upd_properties: Handle no database case gracefully #1476
- Database::make_history_array: Fix attribute DbHistory construction #1414
- Util::fill_attr_polling_buffer: Output error messsage also for IDL 1 and 2 #1397
- Make constructors of classes inheriting from CORBA::omni_thread private #1399
- Fix sent client IDL version on event subscription #1509
- Remove TANGO_OMNIIDL_PATH from INSTALL.md #1489
- Avoid CORBA exception with no attributes for get_attribute_configXXX #1512

## Other Changes

- Fix address sanitizer failure when AttributeProxy throws #1440
- Fix address sanitizer error when deleting EventQueue #1446
- CI: Fix backtrace reporting to include symbols #1410
- Add and use more matchers for the new catch2 tests #1309
- Switch pages and documentation-site jobs to our runners #1419
- Fix compilation with clang and PCH #1336
- Tidy up pid handling #1367
- Upgrade shipped opentelemetry to v1.16.0 for Windows packages
- Fix pkgconfig not mentioning the jpeg library #1441
- Add CI testing with GCC 15.1 #1417
- Show the omniidl generated classes in the API documentation #1349
- Don't define omniORB defines anymore directly #1331
- Change CI to have only one test job executing the old/cxx tests #1323
- Make failing tests less likely to provoke UBSAN errors #1443
- Fix default constructed AttrConfEventData crashes on destruction #1383
- Update base image for llvm latest image #1429
- Document IDL v1/v2 specialities for our read/write attribute methods #1334
- Remove obsolete READMEs #1033
- Catch2 tests avoid using the wrong attribute read/write functions #1353
- Fix outputting wrong information for the writeability of an Attribute #1364
- Switch to ninja as generator #1330
- Update sanitizer CI job to use llvm-latest image #1338
- Fix hard-coded polling period in change events on NaN tests #1462
- Enhance and add more cmake presets #1465
- Port lots of tests to catch2 !1454, !1407, !1391, !1378, !1374, !1352, !1466
- Revise event subscription code a bit !1452
- EventConsumerKeepAliveThread: Remove unnecessary sleep #1466
- Add CI job with upcoming debian 13 (aka trixie) #1467
- Remove testing with Ubuntu 20.04 #1468
- Raise maximum cmake version to 4.0 #1469
- Update macos image in CI #1470
- Update LLVM to 20 in CI #1471
- Add VERSIONING.md #1369
- CI: switch to DESY MacOS runner for MRs #1475
- Move more templates to cpp files and use explicit instantiation
- Prefer prebuilt libjpeg binaries for Windows #1413
- Add environments for code coverage and documentation #1486
- Replace unsafe C/C++ string-to-interger parsing routines #1271
- Rework release notes layout #1424
- Remove pointless warning ignore #1513
- Check for dead code using clang and remove it #1499
- Pass sanitizer environment variables to TestServer in catch2 tests #1501

## 10.1.0 - Breaking Changes

- The DServerSignal class has been completely refactored to handle signals delivered to threads started before
  Tango.  Clients of the class calling the `register_*_handler` etc. functions should be unaffected, however,
  the internals have been completely rewritten meaning subclasses of `DServerSignal` may also have to be
  re-written.
- The `DServerSignal::get_sig_thread_pid` member function has been removed, if you were calling this function
  you can replace it with `getpid()` without issue.
- `DServerSignal` no longer inherits from `TangoMonitor`, if you were using this object to synchronise threads
  you will now need to create your own `TangoMonitor` object to do this.
- The protected member `LockThread::admin_proxy` has changed from a `DeviceProxy *` to a
  `std::unique_lock<DeviceProxy>`.  In the unlikely event that you are inheriting from `LockThread`, you may be
  affected by this change.  If required, you can get access to the raw pointer using `std::unique_ptr::get()`.
- The `get_value_storage()` template function has been correctly moved to the "privatesection", so that it no
  longer appears in the documentation.  This function template is only intended for internal use in cppTango
  and was incorrectly exposed previously.  The API of the function template has also changed in this release,
  so external users of the function will be broken. The protected members `value` and `value_flag` have been
  removed from `Tango::Attribute` and replaced with the protected member `attribute_value`.  Sub-classes of
  `Tango::Attribute` can replace uses of `value` with calls to `attribute_value.get<T>()` and replace tests of
  `value_flag` with calls to `attribute_value.has_value()`.  Sub-classes which were setting `value_flag` will
  be broken, as it is no longer possible to independently set the `value_flag` from whether the value of the
  attribute is engaged.
- The `DeviceImpl::blackbox_ptr` protected member is now a `std::unique_ptr`.
- The `ApiUtil::get_zmq_event_consumer()` and `ApiUtil::get_notifd_event_consumer()` now return
  `Tango::PointerWithLock` objects rather than raw pointers.  `Tango::PointerWithLock` are unmovable and
  non-copyable and while they exist, the corresponding event consumer will not be deleted. Multiple copies of the
  values returned by `ApiUtil::get_zmq_event_consumer()` and `ApiUtil::get_notifd_event_consumer()` can be
  held at the same time in the same or different threads.  These objects should not be held for extended
  periods of time as their existence prevents the shutdown of Tango.
- Similarly, the `ApiUtil::create_zmq_event_consumer()` and `ApiUtil::create_notifd_event_consumer()` are now
  idempotent and either return a `Tango::PointerWithLock` to the existing event consumer or create the event
  consumer before returning the `Tango::PointerWithLock`.  The `ApiUtil::get_zmq_event_consumer` and
  `ApiUtil::get_notifd_event_consumer()` return a `Tango::PointerWithLock` that compares equal to `nullptr` if
  the corresponding event consumer does not exist.
- Revise header inclusion to be more self-contained, this might break users who don't include what they use
- Event names in event classes now no longer have an `idl5_` prefix when Tango is reporting that the
  subscription has failed !1460
- Make destructor of `Tango::Util` private. Users wanting to shutdown the device server should use
  `Tango::Util::shutdown_ds` or `Tango::Util::server_cleanup` before process exit.
- The event classes have a new member `event_reason` to support notification of clients when a subscription
  succeeds or fails. This is especially useful for `EventSubMode::Async` to know the subscription status. This
  also means that the signature of the event class constructors changed, so user code which used these must be
  adapted.

## 10.1.0 - Source Code Comparison With Version 10.0.0

You can view the source code comparison with Tango 10.1.0, as well as the
commits and contributors on this page:
https://gitlab.com/tango-controls/cppTango/-/compare/10.0.0...10.1.0

## 10.1.0 - Milestone

All the issues and Merge Requests associated to the 10.1.0 milestone can be
found here: https://gitlab.com/tango-controls/cppTango/-/milestones/11

# Tango C++ library 10.0.2 Release Notes

Feb 13th, 2025

Note: There is no final 10.0.1 release. The reason is that we have an old git tag from 2017 lying around named
`10.0.1` from a previous endeavor. Therefore we decided it is safer to use `10.0.2` instead of overwriting
the old one.

## Bug fixes

- Fix crash in AttributeProxy with unresponsive but exported device server #1374
- Add forgotten IDLv6 device server to Connection assignment operator #1375
- Allow compilation against opentelemetry-cpp versions >= v1.17.0 #1384

## 10.0.2 - Source Code Comparison With Version 10.0.0

You can view the source code comparison with Tango 10.0.2, as well as the
commits and contributors on this page:
https://gitlab.com/tango-controls/cppTango/-/compare/10.0.0...10.0.2

## 10.0.2 - Milestone

All the issues and Merge Requests associated to the 10.0.2 milestone can be
found here: https://gitlab.com/tango-controls/cppTango/-/milestones/17

# Tango C++ library 10.0.0 Release Notes

September 27th, 2024

Table of Contents
=================
  - [What's New (Since Version 9.5.0)?](#whats-new-since-version-950)
  - [10.0.0 - Bug Fixes](#1000-bug-fixes)
  - [10.0.0 - Changes](#1000-changes)
  - [10.0.0 - Source Code Comparison With Version 9.5.0](#1000-source-code-comparison-with-version-950)
  - [10.0.0 - Milestone](#1000-milestone)
  - [10.0.0 - Feedback](#1000-feedback)
  - [10.0.0 - Contributions](#1000-contributions)
  - [10.0.0 - Acknowledgement](#1000-acknowledgement)

## What's New Since Version 9.5.0?

This cppTango release is a major release. It contains new features, uses a new
IDL version and has improvements in several areas that are relevant to the
users of cppTango. Please refer to [features](#1000-features), [improvements
and changes](#1000-changes) and [the selection of fixes](#1000-bug-fixes)
where we highlight what was improved or modified.

## 10.0.0 - Features

### Experimental support for client/server tracing using OpenTelemetry #1185, #1323

cppTango 10.0.0 provides telemetry support for all device servers using IDLv4 or
later and works on Linux, MacOSX and Windows.  For a description of the various
concepts introduce by telemetry see the [OpenTelemerty
website](https://opentelemetry.io/).  For more information about using telemetry
with cppTango see [Telemetry Support](@ref telemetry) in the documentation.

### New Alarm Event #1030

cppTango 10.0.0 introduces support for the new alarm events.  Alarm events can
be thought of as a subset of change events, only events which involve a
transition to or from the `Tango::ATTR_ALARM` or `Tango::ATTR_WARNING` quality
factors.

The polling thread will send alarm events for all polled attributes to any
clients that subscribe to alarm events with a call to
`DeviceProxy::subscribe_event()`, passing `Tango::ALARM_EVENT`.

Devices which manually push change events will automatically also push alarm
events to clients which have subscribed to alarm events, unless the manual
pushing of alarm events has been enabled for the attribute with
`Tango::Attr::set_alarm_event()` or the `CtrlSystem` property
`AutoAlarmOnChangeEvent` is defined and falsey.

### Extended version information #1155

cppTango 10.0.0 introduces support for more detailed version information which
is also extendable by users.  Servers can add key/value pairs to the version
information by calling `DeviceImpl::add_version_info()`.  cppTango 10.0.0
adds version information about itself and the various dependencies it was
compiled against.

Clients can request this information with a call to `DeviceProxy::info()`
where the assigned key/value pairs will be available in the
`Tango::_DeviceInfo::version_info` member.

### Other features

- Introduce `Tango::Device_6Impl` class with support for new Tango IDLv6 features
- `TANGO_BASE_CLASS` now points to `Tango::Device_6Impl`
- Require at least C++17 for compilation #1176
- Provide a cmake package configuration file on Linux/MacOSX/Windows #857, #1277
- Add new test framework catch2, version 3.3.0 or newer, for faster and
  dockerless testing supports FileDatabase, environment variables and runs on
  Linux/MacOSX/Windows #870, #1204.

## 10.0.0 - Breaking Changes

- Remove the QUALITY_EVENT enum member from EVENT_TYPE #1260

## 10.0.0 - Other Changes

- Run existing (pre-catch2) tests with older IDLv5 in addition to the current IDL version #1036
- Implement DbPutProperty, DbDeleteProperty functions for free properties in the FileDatabase
- Add support for device servers in dynamic libraries on MacOSX #1244
- Add cmake presets #1226
- Make the tests also work with the static cppTango library #1213
- Introduce developer documentation for exception vs assert #1041
- Add CI with Ubuntu 22.04/24.04 LTS versions #1279, #1280
- Update GCC version to 14.1 for testing #1281
- Switch to MSVC 2022 as compiler on Windows #1282
- Make passing UBSAN in CI required #1175
- Add compilation testing CI with C++20/23 #1283
- Prefer std::chrono over time(NULL) for accuracy reasons #1080
- Include `-otel` as part of the windows package name if included #1284
- Improve error messages when encountering a TangoMonitor timeout #1215
- Include the minor version in the SOVERSION #1285
- Improve core-dump reporting for Catch2Tests #1296
- Update CI to use LLVM 18 #1241
- Require tangoidl 6.0.2 and check for this at configure time #1228
- Run Catch2Tests on Windows #1223
- Install minimum required binaries when building Windows packages #1290
- Publish multi-version documentation, available [here](https://tango-controls.gitlab.io/cppTango/) #890
- Improve install instructions #1298
- Allow superprojects to override searching for tangoidl #1318
- Improve set_value error message if data type is wrong #1306
- Reduced code duplication for `Attribute::fire_<>_event code` #1317
- DServer::create_cpp_class now looks for filenames with user provided prefixes #1245

## 10.0.0 - Bug fixes

- Fix some memory leaks in the FileDatabase #1261
- Avoid crash when listing the number of device classes where the admin device was deleted before #1243
- Fix segfault during shutdown #1218
- Fix a potential crash when running without Tango Database #1080
- Fix crash with forwarded attributes for Spectrum and Image types #1018
- Potential crash at server init when a device server uses groups in a thread #867
- Fix attribute polling in nodb mode #1220
- Fix edge case in event handling in nodb mode
- Fix Attribute::set_write_value when called with a std::string #1256
- Fix segfault when calling check_alarm [pytango#615](https://gitlab.com/tango-controls/pytango/-/issues/615)
- Fix order of shutting down threads #1278
- Fix change/archive event detection when transitioning to/from NaN #1207
- Fix Attribute::check_alarm() to always return true if attribute in ALARM/WARNIGN #1182
- Fix memory leak when pushing event from READ_WRITE attribute #1292
- Fix memory leak when using set_value with release=true and ATTR_INVALID #1265
- Fix linker warnings on Windows CI #1302
- Fix State evaluation can raise segfault when exception raised during attribute read #1311

## 10.0.0 - Source Code Comparison With Version 9.5.0

You can view the source code comparison with Tango 9.5.0, as well as the
commits and contributors on this page:
https://gitlab.com/tango-controls/cppTango/-/compare/9.5.0...10.0.0

## 10.0.0 - Milestone

All the issues and Merge Requests associated to the 10.0.0 milestone can be
found here: https://gitlab.com/tango-controls/cppTango/-/milestones/10.0.0

## 10.0.0 - Feedback

You can report issues on https://gitlab.com/tango-controls/cppTango/-/issues.
If you find a problem which you think could also affect Tango Controls packages
other than cppTango, e.g. cppTango and pyTango, or when you don't know where
you should create the issue at all - Well, you know now! - then head over to
https://gitlab.com/tango-controls/TangoTickets/-/issues.

## 10.0.0 - Contributions

Contributions are always welcome! Please do not hesitate to create new Merge
Requests in [cppTango Gitlab
repository](https://gitlab.com/tango-controls/cppTango). Please refer to
[CONTRIBUTING.md](https://gitlab.com/tango-controls/cppTango/-/blob/main/CONTRIBUTING.md)
to familiarise yourself with the easiest way to contribute to the cppTango
project.

## 10.0.0 - Acknowledgement

Many thanks to all the persons who contributed to this release, to the Tango
kernel team and to the Tango community for its ideas, feedback, bug reports and
tests.

# Tango C++ library 9.5.0 Release Notes

October 10th, 2023

Table of Contents
=================
  - [What's New (Since Version 9.4.2)?](#whats-new-since-version-942)
  - [9.5.0 - Bug Fixes](#950-bug-fixes)
  - [9.5.0 - Changes](#950-changes)
  - [9.5.0 - Source Code Comparison With Version 9.4.2](#950-source-code-comparison-with-version-942)
  - [9.5.0 - Milestone](#950-milestone)
  - [9.5.0 - Feedback](#950-feedback)
  - [9.5.0 - Contributions](#950-contributions)
  - [9.5.0 - Acknowledgement](#950-acknowledgement)

## What's New Since Version 9.4.2?

This cppTango release is a bug fix release. It contains improvements in several areas that are relevant to the users of cppTango. Please refer to [the selection of fixes](#950-bug-fixes) and [improvements and changes](#950-changes) where we highlight what was improved or modified.

## 9.5.0 - Bug fixes

- Fixes for double quoted strings and to support multiline strings with file DB. (#1162, #1163).
- Fix regression introduced in #1129 in the template type check. (#1137).
- Fix a regression introduced in #1010 that affects the mapping of Tango 7 to Tango 9.4 events. (#1135).
- Fix to support the maximum hostname length depending on the OS. (#1105).
- Fix for conditional compilation on macOS/BSD. (#1103).
- Forward port of fix for handling of invalid attribute. (#1088).
- Forward port: Case sensitivity for class attributes property. (#1087).
- Fix in mapping event type to string to support all event types. (#1065).
- Forward port fix for event reconnection after renaming device server instance. (#1063).
- Fix broken DevDouble and on macOS aarch64 by requiring omniORB >= 4.3.1. (#1056).
- Substitute TANGO_XXX_BASE flags with XXX_ROOT flags autogenerated by find_package in Cmake. (#1043).
- Update minimum cmake version to 3.18. (#975).
- Fix for wrong hostname information in blackbox in some situations. (#865).
- Fix handling of ORB pointers by using \_var objects. (#842).
- Fix for ownership handling of event data. (#684).
- Fix to not use case sensitive comparisons in MultiClassAttribute (#1087).

## 9.5.0 - Changes

- Forward port #927: Revise treatment of SIGTERM in Linux. (#1123).
- Document the release procedure. (#1117).
- Remove the unused and not implemented type DevInt. (#1108).
- Use standard file suffixes for source code files to placate editors `(hh -> h, .tpp -> _tmpl.h)`(#942).
- Add reconnect to command_inout_asynch. (#906).
- Move all files under /cppapi to /src to match conventional repository structures. (#964).
- Support also not exported devices in group. (#303).
- Update to CONTRIBUTING.md to reflect new merging procedure. We require now only one approval by a code owner instead of two. (#1104).

## 9.5.0 - Source Code Comparison With Version 9.4.2

You can view the source code comparison with Tango 9.4.2, as well as the commits and contributors on this page:
https://gitlab.com/tango-controls/cppTango/-/compare/9.4.2...9.5.0

## 9.5.0 - Milestone

All the issues and Merge Requests associated to the 9.5.0 milestone can be found here: https://gitlab.com/tango-controls/cppTango/-/milestones/10

## 9.5.0 - Feedback

You can report issues on https://gitlab.com/tango-controls/cppTango/-/issues.
If you find a problem which you think could also affect Tango Controls packages other than cppTango, e.g. cppTango and pyTango, or when you don't know where you should create the issue at all - Well, you know now! - then head over to https://gitlab.com/tango-controls/TangoTickets/-/issues.

## 9.5.0 - Contributions

Contributions are always welcome!
Please do not hesitate to create new Merge Requests in [cppTango Gitlab repository](https://gitlab.com/tango-controls/cppTango). Please refer to [CONTRIBUTING.md](https://gitlab.com/tango-controls/cppTango/-/blob/main/CONTRIBUTING.md) to familiarise yourself with the easiest way to contribute to the cppTango project.

## 9.5.0 - Acknowledgement

Many thanks to all the persons who contributed to this release, to the Tango kernel team and to the Tango community for its ideas, feedback, bug reports and tests.


# Tango C++ library 9.4.2 Release Notes

June 19th, 2023

Table of Contents
=================
  - [What's New (Since Version 9.4.1)?](#whats-new-since-version-941)
  - [9.4.2 - Bug Fixes](#942-bug-fixes)
  - [9.4.2 - Changes](#942-changes)
  - [9.4.2 - Source Code Comparison With Version 9.4.1](#942-source-code-comparison-with-version-941)
  - [9.4.2 - Milestone](#942-milestone)
  - [9.4.2 - Feedback](#942-feedback)
  - [9.4.2 - Contributions](#942-contributions)
  - [9.4.2 - Acknowledgement](#942-acknowledgement)

## What's New Since Version 9.4.1?

This cppTango release is a bug fix release outside of the normal six month release cycle.

## 9.4.2 - Bug fixes

- A regression introduced in cppTango 9.4.1 was preventing to specify an omniORB endpoint with an empty hostname. This bug is fixed in cppTango 9.4.2 (#1055).
- MacOS support has been improved (!1072, !1094, !1079, !1056)
- When using `Group::write_attribute`, a bug could prevent client/server connection if the server was started after the client (#906)
- After our change of merging strategy, we add to update the ABI-API Compliance Check CI job which was failing from time to time(#1104)
- A bug was fixed when the specified endpoint is an ip address (!1066, #1081)

## 9.4.2 - Changes

- The device server programmer can use the `DeviceImpl::get_client_ident` method to get some information on the current client calling him (!1028, #801).
- cppTango 9.4.2 supports supplying nearly all dependent libraries via PKG_CONFIG_PATH (!1042, #1042, #1044)
- Testing with debian 12 (bookworm) was added (!1110, #1130).
- CI is no longer using gitlab.com Gitlab runners but using runners provided by several institutes from the Tango-Controls collaboration (many thanks to them!) (#1110).
- Some changes were required at the CMake level for a better integration with the Tango Source Distribution (!1047).
- Thomas Ives and Damien Lacoste are now belonging to the Code Owners team in the hope to speed up the development process. Welcome! (#1098)
- The tests are now using a tag when cloning the tango-idl project (#1082)
- The LLVM CI Job is now using LLVM 16 (!1064).
- The CMake omniidl check has been improved and is no longer called when cross-compiling without an emulator (!1058).
- We only support a few versions of omniORB.  We now ensure that a supported version has been found at cmake configuration time. If an invalid version is found, we raise an error (!1039, #1021).
- The commit 0bcb356f introduced a std:: namespace in many places in documentation and comments where this was not intended.
These unexpected side effects are no longer present in cppTango 9.4.2 (!1037, #1026)
- The documentation about cross-compiling has been improved (!1049).

## 9.4.2 - Source Code Comparison With Version 9.4.1

You can view the source code comparison with Tango 9.4.1, as well as the commits and contributors on this page:
https://gitlab.com/tango-controls/cppTango/-/compare/9.4.1...9.4.2

## 9.4.2 - Milestone

All the issues and Merge Requests associated to the 9.4.2 milestone can be found here: https://gitlab.com/tango-controls/cppTango/-/milestones/12

## 9.4.2 - Feedback

You can report issues on https://gitlab.com/tango-controls/cppTango/-/issues.
If you find a problem which you think could also affect Tango Controls packages other than cppTango, e.g. cppTango and pyTango, or when you don't know where you should create the issue at all - Well, you know now! - then head over to https://gitlab.com/tango-controls/TangoTickets/-/issues.

## 9.4.2 - Contributions

Contributions are always welcome!
Please do not hesitate to create new Merge Requests in [cppTango Gitlab repository](https://gitlab.com/tango-controls/cppTango). Please refer to [CONTRIBUTING.md](https://gitlab.com/tango-controls/cppTango/-/blob/main/CONTRIBUTING.md) to familiarise yourself with the easiest way to contribute to the cppTango project.

## 9.4.2 - Acknowledgement

Many thanks to all the persons who contributed to this release, to the Tango kernel team and to the Tango community for its ideas, feedback, bug reports and tests.

# Tango C++ library 9.4.1 Release Notes

February 2nd, 2023

Table of Contents
=================
  - [What's New (Since Version 9.3.5)?](#whats-new-since-version-935)
  - [9.4.0+ - Changes Which Might Have An Impact On Users](#940-changes-which-might-have-an-impact-on-users)
  - [9.4.0 - Bug Fixes](#940-bug-fixes)
  - [9.4.1 - Bug Fixes](#941-bug-fixes)
  - [9.4.1 - Changes](#941-changes)
  - [9.4.0+ - Source Code Comparison With Version 9.3.5](#940-source-code-comparison-with-version-935)
  - [9.4.1 - Source Code Comparison With Version 9.4.0](#941-source-code-comparison-with-version-940)
  - [9.4.1 - Feedback](#941-feedback)
  - [9.4.1 - Contributions](#941-contributions)
  - [9.4.1 - Acknowledgement](#941-acknowledgement)

## What's New Since Version 9.4.0?

This cppTango release is a bug fix release outside of the normal six month release cycle.

Finally it is possible to deploy DeviceServers in containerised and isolated environments and allow event subscriptions across these deployment islands. We laid the foundation for this already in 9.4.0 but a small bug prevented this feature from working (see below Fix ZMQ event port advertisement).

## What's New Since Version 9.3.5)?

### A fresh cppTango every six months!

We have introduced a [fixed release cycle for cppTango](#897). This means that we will release a new cppTango version every six months on April 2 and October 2 from now on. If severe bug fixes warrant an earlier release, we will issue bug fix releases in between.

We have also established a Milestone-based, i.e. release-oriented development process which you can follow on https://gitlab.com/tango-controls/cppTango/-/boards.

And how will this impact you? cppTango 9.4.0 came with an unavoidable amount of work if you want to upgrade. With a six month release cycle we believe that after the 9.4.0 release the differences between future cppTango releases will then only have a minimal impact on your system if you continue to upgrade. This will make it much easier for you to stay on top of the cppTango releases. The proof that new releases will usually only have a minimal impact is this 9.4.1 release.

### Binary incompatibility with cppTango <= 9.3

cppTango 9.4 is binary incompatible with any older version of cppTango, i.e. cppTango version <= 9.3. The source code underwent major refactoring to use modern [C++14 features](#c14-requirement). We also made a serious effort to make it easier to maintain in some areas. With the refactoring have also come a couple of source code incompatibilities. This will mostly affect users who want to use cppTango 9.4.x as a drop-in replacement for cppTango <= 9.3. A simple recompile of their C++ device servers will likely fail. Please read the section [9.4 - Changes Which Might Have An Impact On Users](#940---changes-which-might-have-an-impact-on-users) where we explain how to mitigate the immediate issues when upgrading from cppTango <= 9.3.

### No Changelog this time (again)

Further we will not provide a dedicated changelog file for this 9.4.1 release. There simply have been too many Merge Requests and Bug Fixes which since cppTango 9.3, this means 9.4.0 plus the ones for 9.4.1. We decided to save our time and not spend our limited manpower on individually listing all of them in a human readable form. Instead please refer to the Issues and Merge Requests on the cppTango repository. The [Milestone 9.4.1](https://gitlab.com/tango-controls/cppTango/-/milestones/8) will be a good starting point for your search.
We will assess the situation again for the next releases.

### server_init_hook

A new server_init_hook() has been added (in the same spirit as always_executed_hook() method) at device level. This new method is called once the device server admin device is exported.
This allows for instance for the different devices to subscribe to events at server startup on attributes from other devices of the same device server with stateless parameter set to false. The subscription should now work in this case since the admin device is exported when the server_init_hook() method is called.
(#498, !551, [TangoTickets#7](https://gitlab.com/tango-controls/TangoTickets/-/issues/7)).

### Tango Controls On MacOS

Since cppTango 9.4.0 it is possible to compile cppTango on MacOS! (#956, !978, #714, !725). See https://gitlab.com/tjuerges/build_tango for a set of build scripts for macOS (x86_64 and M1/M2 archs) for tango-idl, cppTango, TangoDatabase, TangoTest, UniversalTest, tango_admin and PyTango.

### CMake Improvements

### cppTango Dev Conda Packages

Development cppTango Conda Packages are now automatically created and uploaded by CI when there are new commits to the cppTango main branch (!875, !956, !938, !921]).
These packages are uploaded to the tango-controls channel with the dev label.
They can then be installed using:
`conda install -c conda-forge -c tango-controls/label/dev cpptango=9.4.0dev0`

### Warnings Fixes

Many compilation warnings have been fixed (#962, !984, ...).

### Code Refactoring And Cleanup

A big part of the code has been rewritten in order to remove some code duplication. For instance, MR !735 reduced the code size by about 5000 lines of code.

## 9.4.0+ - Changes Which Might Have An Impact On Users

### Binary Incompatibility With cppTango 9.3.x Versions

To fix some of the bugs, the cppTango developers had no choice but to break the binary compatibility. So this new version is no longer binary compatible with previous cppTango 9.3.x releases. As a consequence, the user code using cppTango will have to be recompiled to use this new version. The good news is some annoying bugs have been fixed. This was the price to pay to get them fixed.

### C++14 Requirement

To ease the maintenance of cppTango, it has been decided to allow the usage of C++11 and C++14 features in cppTango code.
As a consequence, you need to use a C++14 compatible C++ compiler to compile cppTango and your device servers using cppTango 9.4.0.
You have to use `-std=c++14` or `-std=gnu++14` (or above) option when compiling your device server.
If you are using CMake, you can add the following lines to your CMakeLists.txt:

```
if (NOT DEFINED CMAKE_CXX_STANDARD)
    set(CMAKE_CXX_STANDARD 14)  # or above
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
```

### "TANGO_" Prefix Added To CMake Options

All the cppTango specific CMake options are now prefixed with "TANGO_" (!895).
So if you got used to compile cppTango 9.3 using CMake options like `-DOMNI_BASE=/path/to/my/omniorb`, you will have to use `-DTANGO_OMNI_BASE=/path/to/my/omniorb` instead.

Please refer to [INSTALL.md file](INSTALL.md) to get the detailed list of available CMake variables with their default value and description.

### Removed `using namespace std;` Directive From tango.h

Since it is considered as a bad practice to put a `using namespace std;` directive in a header file, it has been decided to remove it from `tango.h` file. As a consequence, cppTango code had to be massively updated to add missing `std::` prefixes in all locations where it was required to compile successfully (#206, !528, !981).
Users who are used to the old way can just do
```
 #include <tango.h>
 using namespace std;
```
wherever `tango.h` is included.

Please note that the code generated by Pogo for the C++ device servers will have to be updated or regenerated too if it was generated with an old Pogo version ( < Pogo 9.8.0) because these previous Pogo versions were relying on the fact that `using namespace std;` was present in `tango.h` file.

### coutXXX Macros Renamed To TANGO_LOG_XX

There was a `cout` macro defined in cppTango code which was under some configurations redefining `cout` and redirecting it to the Tango logs. This was causing some compilation errors when using `std::cout` instead of `cout` in the cppTango code. To avoid this problem, the `cout` macro has been renamed `TANGO_LOG`.
`cout1` and `cout2` macros have been replaced with` TANGO_LOG_INFO` macro.
`cout3`, `cout4` and `cout5` macros have been replaced with `TANGO_LOG_DEBUG` macro.
As a consequence, the device servers POGO generated codes, which were using some of these macros will have to be regenerated with a recent POGO version >= 9.8.0 in order to use the new macros names.
More details in #891, !934 and [pogo#137](https://gitlab.com/tango-controls/pogo/-/issues/137). Pogo >= 9.8.0 will also generate some code to define these `TANGO_LOG` macros if an older version of cppTango is used, making the generated code still compatible with older cppTango versions.

### New Header Files Installation Paths And Default Include Path

To prevent including a wrong file by accident (#720), it has been decided to change the default include path in tango.pc file which is used by pkgconfig (!952).
The previous include path was `${prefix}/include/tango`. It is now set to `${prefix}/include` instead.
`tango.h` file is still installed under `${prefix}/include/tango`.
The consequence of this default include path change is that all files currently doing `#include <tango.h>` will have to be modified in order to use `#include <tango/tango.h>` instead.
Recent POGO versions (>= 9.8.0) are taking this change into account and are already generating code with `#include <tango/tango.h>`.
The header files have been reorganized in cppTango source code and are now located under cppapi/include/tango directory and its subdirectories. They are installed under `${prefix}/include/tango` subdirectories now.

### New Optional Dependency To libjpeg Or libjpeg-turbo

In order to ease the maintenance of the encode and decode jpeg methods provided in EncodedAttribute class, it has been decided to get rid of the custom code and to replace it with an optional dependency to libjpeg or libjpeg-turbo library, which are well known and well maintained jpeg libraries specialized in this domain.
If you know that you will never use the EncodedAttribute encode_jpeg_xx/decode_jpeg_xx methods, you can compile cppTango using `-DTANGO_USE_JPEG=OFF` during the cppTango CMake configure compilation step.
By default `TANGO_USE_JPEG` is ON and if your libjpeg or libjpeg-turbo dependency is not at a location easily found by pkg-config, you can use `-DTANGO_JPEG_BASE=/your/jpeg/install/path` CMake option to specify the directory where your libjpeg or libjpeg-turbo library is installed.

### TANGO_LONG_32 and TANGO_LONG_64 Defines Removed

While fixing an issue on Windows amd64 (#768, !792), it has been decided, after consultation of the Tango-Controls community, to refactor the cppTango code and to remove no longer needed TANGO_LONG_32 and TANGO_LONG_64 definitions from tango_const.h file.
If your code is relying on the presence of this definitions, you will have to adapt it. The only device server known to be using these definition was the Tango Database device server. The code of this device server has been updated (See [TangoDatabase!34](https://gitlab.com/tango-controls/TangoDatabase/-/merge_requests/34)).

### Input References Arguments Changed To Const References

The methods input reference arguments have been changed to equivalent const reference arguments when possible (#622, !886).
This is a change of the API which will hopefully ease the Tango developer work.
Thanks to this change, it is now possible to do:

```
ApiUtil.get_db_ind("hostname", 12345);
```

instead of

```
std::string tmp = "hostname";
ApiUtil.get_db_ind(tmp, 12345);
```

There might be some side effects compilation errors on your device servers.

### Default Logging Layout Changed

The default logging layout has been changed to contain human readable timestamps instead of timestamps since the Unix epoch (!845).

Before 9.4.0, the logs on the console looked like this by default:

```
1619681907 [140266166015744] DEBUG my/super/device The log message text
1619681907 [140266166015744] DEBUG my/super/device The log message text
1619681907 [140266157623040] my/super/device The log message text
```
Since 9.4.0 they look like this:
```
2021-05-04T23:04:41,544490+0200 DEBUG (MySuperDevice.cpp:412) my/super/device The log message text
2021-05-04T23:04:41,544872+0200 DEBUG (MySuperDevice.cpp:1627) my/super/device The log message text
2021-05-04T23:04:41,544987+0200 DEBUG (MySuperDevice.cpp:1632) my/super/device The log message text
```

The timestamps are now in a human readable format, the thread id ([140266166015744] and [140266157623040] in the first example) has been removed. The log message origin (file and line number) is now automatically added to the log (!742).

### Function Name And Line Number In Logs And Exceptions

As explained just above, !742 added file name and line number information in the logs displayed on the console.
This Merge Request also provided new macros to throw exceptions without having the need to specify the origin field of the exception.
To have exception origin field filled automatically, please use `TANGO_THROW_EXCEPTION(reason, desc)` macro (there is also `TANGO_RETHROW_EXCEPTION` and corresponding macros for `_API_EXCEPTION`).
When using the new `TANGO_THROW_EXCEPTION(reason, desc)` macro (there is also `TANGO_RETHROW_EXCEPTION` and corresponding macros for `_API_EXCEPTION`), the origin field is no longer required and is automatically deduced and filled with the name of the current method. The file name and line number is also automatically added in the exception origin field.
So don't hesitate to use these new macros to avoid the classical copy/paste errors where you end up with an misleading origin field in an exception pointing to a wrong method in the code.
Please be aware that your code will no longer be backwards compatible with cppTango 9.3.x versions if you use these new macros, though.

### End Of Support For Notifd Events And Multicast Events

According to surveys with the tango-controls community, nobody seemed to use notifyd and ZMQ Multicast events. Therefore we have removed support for notifd events and ZMQ Multicast events in cppTango 9.4.0.  Only ZMQ Events are supported from cppTango 9.4.0 on.

### Removed `Tango_isnan` helper function

As it was simply pointing towards `std::isnan` we now recommend to use the later directly.

## 9.4.0 - Bug Fixes

Many bugs have been fixed in this new version. please refer to the Issues and Merge Requests on the cppTango repository. [Milestone 9.4.0](https://gitlab.com/tango-controls/cppTango/-/milestones/7) is listing some of the many issues which have been fixed in this version.

## 9.4.1 - Bug fixes

- Fix ZMQ event port advertisement (#915, !1035)

- Fix problems with adding/removing dynamic attributes in version 9.4 (#1022, !1031)

- Improve DeviceAttribute::get_type() behaviour (#1010, #1002, !1030). When reading an empty spectrum, clients are now able to get the expected type with DeviceAttribute::get_type(). DATA_TYPE_UNKNOWN is returned when an attribute reading is throwing an exception.

- Fix tango.pc.cmake to take into account jpeg dependency (#1016, !1024)

- tests: Fix using invalid cmake variable COMMON_TEST_CXX_DEFS (!1038)

- Fix api-abi-compliance CI job (#1045, #1040, !1041)

## 9.4.1 - Changes

- ci: Raise gcc/llvm latest compiler versions to gcc 12.2.0 and LLVM 15 (!1033)

- tango.pc: Remove spaces in variable definitions (#1024, !1032)

## 9.4.0+ - Source Code Comparison With Version 9.3.5

You can view the source code comparison with Tango 9.3.5, as well as the commits and contributors on this page:
https://gitlab.com/tango-controls/cppTango/-/compare/9.3.5...9.4.1

Sadly, at the time of writing these release notes, Gitlab imposes a limitation which prevents from displaying more than 100 commits at a time. We hope that this limit will be removed in the future.

## 9.4.1 - Source Code Comparison With Version 9.4.0

You can view the source code comparison with Tango 9.4.0, as well as the commits and contributors on this page:
https://gitlab.com/tango-controls/cppTango/-/compare/9.4.0...9.4.1

## 9.4.1 - Feedback

You can report issues on https://gitlab.com/tango-controls/cppTango/-/issues. If you find a problem which you think could also affect Tango Controls packages other than cppTango, e.g. cppTango and pyTango, or when you don't know where you should create the issue at all - Well, you know now! - then head over to https://gitlab.com/tango-controls/TangoTickets/-/issues.

## 9.4.1 - Contributions

Contributions are always welcome!
Please do not hesitate to create new Merge Requests in [cppTango Gitlab repository](https://gitlab.com/tango-controls/cppTango). Please refer to [CONTRIBUTING.md](https://gitlab.com/tango-controls/cppTango/-/blob/main/CONTRIBUTING.md) to familiarise yourself with the easiest way to contribute to the cppTango project.

## 9.4.1 - Acknowledgement

Many thanks to all the persons who contributed to this release, to the Tango kernel team and to the Tango community for its ideas, feedback, bug reports and tests.
