Carbonite Changelog
All customer facing changes to Carbonite are documented in this file.
The format is roughly based on Keep a Changelog. Read this file for inspiration and remain consistent with the style that is used here.
Carbonite has an official release cadence. At the beginning of every two-week sprint we increment the hundred-based version number. When we need to patch an existing release, we use the fractional (starting at 1) for each patch release. When adding entries to this log, add them under the top most version section in this file. You should never have to change the version number - that is done by the release managers of Carbonite.
Style guide:
- iAmCode
- /i/am/a/filename.txt 
- ‘/settings/registry/path’ 
167.3
Changed
- OVCC-1529 / OM-122864: Update FLAC to version 1.4.3 
167.2
Fixed
- OM-124268: Acquiring builtin plugins (such as - carb::logging::ILogging) will no longer warn if the plugin was not listed as a dependency.
167.1
Changed
- OM-122864: update freetype to version 2.13.2 
- OVCC-1525: carb.crashreporter-breakpad.plugin: added default settings for - /crashreporter/url,- /crashreporter/product, and- /crashreporter/versionso that crash reports can always be uploaded even in apps that have not been fully configured.
Fixed
- OM-123447: add module docstring for carb.settings, carb.tokens, omni.kit.app, omni.ext 
167.0
Added
- OVCC-1472: Added - CARB_PLUGIN_INTERFACE_EXwhich allows interfaces to have a default version that is distinct from the latest version. This allows modules to opt-in to interface changes rather than always getting the latest.
- OMPE-1332: omni.ext: apply ext dict filters for remote extensions and include them when publishing. 
- OVCC-1504: carb.audio-forge.plugin: added a - playFilePausedcommand to the- example.audio.playbackapp. This plays a sound on a voice that is initially paused. It is unpaused after a few seconds then plays to completion. The- --inputoption is used to provide the path to the sound to play. The- --interactiveoption is optionally used to print the play cursor position during playback. Various other common options such as- --format,- --frame-rate,- --decoded,- --memory-stream,- --disk-stream, etc will also affect the behavior of this new command.
- OVCC-1524: carb.crashreporter-breakpad.plugin: added a new volatile metadata type that allows a file blob in memory to be written to file. The crash reporter will then include the written file in the crash report. This is useful as a way of including arbitrarily large metadata values in the crash report as files instead of directly as metadata values. Each metadata value itself has a limit of 32KB on the OmniCrashes side. This provides a way to work around this limit. Currently OmniCrashes will discard any metadata values that are beyond this size limit. 
- OM-123294: omni.structuredlog.plugin: added a setting that can be used to enable ‘anonymous data’ mode. This forces all user and login information to be cleared out and all consent levels approved. This modified information will also be picked up by external systems that interact with or use these settings. This includes passing the user and consent information along to the telemetry transmitter. 
- OM-123459: omni.structuredlog.plugin: added the - omni::structuredlog::IStructuredLogControl2interface. This new interface contains the- emitProcessLifetimeExitEvent()function to force the process lifetime exit event to be emitted early and with a custom reason. This is only intended to be used at process shutdown time.
Changed
- OM-122864: Upgrade python dependencies to fix security issues. 
- OM-117408: omni.ext: print/log registry sync status. 
- OVCC-1523: framework: Made assertion failures also log to all of the currently configured standard logger destinations. This includes the main log file, standard streams, and the debug console (on Windows at least). These messages will only be explicitly written by the - IAssertinterface to the standard streams and debug console destinations if the standard logger has not already written to those destinations as well.
Fixed
- OVCC-1504: carb.audio-forge.plugin: fixed a bug in - carb.audiothat caused voices that were started in a paused state to potentially accumulate position information from previous voices. This was only an issue if the previous voice did not play to completion of its sound and following uses of the same bus were started in a paused state.
- OM-123140: omni.ext: fix kit sdk extensions exclusion when generating version lock. 
166.0
Added
- OVCC-1506: carb.tasking.plugin: Added - /carb.tasking.plugin/suppressTaskExceptionsetting for debugging task exceptions.
- OVCC-1509: carb.tasking.plugin: Added - /carb.tasking.plugin/debugAlwaysContextSwitchsetting which is a debug/test mode that will greatly increase the number of context switches to shake out issues.
Changed
- OM-121332: omni.kit.app.plugin: /app/fastShutdown defaults to true 
- OVCC-1503: Increased buffer given to - omniGetModuleExportsfrom 1k to 4k.
- OVCC-1512: - carb::cpp::bit_castwill be- constexprif the compiler supports it, even prior to C++20.
- OVCC-1512: The bit operations library (carb/Bit.h) will fall back to C++20 definitions (i.e. from - ) if C++20 is available. 
- OM-116009: flush prints to - stdoutafter loading the extensions.
Fixed
- OVCC-1510: carb.input.plugin: Fixed a regression with hashability of device types. 
- OVCC-1511: Fixed compilation issues when built with TSAN ( - -fsanitize=thread) on newer versions of GCC.
- OVCC-1512: Fixed compilation issues when building with older versions of MSVC 2017. 
- OM-122114: Updated omni.bind testing dependencies. 
- OVCC-1494: Linux: Logging to an ANSI console now issues an explicit reset to fix issues with text coloring. 
165.0
Added
- OM-120782: omni.ext: add deprecation warning param for extensions 
- OM-120782: omni.ext: make deprecation warning a developer-only warning 
- OVCC-1428: Carbonite now packages tools/premake-deps.lua–a library of Premake functions to build with various Carbonite dependencies. 
Changed
- OM-120985: updated to zlib 1.3.1 
- OM-120985: omni.telemetry.transmitter: updated to zlib 1.3.1 and libcurl v8.6.0 to get a fix for CVE-2024-0853 
Fixed
- OM-120831: Fix CARB_PROFILE_FRAME crash on Kit shutdown (emitting event after Tracy shutdown) 
- OVCC-1502: Carbonite headers should now compile under C++20. 
- OVCC-1500: carb.tasking.plugin: Fixed a rare race that could manifest when very short tasks return a value via a - Future.
- OM-120313: carb.crashreporter-breakpad.plugin: launched the user story GUI child process with its working directory set to the location that the parent (ie: crashing) process loaded its own carb.dll/libcarb.so library from. This allows the child process to find the carb module on startup since it is a static dependency of the tool. 
- OMPRW-707: cache more acquire interface calls for omni.kit.app and omni.ext 
- OM-120581: carb.crashreporter-breakpad.plugin: added some thread safety fixes around accessing the metadata and file tables in the crash reporter and improved some logging output around the crash report upload. 
- OVCC-1499: carb.input Python bindings: Fixed an issue with - get_modifier_flagsand- get_global_modifier_flagsthat would not properly distinguish between empty arrays and- None. Also added several functions that were available in the- carb::input::IInputAPI but not available in the Python bindings.
- OVCC-1493: omni.app.plugin: - /app/fastShutdownwill no longer hijack the exit code.
- OM-120581: Build: took initial steps to get Carbonite building with the GCC 11 toolchain. - fixed an issue in - omni.bindthat hardcoded the paths to the include folders for GCC 7.
- fixed some new warning that have shown up with GCC 11. 
- fixed a change in the - cpuid.hheader under GCC 11’s headers that added a- __cpuidex()function. This conflicted with a version that was explicitly implemented in- omni.platforminfo.plugin.
- fixed some deprecations in GCC 11’s libraries. - called - __gcov_dump()instead of- __gcov_flush()since the latter has been both deprecated and removed in GCC 11.
- added passthrough replacements for the - __*_finite()math functions since they were removed in a more recent GCC/glibc. This could also be fixed later by rebuilding- forgeaudiounder a newer GCC version as well.
 
 
164.0
Added
- OVCC-1488: Added - carb::this_thread::spinTryWaitWithBackoff(), similar to- spinWaitWithBackoff()but will give up in high contention cases, informing the caller that waiting in the kernel is likely a good idea.
- OVCC-1492: carb.scripting-python.plugin and Python bindings: Added support for Python 3.11. 
Changed
- OM-119706: omni.telemetry.transmitter: improved some logging in the telemetry transmitter. 
- OM-119706: omni.telemetry.transmitter: changed the default transmission limits for each event processing protocol to match the limits for each default endpoint. 
- OVCC-1441: framework: changed the - carb::StartupFrameworkDescstruct to include a- carb::PluginLoadingDescmember. This allows apps to programmatically control which plugins are loaded during framework init instead of having to specify it either on the command line or in the ‘/PluginsToLoad’ setting in a config file for the app.
- OVCC-1492: pybind11 for Python 3.8+ has been upgraded to 2.11. Debug builds will throw exceptions in cases where the GIL is not held when it should be. 
Fixed
- OVCC-1491: Linux: Improved - carb::this_thread::getId()performance by about 97% in most cases.
- OVCC-1488: aarch64: Fixed a potential rare hang that could occur in the futex system, affecting all synchronization primitives. As a result of the fix, aarch64 futex operations are much faster, with a contended test executing nearly 90% faster. 
- OVCC-1488: Linux: Improved - carb::thread::mutexand- carb::thread::recursive_mutexsubstantially by fixing a performance regression: in the contended case they are ~98% faster executing in a mere 2% of the previous time. In contended tests they are about ~54% faster than- std::mutexand- std::recursive_mutex, respectively.
- OM-119240: omni.ext: Fix non-deterministic import order when using fast_importer 
- OVCC-1473: Windows: Console applications will no longer hang or crash when CTRL+C is pressed to end the application. Note: Applications that desire different CTRL+C behavior should install their own handler after initializing the Carbonite framework. 
- OVCC-1478: carb.tasking with omni.job: Fixed a rare hang that could occur when calling - ITasking::reloadFiberEvents().
- OM-119706: omni.telemetry.transmitter: reworked the transmitter’s retry policy for failed endpoints. A failed transmission will now be retried a configurable number of times before removing the endpoint for the session. This fixes a potential situation where the transmitter could effectively hang under certain configurations. 
- OM-87381: Fixed issues where carb.crashreporter-breakpad would crash inside the crash handler when - NtCreateThreadExwas used to inject a thread to crash the process.
163.0
Added
- OVCC-1480: kit-kernel: added the - OMNI_ENABLE_CRASHREPORTER_ON_FAST_SHUTDOWNenvironment variable to allow the crash reporter to remain enabled during a fast shutdown in Kit. Set this environment variable to- 1to keep the crash reporter enabled. Set to any other value to use the default behavior of disabling the crash reporter during a fast shutdown. If the environment variable is not present, the default behavior is to leave the crash reporter enabled when running under TeamCity or GitLab, and to disable it on fast shutdown otherwise.
- OVCC-1295: Added documentation for - carb::tokens::ITokensand Python bindings.
Changed
- OM-111557: Reworked Python exceptions handling to call - sys.excepthookinstead of just logging
- OVCC-1481: carb.tasking: Implemented an optimization that can execute tasks within a - TaskGroupor- Counterwhen waiting on the- TaskGroupor- Counter, which allows tasks to resolve quicker. Improves performance of the ‘skynet:TaskGroup’ test by about 28% on Windows and makes it runnable on Linux.
Fixed
- OVCC-1474: Fixed a rare crash that could occur in carb.tasking. 
- OVCC-1475: Fixed a hang in carb.crashreporter-breakpad if a crash occurred in the logging system. 
- OVCC-1476: Linux: Reduced calls to - getenv()as it cannot be called safely if any other thread may also be performing any change to the environment due to deficiencies in GLIBC.
- OVCC-1474: Fixed a rare crash that could occur in carb.tasking in certain - applyRangesubtasks.
- OVCC-1478: Fixed a rare crash that could occur in carb.tasking if the main thread calls - executeMainTasksand happens to context switch while another thread is calling- reloadFiberEvents.
- OVCC-1486 / OM-118579: carb.profiler: - g_carbProfileris now atomic and many of the macros in include/carb/profiler/Profile.h were cleaned up to prevent cases where the variable could be set to- nullptrbetween testing and calling.
162.0
Added
- OVCC-1434: Added - carb::tasking::Delegate<>, which is the same as- carb::delegate::Delegate<>, but is tasking-aware.
- OVCC-411: Added - omni::vector<>, an ABI-safe implementation of- std::vector<>. This class adheres to the C++ standard vector excepting that- Allocatoris not a template parameter;- omni::vector<>always uses- carb::Allocator<>, which uses Carbonite’s- carb::allocateand- carb::deallocatefunctions (and require carb.dll or libcarb.so).
- OVCC-1467: omni.telemetry.transmitter: output the transmitter version and log file location(s) to its log during startup. 
Changed
- OM-117489: omni.ext.plugin: target.kit now takes kit patch part of the version into account too. 
- OVCC-1352: carb.tasking has received various performance improvements: - applyRange/- parallelForare significantly faster; the skynet test runs 21x faster on Windows and 7x faster on Linux due to algorithmic changes. The new algorithm is better able to sense system overload and adapt.
- Waking threads has been found to take about 10 µs (microseconds) on Linux and 50 µs on Windows, which is very slow. The changes try to lessen the impact of waking threads by preferring deferred wake (chain reaction) and keeping threads active while the system has work available. 
- Algorithms and task queues have changed to utilize multiple lanes to reduce contention. 
- Pinning, while still not recommended, is much more efficient and will no longer log warnings. 
 
- omni.kit.app, omni.ext: Replace most std map/set containers with carb RH version. 
- OVCC-1054: carb.tokens: Warning/error logs will now include the entire token stack with the issue. Token names and values longer than 256 characters will be truncated. 
- OVCC-1440: Windows: The omni.kit.app / kit.exe CTRL+C behavior now matches Linux: a quit is posted to the app and it will shutdown gracefully on the next frame. 
- OVCC-1470: - carb::container::LocklessStackuses a common algorithm between Windows and Linux and is once again lock- free on Linux. All operations on Linux are now ~99% faster in the uncontended case and ~95% faster in the contended case. Windows operations are ~20% faster in the uncontended case and ~10% faster in the contended case.
- OVCC-1468: On Windows, Carbonite executables and libraries now implement Control Flow Guard excepting carb.tasking.plugin for performance concerns. 
- OM-118678: omni.telemetry.transmitter: updated to libcurl v8.5.0 to get a fix for CVE-2023-46218. 
Fixed
- OVCC-1235: Linux/GCC: Warnings in public includes from - -Wconversionand- -Wno-float-conversionhave been fixed.
- OVCC-1352: Fixed issues with - CARB_PROFILE_BEGINand- CARB_PROFILE_ENDnot respecting profiler channels properly.
- OVCC-1464/OVCC-1420: Further fix to a deadlock that could occur if Python bindings are loaded simultaneously with Carbonite plugins in separate threads. This resolves on old versions of GLIBC that have problems with internal locking and are in use on CentOS7 (i.e. GLIBC 2.17). 
- OM-108121: Fixed test for keyboard-modifier-down transitioning after up. 
- OM-118059: omni.telemetry.transmitter: fixed a bug that prevented the transmitter from automatically pulling down the latest schema ID for use on the non-OVE open endpoint. 
- OVCC-1069: Fixed carb.dictionary python bindings does not handle bool correctly. 
- OVCC-1450: Improved tracy profiler backtracing performance and fixed symbol resolution for dynamically loaded shared libraries on linux. 
- OVCC-1469: Fixed a race condition that could lead to a hang when carb.tasking was used with omni.job as the underlying thread pool. 
161.0
Added
- OVCC-1431: For Linux x86-64, Carbonite now publishes - carb_sdk+tsanand- carb_sdk+plugins+tsanpackages that have Thread Sanitizer enabled (- -fsanitize=thread), allowing those modules to report to Thread Sanitizer. Suppressions are located in the include/tsan-suppressions.txt file.
Changed
- OM-114023: omni.kit.app: Rework - --vulkan, add- app/vulkansetting to control Vulkan
Fixed
- OVCC-1164: Fixed ScratchBuffer move and copy constructors to correctly initialize data. 
- OVCC-1444: omni.ext.plugin: fix ext linking bug when using non-English OS language on Windows 
- OVCC-1420: Fixed a deadlock that could occur if Python bindings are loaded simultaneously with Carbonite plugins in separate threads. 
- OVCC-1427: Log consumers and Loggers will no longer be called recursively. If a Logger does something that would recursively log, other Loggers will still receive the log message but the offending Logger will be ignored. 
- OVCC-1427: Logs that occur on a thread with either the Framework or PluginManager (OVCC-948) mutexes locked are now deferred until both of these mutexes are unlocked to prevent unsafe recursive calling into the Framework. 
160.0
Added
- OM-113541: Linux: omni.kit.app.gcov.plugin was added and kit-gcov uses this to ensure that the fast shutdown code path also calls - __gcov_flush.
- OVCC-1438: Added - runningInContainercrash metadata, indicating if the process is running inside a container.
- OVCC-1438: Added - runningInContainercrash metadata, indicating if the process is running inside a container
- OVCC-1263: omni.kit.app.plugin: added the - OMNI_TRACK_SETTINGSenvironment variable to allow all changes to a given list of settings to be reported as warning messages. If a debugger is attached, a sofware breakpoint will also be triggered for each change to the tracked setting. Multiple settings may be monitored by separating their paths with a comma (‘,’), pipe (‘|’), colon (‘:’), or semicolon (‘;’),
Fixed
- OVCC-1432: carb.dictionary.plugin: Added a missing mutex in subscribeToNodeChangeEventsImpl that otherwise led to data corruption 
- OVCC-1397: carb.input.plugin: Fixed an issue from 159.0 that caused action mapping hooks to not work properly. 
- OM-115009: Fixed carbReallocate not freeing memory when using mimalloc. 
- OVCC-1436: Fixed missing quotes for Windows in omni.structuredlog.lua. 
- OVCC-1442: carb.crashreporter-breakpad.plugin: prevented upload retry attempts for crash reports that previously failed with most 4xx HTTP status codes. These crash report files will remain on disk locally but will never attempt to be uploaded again. The user can attempt to modify the crash report’s metadata manually to allow it to be tried again, or they can delete the report. 
- OVCC-1442: carb.crashreporter-breakpad.plugin: fixed an issue that could cause the crash reporter to become disabled if its interface was acquired early on Kit startup but the settings registry wasn’t present yet. 
159.0
Added
- OVCC-1209: omni.platforminfo.plugin: added a function to - omni::platforminfo::IOsInfo2to retrieve a machine ID that can be used as an anonymous user ID in telemetry.
- OVCC-1209: set the structured logging user ID to an anonymous machine ID if - /structuredLog/anonymousUserIdModeis set to “machine”.
- OMFP-3389: kit-kernel: scanned the command line on startup for extension and integration test commands. When found, kit puts omni.structuredlog.plugin into ‘test’ mode automatically so that structured log events generated during test runs do not interfere with production telemetry analysis. 
- OVCC-1415: carb.crashreporter-breakpad.plugin: added a check for the - CARB_DISABLE_ABORT_HANDLERenvironment variable before installing the SIGABRT handler on Windows for plugins and executables that are statically linked to the Windows CRT. If this environment variable is set to “1”, the SIGABRT handler will not be installed. If it is undefined or set to any other value, the SIGABRT handler will be installed by default. This is a temporary workaround to allow the Nsight debugger to still work with newer Omniverse apps that include this Carbonite functionality.
- OVCC-1422: carb.crashreporter-breakpad.plugin: added a check for the - OMNI_CRASHREPORTER_CRASHREPORTBASEURLenvironment variable to override the ‘/crashreporter/crashReportBaseUrl’ setting.
- OVCC-1286: Fix a bug where omni.structuredlog would generate a pure python module with invalid - send_event()functions when the event properties had characters other than- [a-zA-Z_].
- OM-113393: [omni.ext.plugin] package yanking support 
- OVCC-1414: Added additional Python binding documentation. 
- OVCC-1411: The environment variable - CARB_USE_SYSTEM_ALLOC, if defined and set to a value other than- 0at the time of the first request, will cause- carb::allocate,- carb::deallocateand- carb::reallocateto use the system default heap instead of using Mimalloc.
- OVCC-1418: carb.crashreproter-breakpad.plugin: added the - /crashreporter/metadataToEmitsetting. This is expected to be an array of regular expression strings that identify the names of crash metadata values that should also be emitted as telemetry events any time they are modified. A single event will be emitted when any metadata value is added or modified. If the metadata is set again to its current value, no event will be emitted.
- OM-114420: omni.ext.plugin: add support for filter:setting to be able to change extension dependencies based on setting 
- OM-113920: omni.ext.plugin: updated packman link code to sync closely with changes in packman 7.10.1 which fixes issues creating symbolic links / junctions. 
- OM-114145: omni.ext.plugin add support for different version ranges (~, >, <, =, ^ operators) 
- OVCC-1358: Try to allow structuredlog.sh/structuredlog.bat to find packman from the CWD. 
- OVCC-1358: Add - repo structuredlogto launch structuredlog from repo tools. This avoids issues around having structuredlog find packman and other resources.
Changed
- OVCC-1204: POSSIBLY BREAKING CHANGE Now that Packman 7.10 can support aliases through the - <filter ... as="" />tag, the previous change for CC-1204 has been undone and Carbonite’s target-deps.packman.xml chain no longer includes a- pythondependency. All Python dependencies are now tagged with their version, such as- python-3.10.
- OVCC-1368: - Framework::releaseInterfacewill now allow plugins to unload that are only referenced by themselves.
- OVCC-1397: carb.input.plugin has been made thread-safe. The - IInputinterface and associated- carb::inputnamespace have also been documented.
Fixed
- OVCC-1407: Python: Fixed an issue where creating a carb.dictionary with an empty value (i.e. - { "payload": {} }) would produce an empty dictionary (without the- "payload").
- OMFP-3353: omni.ext.plugin: Fix core.reloadable=False not propagating correctly to all dependencies 
- OVCC-1368: - carb::getCachedInterfacewill work properly if a plugin restarts even if a module fails to unload.
- OMFP-3389: kit-kernel: fixed the ‘normal’ shutdown path for kit so that it properly shuts down omni.structuredlog.plugin. Previously this path was force unloading the plugin without notifying it of the unload. 
- OM-113843: carb.crashreporter-breakpad.plugin: fixed an issue with the recent crash reporter changes that caused the Nsight system profiler to stop working with Carbonite based apps on Windows. The issue was tracked down to the new SIGABRT handler using a - thread_localglobal variable.
- OVCC-1423: omni.bind now correctly produces a Python binding to - __init__()that allows for casting between interfaces.
- OVCC-1416: fix temp folder not being removed on fast shutdown 
- OVCC-1380: Linux: Fixes a crash that can occur when carb.crashreporter-breakpad.plugin is shut down when running on older versions of GLIBC, such as on CentOS-7. 
- OVCC-1371: include/carb/thread/RecursiveSharedMutex.h: Fix compilation error if - CARB_ASSERT_ENABLEDwas forced on.
158.0
Added
- OVCC-1254: carb.settings.plugin: Added - carb::settings::ScopedWriteand- carb::settings::ScopedReadRAII lock classes.
- OVCC-1408: Added include/carb/time/Util.h which has platform-independent versions of time utility functions - asctime_r(),- ctime_r(),- gmtime_r()and- localtime_r().
- OMFP-901: Linux: kit-gcov was added. This is a kit binary that is compiled with gcov support and calls - __gcov_flush()before exiting. This can be used for downstream projects that want to collect code coverage information.
Changed
Fixed
- OMFP-2683: Upgrade Python packages to fix BDSA-2022-3544 (CVE-2022-46908) 
- OVCC-1406: Fixed the handling of assertion failures so they can now generate a crash report if not ignored by the user (in debug builds on Windows). This allows the process lifetime ‘crash’ structured logging event to still be emitted in cases of an assertion failure. 
- OVCC-1254: carb.settings.plugin: Documented - ISettingsand fixed some thread safety issues.
- OVCC-1408: Linux: locations that were using non-thread-safe - gmtime()and- localtime()have been changed to use- gmtime_r()and- localtime_r()respectively. The biggest issue was logging timestamps, but it also affected carb.crashreporter-breakpad.plugin timestamps and carb.profiler-cpu.plugin file names.
- OVCC-1410: carb.tasking.plugin: Fixed a very rare case where - ITasking::addSubTaskwould never return.
- OVCC-1399: Windows: Fixed an issue where - _exit()was attempting to shutdown the Carbonite Framework even though atexit callbacks were not run. NOTE: This solution requires Carbonite executables to either dynamically link the CRT, or to start the framework from the executable with either- carb::acquireFrameworkAndRegisterBuiltins(),- OMNI_CORE_START()or- OMNI_CORE_INIT().
157.0
Added
- carb.profiler-tracy.plugin: - Added tracy profiler plugin option - /plugins/carb.profiler-tracy.plugin/memoryTraceStackCaptureDepthto capture callstacks on memory event operations in order to benefit from tracy views where it uses callstack info for grouping [defaults to 0].
- Added tracy profiler plugin option - /plugins/carb.profiler-tracy.plugin/instantEventsAsMessagesto inject “instant” events via tracy profiler messages instead of the current “fake zones” [defaults to false].
- Added tracy profiler plugin option - /plugins/carb.profiler-tracy.plugin/skipEventsOnShutdownto skip injecting profile events after tracy plugin shutdown has been requested [default to false].
 
Changed
Fixed
- OVCC-1392: Logging performance with - /log/asyncon has been greatly improved.
- OVCC-1393: Fixed an issue where - /log/asyncon at shutdown could cause the last few log messages to be skipped.
- OMFP-2562: omni.telemetry.transmitter: updated to - libcurlversion 8.4.0 and- opensslversion 3.0.11 to address CVE-2023-38545.
- OMFP-1262: Fix for passing nullptr as text when setting clipboard crashes on Linux. 
- OM-112381: omni.ext.plugin: Fix exact=true to match exactly one version 
- OMFP-2353 / OMFP-2356: omni.kit.app: (Linux only) Fixed a crash that could occur sometimes when - SIGTERMor- SIGINT(CTRL+C) was received.
- OVCC-1315: Visual Studio: Fix compilation warning 4668 on include/carb/Defines.h. 
- OVCC-1371: include/carb/thread/SharedMutex.h: Fix compilation error if - CARB_ASSERT_ENABLEDwas forced on.
- OVCC-1398 / OMFP-2908: carb.crashreporter-breakpad.plugin: Heap usage and - fork()can cause hanging inside the crash handler. These have been eliminated in the crash handler.
156.0
Added
- OVCC-1372: Added a - carb::logging::StandardLogger2sub-interface that is accessible from- carb::logging::ILogging. This interface has functions that can be used to override the log level for the current thread only.
- OVCC-1372: Added - carb::logging::ScopedLevelThreadOverride, a RAII class that can be used to override the log level for a given- StandardLogger2while in scope.
- OVCC-1325: carb.events.plugin: - carb::IEventnow has- attachObject()and- retrieveObject()functions that can be used to attach descendants of- carb::IObjectto an event.
- OMFP-1450: omni.telemetry.transmitter: added support to the transmitter to pull down the latest Kratos schema IDs for use on open endpoints. The transmitter now attempts to download the latest schema IDs file from the same base URLs as the schemas packages are downloaded from. It then reads the appropriate schema ID for the current run environment and replaces the value of the given extra field automatically. This allows the transmitter to automatically add the extra field to each message that Kratos requires on open endpoints instead of requiring each kit session to manually add it. 
Changed
- OVCC-1369: carb.crashreporter-breakpad.plugin now has a companion tool called crashreport.gui. If shipped along with carb.crashreporter-breakpad.plugin, it will be invoked in the event of a crash for the user to provide a story of what they were doing when the crash occurred. 
- OVCC-1372: BREAKING CHANGE - carb::logging::StandardLoggeris deprecated;- carb::logging::StandardLogger2inherits all of its functionality as a pure virtual interface. The old- ILogging::getDefaultLogger(),- ILogging::createStandardLogger()and- ILogging::destroyStandardLogger()functions have gained an- Oldsuffix, breaking the API, but not the ABI. The new- ILogging::getDefaultLogger()and- ILogging::createStandardLogger()functions work with- StandardLogger2.- StandardLogger2is ref-counted and can be destroyed with- release().
- BREAKING CHANGE The - carb::logging::ScopedFilePauseclass has moved to carb/logging/LoggingUtils.h.
Fixed
- OVCC-1373: Code that uses carb/profile/Profile.h macros will now compile if profiling is disabled at compile time by setting - CARB_PROFILING=0.
- OVCC-1379: carb.crashreporter-breakpad.plugin: fixed the abort/termination handlers for all plugins that are statically linked to the Windows CRT. 
- OVCC-1381: carb.events.plugin: Fixed slow - IEventStreamand subscription creation times when a name is not provided. The generated name will be very simple unless- /plugins/carb.events.plugin/nameFromCallersetting key is- true, in which case symbol lookup will take place to determine a more descriptive generated name.
- OVCC-1367: omni.structuredlog.plugin: fixed how the early - privacy.tomlfields are loaded to avoid a bad user ID from being used. When the user ID value in the- privacy.tomlfile is present and points to a non-existent environment variable, this would previously incorrectly insert the full- $env{}tag as the user name. This fixes that behavior so that even the early loading of the file handles resolving environment variables too.
- OM-111167: fix an explicit python3.dll load from python 
- OMFP-1450: omni.bind: fixed a crash in the - omni.bindtool due to a diff of C++ code being passed to- f""while writing out an error message for a- --fail-on-writefailure.
- OMFP-1977: Fixed a performance regression on Windows with logging. 
- OVCC-1387: omni.structuredlog.plugin: fixed some bad early loading of consent settings in standalone mode. This does not effect Kit or Carbonite based uses of structured logging however since the consent settings are loaded again through - ISettingslater during startup.
155.0
Added
- OM-101243: carb.crashreporter-breakpad.plugin: added a helper tool called - hang.crasherfor Windows that is used to intentionally crash a Carbonite based app that has hung. This is intended to be used in CI/CD with unit test child processes that run beyond their expected timeout.
- OVCC-1363: Adds type hints for omni.bind python code 
- OVCC-1166: omni.bind’s input/output filenames now correctly resolve - %{cfg.buildcfg}and- %{config}in premake5.lua.
- OVCC-1364: omni.telemetry.transmitter: added support to the telemetry transmitter to add specific extra fields to each message instead of having to add them only at the time each message is produced. The ‘/telemetry/extraFieldsToAdd’ setting controls which extra fields from ‘/structuredLog/extraFields/’ will be added to each message. The ‘/telemetry/replaceExtraFields’ setting controls whether any existing extra fields will be replaced with the new values (true) or just be left as-is (false). 
- OMFP-583: omni.crashreporter-breakpad.plugin: added the crash report metadata file to compressed crash report files. 
- OM-108908: carb.windowing: Exposed monitor functions to python. 
- OM-108791: Added support for default values for arguments passed through ONI / omni.bind 
Changed
- OVCC-1375: cleaned up - omni.bind.util.Lazy; replaced with python’s- functools.cache
- OVCC-1377: Tweaked - CARB_HARDWARE_PAUSE()to be more correct on x86_64 with non-Microsoft compilers, and aarch64.
Fixed
- OVCC-1374: A built-in plugin that was released before the framework was shutdown could cause a crash during framework shutdown. 
- OVCC-1376: An assertion could happen in debug builds if - Framework::tryAcquireInterfaceFromLibraryor- Framework::loadPluginwas called prior to- IFileSystembeing instantiated. This would only happen in certain “lightweight” instantiations of the Carbonite framework as- OMNI_CORE_START()or- acquireFrameworkAndRegisterBuiltins()would not exhibit this problem.
- OM-109545: fix omni::ext::getExtensionPath not to crash when can’t find an extension 
154.0
Added
- OVATUEQI-35: Adds functionality to enable extra security checks when opening an archive based on the trust level of the registry from where the extension originates. By default, registries are trusted. 
- OM-101243: carb.crashreporter-breakpad.plugin: added a helper tool called - hang.crasherfor Windows that is used to intentionally crash a Carbonite based app that has hung. This is intended to be used in CI/CD with unit test child processes that run beyond their expected timeout.
- OVCC-1363: Adds type hints for omni.bind python code 
- OVCC-1166: omni.bind’s input/output filenames now correctly resolve - %{cfg.buildcfg}and- %{config}in premake5.lua.
- OM-108121: carb.input.plugin: API to query modifier state of input devices. 
Changed
- OM-108121: carb.input.plugin: Added ability to query number of keys pressed. 
- OVCC-1347: - carb::cpp::countl_one()and- carb::cpp::countr_one()have been implemented as C++14-compatible equivalents to- std::countl_one()and- std::countr_one()respectively.
- OVCC-1347: All non- - constexprfunctions in the carb/cpp/Bit.h library now have- constexprextensions with a- _constexprsuffix. Within the- carb::cppnamespace the new functions are:- popcount_constexpr,- countl_zero_constexpr,- countr_zero_constexpr,- countl_one_constexpr, and- countr_one_constexpr.
- OVCC-1347: Added - carb::UseCarbAllocatorAligned, which allows overriding- newand- deleteon a per-class basis while specifying an overriding alignment.
- OVCC-1340: Linux/Mac: Futex performance was further improved, especially contended wake-up situations where no waiters are present. 
- OVCC-1347: Added - carb::thread::AtomicBackoff, a helper class for providing a back-off in spin-wait loops.
- OVCC-1347: - carb::Allocator<>now has an optional- Alignparameter that is used as an alignment hint.
- OVCC-1347: Several minor performance improvements for carb.tasking.plugin: - The futex system has received the same improvements from OVCC-1340. 
- Spurious wake-ups of co-routines and threads that wait on tasking objects have been eliminated. 
- Allocations are cacheline-aligned to reduce false-sharing. 
- Linux: Thread IDs are now cached as the syscall to obtain them was very slow. 
- Linux: Handle slab allocations are now larger to reduce the total number of slow - mmapsyscalls.
 
Fixed
- OM-99583: bump python to 3.10.13+nv2 (CVE) 
153.0
Added
- OM-93636: added documentation on how to configure an app in a container to support telemetry. 
- OVCC-1344: Adds - IWeakObjectand- WeakPtr. Interfaces implementing- IWeakObjectwill support non-owning references.- WeakPtris similar in functionality to- std::weak_ptr. Implementations are encouraged to use- ImplementsWeakto add support for weak pointers in their implementations. Consumers of weak pointers must add the following to their premake5.lua projects to enable weak pointer support on OSX:- filter { "system:macosx" } linkoptions { "-Wl,-U,_omniWeakObjectGetOrCreateControlBlock" } linkoptions { "-Wl,-U,_omniWeakObjectControlBlockOp" } 
- OVCC-1350: string_view: Add std::string to carb::string_view implicit conversion 
Changed
- OVCC-1340: Linux/Mac: Futex performance was improved, which has a knock-on effect for all synchronization primitives. Four-byte futexes now use the ParkingLot as opposed going directly to the system futex, which saves ~97% on no-op cases. Waking 8 threads has improved about 55%, and the threads wake about 20% faster due to less contention. 
- OVCC-1340: - carb::thread::futex: the- wake,- wake_oneand- wake_allfunctions are deprecated in favor of respective replacement functions:- notify,- notify_oneand- notify_all. These new names better match the standard and are more distinct from “wait”.
- OVCC-1341: - carb::allocate,- carb::deallocateand- carb::reallocateare now based on Microsoft’s Mimalloc allocator for improved performance, especially in multi-threaded contentious environments. Most allocations in carb.tasking have switched to using these allocation functions for performance, as well as carb.dictionary.plugin and carb.events.plugin. On Windows, single-threaded alloc/dealloc is 54% faster; contended alloc/dealloc is 219% faster. On Linux (GLIBC 2.35), single-threaded alloc/dealloc is 23% faster; contended alloc/dealloc is 864% faster.
- OVCC-1348: Fixed a performance regression in Linux carb.profiler-cpu.plugin. 
- OVCC-1355: carb.crashreporter-breakpad.plugin: Python tracebacks are now reported with full filenames. 
Fixed
- OM-106256: fix supported targets check on registry 2.0 
- OM-100519: [omni.ext.plugin] fix crash on shutdown when extension was removed 
- OM-106907: fix not all ext summaries are included in registry v2 
152.0
Added
- OVCC-1284: omni.structuredlog.plugin: added an interface to allow extra fields to be added to each structured log message. Extra fields may be provided programmatically with the omni::structuredlog::IStructuredLogExtraFields interface or by adding a key/value pair to the ‘/structuredLog/extraFields/’ settings branch on framework startup. 
- OVCC-1323: carb.crashreporter-breakpad.plugin: improved some logging and metadata from the crash reporter. This includes: - printed an info message indicating that the crash reporter successfully started up. 
- printed info messages any time the crash reporter or upload setting is toggled. 
- renamed some existing CI metadata keys to be more clear what they are collecting. 
- added several more GitLab and TC specific metadata values. 
- added a metadata value that indicates whether TC or GitLab is being used to run the crashing job. 
- tried to collect the app name and version from multiple settings. 
- added a GMT timestamp indicating when the crash occurred. 
 
- OM-93636: omni.telemetry.transmitter: added a new message processing protocol (called ‘defaultWithList’) to the telemetry transmitter. This will batch up events in a JSON array and deliver them to the endpoint as a JSON batch object. 
- OVCC-1320: Added carb/time/TscClock.h, a CPU time-stamp counter sampling “clock” for super-high-performance profiling and timing purposes. 
- OVCC-1320: Added carb/cpp/Numeric.h with an implementation of - std::gcd:- carb::cpp::gcd.
- OVCC-1320: - HandleDatabasehas changed to using a- LocklessQueuefor free-list instead of- LocklessStackas this proved to perform better due to less contention, especially on Linux.
- OVCC-1343: Added - hashfield to- carb::datasource::ItemInfo
Changed
- OVCC-1316: unified the parsing of the command line options in kit-kernel so that parameters for other options are parsed consistently in all cases. All options now support providing their parameter either after an equals sign in the same command line argument or in the following argument. 
- OM-93335: omni.kit.app revert “python” token change to include python version in the path 
- OVCC-1324/OM-96947: The carb.tasking setting - debugTaskBacktraceis now off by default in release builds.
- OVCC-1320: Greatly improved carb.tasking handle allocation speeds. Created a Fibers-vs-Threads document with history and current performance times. The maximum number of fibers was increased to support the new “skynet” benchmark unit test. 
Fixed
- OVCC-1294: Fixed a performance issue with using omni.log from Python 
- OVCC-1313: Fixed a crash fix that could occur with - carb::settings::appendToStringArray()
- OVCC-1310: carb.crashreporter-breakpad.plugin: Fixed an issue where a deadlock could occur when a crash occurred. 
- OM-103625: omni.ext extensions packing does not preserve file symlinks on linux 
- OVCC-1318: carb.crashreporter-breakpad.plugin: Fixed an issue where a crash in multiple threads simultaneously would likely cause the process to exit without writing crash information. 
- OVCC-1298: Worked around issues with - carb::thread::recursive_shared_mutexwhen used with Link-Time Code Generation
- OM-100518: Load and Release hooks that are not unregistered when a module is unloaded will now log an error instead of causing a crash when called. Note that this is a workaround in attempt to diagnose libraries that are not unregistering Load and Release hooks. 
151.0
Added
- omni.ext.plugin: add support for the registry v2 with incremental index loading 
- OVCC-414: Adds - omni::expected<T, E>and- omni::unexpected<E>class templates, which are ABI-stable implementations of their- stdcounterparts. These monads are useful in representing potential error conditions when exceptions are not desired or not enabled. The API for these types is compatible with the- stdversion, with a few minor changes:- error_typefor both class templates is allowed to be- voidto match parity with other languages with result monads (e.g.: Rust allows- Result<T, ()>)
- The - omniimplementation is less- constexpr-friendly that the- stdimplementation, mainly due to requiring C++14 compatibility.
- Cases where the C++ Standard leaves things as implementation-defined will generally result in program termination (e.g.: calling - expected.error()when- expected.has_value()will hit an assertion).
 
- OVCC-1301, OVCC-1303, OVCC-1306: Created gdb pretty-printers for - carb::extras::HandleDatabase,- carb::RStringand several carb.tasking types. Additionally commands were created for- task list(lists all carb.tasking tasks),- task bt <task>(gives the current backtrace of a carb.tasking task), etc.
Changed
- OVCC-414: Changes the C++17 utility type backports (e.g.: - carb::cpp17::in_place_t) to alias their- stdcounterparts when C++17 is enabled instead of being distinct types. This has the potential to break APIs where there is an overload for both the- carband- stdversions, which can be fixed by deleting one of them. Keep the- carb::cpp17overload if you need support for pre-C++17; keep the- stdoverload if you only support C++17 and beyond.
- OVCC-1293: - omni.structuredlog: changed the- omni.structuredlogtool to include the event name in generated struct and enum names. This allows the same field name for an object to be used across multiple events within a schema.
- OVCC-1264: The - carb::cpp17and- carb::cpp20namespaces have been merged into- carb::cpp. Likewise, the carb/cpp17 and carb/cpp20 include directories have been merged into carb/cpp. For backwards compatibility, the previous carb/cpp17 and carb/cpp20 directories have files (marked as deprecated) that pull the- carb::cppsymbols into their respective namespaces (- carb::cpp17or- carb::cpp20).
- OVCC-1311: - carb::extras::HandleDatabase::makeScopedRef(the- constvariant) now returns a- ConstHandleRefwhich can only be used for const access to mapped items.
Fixed
- OVCC-1288: Carbonite uses a new - doctestpackage that fixes a build issue on glibc 2.34+ where- SIGSTKSZis not a constant.
- OVCC-1311: Fixed a compilation error in - carb::extras::HandleDatabase::makeScopedRef(the- constvariant).
- OVCC-1166: omni.bind’s include paths now correctly resolve - %{cfg.buildcfg}in premake5.lua.
150.0
Added
- OVCC-1281: Add - OMNI_ATTR("nodiscard")to omni.bind.
- OM-99352: omni.structuredlog.plugin: added the - /structuredLog/emitPayloadOnlysetting to allow the structured logging system to skip adding the CloudEvents wrapper to each event on output. This is useful for apps that want to use the structured logging system for a purpose other than telemetry and allows the schema for each event to be directly used for full validation of each event instead of just defining the layout of the “data” field.
- add - omni.ext.get_all_sys_pathsand- omni.ext.get_fast_importer_sys_pathsto get all sys paths and fast importer sys paths respectively.
- omni.ext.plugin: log when extensions are requested to be enabled or disabled. 
- OM-96953: omni.ext.plugin: the Kit-kernel extension manager now outputs structured log events any time an extension is loaded or shutdown. The extension’s name and ID are included in both events. On the extension startup event, the startup time in milliseconds is also included. 
Changed
- OM-97668: omni.ext.plugin: FS watcher will now ignore changes - extension.gen.tomlnot to reload extensions when installing by parallel kit instances.
- OVCC-1186: omni.bind: out-of-date messages are no longer considered warnings. 
- OM-99926: omni.ext.plugin: defaulted the - /app/extensions/fsWatcherEnabledsetting to- falsewhen running in a container. When running outside of a container this setting still defaults to- true.
- OVCC-1273: carb.crashreporter-breakpad.plugin: removed the missing metadata check before uploading a batch of old crash reports and instead checked for missing metadata for each individual crash report before uploading. container. When running outside of a container this setting still defaults to - true.
- OM-93335: Runtime-breaking change: renamed carb_scripting_project from “scripting-python-3.7m” to “scripting-python-3.7” Runtime python version is now determined by carb.scripting-python.plugin settings in kit-core.json python prebuild link is now named python-3.10, python-3.9, and python-3.7 
Fixed
- OVCC-1268: Plugin startup functions - carbOnPluginStartupand- carbOnPluginStartupExwill no longer assert on debug builds when called from within a carb.tasking task and the calling thread changes.
- OVCC-1265: carb.filesystem: Opening a directory as a file will now behave consistently across all systems. It will fail and the - ErrorApiwill report- kResultFail.
- OM-99795: omni.ext.plugin: fix if set_extension_enabled_immediate is called from python and parallelPullEnabled is enabled - app hangs. 
- OVCC-1285: carb.crashreporter-breakpad.plugin changes: - The python traceback file is now named - $crashid.py.txtby default.
- Metadata is written out before gathering volatile metadata in case of a double-fault. 
- Attempts to upload previous crashes will now include all available files (such as python traceback files). 
- Failing to load metadata will produce - MetadataLoadFailedmetadata for the upload.
 
- OVCC-1291: carb.tasking.plugin: Fixed a rare edge-case crash that was introduced by OVCC-1268. 
149.0
Added
- OM-93952: omni.kit.app: (Linux only) support for /app/preload, a key which can be used to relaunch with LD_PRELOAD prefixed with the value of this key. 
- OVCC-1258: - omni::string_viewis available as an alias for- carb::cpp17::string_view, and related typedefs.
- OVCC-1261: carb.crashreporter-breakpad.plugin: Additional “PythonBacktraceStatus” metadata is now recorded for the status of gathering python backtrace during crashing. 
- OVCC-1200: carb.crashreporter-breakpad.plugin: added environment variables to override selected settings for the crash reporter. These are only intended to be used in debugging situation. The following environment variables have been added: - OMNI_CRASHREPORTER_URLwill override the value of the- /crashreporter/urlsetting.
- OMNI_CRASHREPORTER_ENABLEDwill override the value of the- /crashreporter/enabledsetting.
- OMNI_CRASHREPORTER_SKIPOLDDUMPUPLOADwill override the value of the- /crashreporter/skipOldDumpUploadsetting.
- OMNI_CRASHREPORTER_PRESERVEDUMPwill override the value of the- /crashreporter/preserveDumpsetting.
- OMNI_CRASHREPORTER_DEBUGGERATTACHTIMEOUTMSwill override the value of the- /crashreporter/debuggerAttachTimeoutMssetting.
 
- OM-84354: - omni::extras::OmniConfighas been added to replace omni-config-cpp. This new class has similar functionality but uses standard Carbonite utilities, which improves some things such as unicode support. This new class requires carb.dictionary.serializer-toml.plugin for full functionality, but it will work without the framework.
- OVCC-1277: omni.structuredlog.plugin: added the - /structuredLog/needLogHeaderssetting to control whether header JSON objects will be added to each written log file.
- OVCC-1279: omni.telemetry.transmitter: added support for accepting a - file:///URI in the- /telemetry/endpointand- /telemetry/transmitter/<index>/endpointsettings. This file URI can also point to- file:///dev/stdoutor- file:///dev/stderrto write the output to stdout or stderr respectively. When a file URI is used as the endpoint, the event data will not be sent to another server but instead just written to a local log file. This is useful for cloud or farm setups where another log collecting system will be run to collect and aggregate data before sending elsewhere.
Changed
- OVCC-1258: - carb::cpp17::basic_string_viewand associated typedefs (i.e.- string_view) are now considered ABI- and Interop-safe and may be used across ABI boundaries. These classes have been checked against the C++ standard and improved with additions made up to C++23.
Fixed
- OVCC-1259: - carb::cpp20::span(and- omni::span) now support limited ranges: that is, classes such as- std::vectorthat have a- data()method and a- size()method (with other requirements–see documentation) can be used to construct a- span.
- OM-96952: carb.profiler-cpu.plugin, carb.profiler-tracy.plugin and carb.profiler-nvtx.plugin will ignore floating-point value records of NaN and Infinity. 
- OVCC-1269: Fixed a bug in - omni::stringwhere certain operations (such as appending) that exceeded the small string optimization size would result in a string that was not null terminated.
- OVCC-1276: Fixed - omni::stringconstructor and- assignwhich accept- (pointer, size)erroneously throwing when receiving- (nullptr, 0). This is now legal.
- OM-95894: Added clipboard support for virtual windows. 
148.0
Added
- OVCC-1257: omni.bind: Support - externalincludedirs.
- OVCC-1240: carb.crashreporter-breakpad.plugin: Added wide-string volatile metadata support. 
- OVCC-1248: omni.telemetry.transmitter: Added the crash reporter to the telemetry transmitter tool. 
- OVCC-68: Added - carb::extras::withFormatV()and- carb::extras::withFormatNV()which will format a string as by- std::vsnprintf()and call a Callable with the formatted string (the- Nvariant also passes the length). This utility removes the need to allocate space on the stack or the heap to format the string as the function does it.
- OVCC-68: Added macros - CARB_FORMATTED,- CARB_FORMATTED_SIZE,- CARB_FORMATTED_Nand- CARB_FORMATTED_N_SIZEwhich initialize the- va_listmachinery for a varargs function, and call- carb::extras::withFormatV()or- carb::extras::withFormatNV()(for the- Nvariants) to format the string.
- OM-95249: omni.kit.app.plugin Add a setting to clear user config extension version selections 
- OVCC-1255: Carbonite packages now include tools/gdb-syms/gdb-syms.py, a Python script that can be used with the GDB command - source /path/to/gdb-syms.pywhich will attempt to download symbols from the Omniverse symbol server (http://symbols.ov.nvidia.com).
- OVCC-1250: carb.scripting-python.plugin is now available for Python 3.8 and 3.9, in addition to the previously available 3.7 and 3.10. 
Changed
- OVCC-1241: removed the ‘/privacy/externalBuild’ setting from being able to override internal telemetry related behavior. 
- OVCC-1237: Updates Carbonite, omni.bind, and omni.structuredlog to Python 3.10.11. 
- OVCC-68: carb.profiler-tracy.plugin and carb.profiler-nvtx.plugin have been refactored to share more common code and to improve performance. 
- omni.ext.plugin: downgrade “Extension with the same id is already registered” to info level (was a warning) 
- OM-95781: omni.ext.plugin deprecate and cleanup stripping level support in the registry 
Fixed
- OVCC-1251: Worked around slow extension unloading code in omni.ext. 
- OVCC-1242: carb.filesystem: (Windows only) Fixed an issue introduced in 147.0 where file timestamp calculations could vary between - getFileInfo(),- getFileModTime(),- getModTime()and the- DirectoryItemInfopassed to the callback for- forEachDirectoryItem().
- OVCC-1240: carb.crashreporter-breakpad.plugin: Fixed an issue that could cause a stack overflow on Linux while in the crash handler, resulting in lost crash information. 
- OVCC-1245: Fixed a compilation issue that could happen in some cases when omni/Function.h was included. Also fixed a few missing include guards. 
- OVCC-1247: carb.filesystem: (Windows only) Fixed an assertion failure that can occur if an enumerated file is deleted during the enumeration. 
- OVCC-1248: omni.telemetry.transmitter: disabled assertion dialogs in the telemetry transmitter. 
147.0
Added
- OVCC-1228: Added - CARB_ASSERT_INTEROP_SAFEthat checks types for trivially-copyable and standard layout which are required for interop safety.
- OVCC-1232: carb.crashreporter-breakpad.plugin: Added - /crashreporter/pythonTracebackArgs(defaults to- dump --nonblocking --pid $pid) that can be used to override options to- py-spy.
- OM-92726: Add OMNI_KIT_ALLOW_ROOT=1 env var as an alternative to –allow-root for kit executable 
- OVCC-1221: Added some helper functions to - carb::ErrorApi.
- OVCC-1222: Added documentation around omni.kit.app, omni.ext.plugin and many other items in the - omni::kit,- omni::extand- omni::extrasnamespaces.
Changed
- OVCC-1222: POSSIBLY BREAKING CHANGE: Fixed a spelling error in the - prereleasemembers of omni::ext::Version and omni::extras::SemanticVersion.
- OVCC-1221: carb.filesystem: Eliminated all info, warning and error logs. Instead, error states are set through - carb::ErrorApi. Documentation indicates what error states are set by which functions.
- OVCC-1216 / OM-90179: The Carbonite framework no longer spams “pluginA is already a dependency of pluginB” when plugins are repeatedly acquired. However, if a plugin is acquired a significant number of times, a performance warning will appear recommending use of - getCachedInterface().
Fixed
- OM-86228: carb.launcher.plugin: fixed support for launching detached child processes. Previously a zombie process was left on Linux that needed to be externally cleaned up. A detached child process now launches as an orphaned grandchild process that is automatically cleaned up by the terminal session or initd. 
- OM-92726: Fixed regression to use only the first positional argument to kit executable as an app file. 
- OVCC-1221: carb.filesystem: - getModTime()was fixed to match- getFileModTime(), and- getCreateTime()was fixed to match- getFileCreateTime().
- OVCC-1229: omni.telemetry.transmitter: added the missing - libjemalloc.so*files to the- telemetry_transmitterpackage. The same files were also added to the- carb_sdkand- carb_unittestspackages.
- OVCC-1229: omni.telemetry.transmitter: fixed an issue with - omni::extras::UniqueAppthat could cause guard files to fail to be created if the requested directories do not exist. This now make sure to create all directories in the given path when creating guard lock files.
- OVCC-1213: carb.tasking.plugin: Fixed a rare race condition that could lead to a hang or crash if - ITasking::reloadFiberEvents()is called from multiple threads simultaneously.
- OM-93618: Linux: Removed jemalloc as it could cause some crashes 
146.0
Added
- OM-89427: Linux: Executables now use jemalloc for better heap performance. 
- OM-89273: omni.structuredlog.plugin: added support for getting privacy setting in - privacy.tomlfrom environment variables instead of just fixed strings. The settings in this TOML file can now have values like- $env{<envvar_name>}to specify that their value should come from an environment variable.
- CC-1206: carb.crashreporter-breakpad.plugin: added a “[crash]” tag to each log message for the handling of a current crash and a “[previous crash]” tag to each log message when uploading old crash reports so they can be easily and explicitly differentiated in a log. 
- OVCC-1214: - carb::delegate::RefFromDelegate<>and- RefFromDelegate_t<>were created in order to specify the type of a- DelegateReffrom a- Delegate.
- CC-1202: Implemented carb::cpp20::span<> which is a C++14+ implementation of std::span that is mostly compatible with the C++20 version, and also ABI safe. It also implements the C++23 requirement that it be trivially copyable and therefore is also interop-safe. This class is also available as omni::span<> and has MSVC visualizers. 
- CC-1193: carb.crashreporter-breakpad.plugin: added the process launch command line to the crash report metadata. Any paths in the command line will be scrubbed of usernames. 
- CC-1193: carb.crashreporter-breakpad.plugin: added the current working directory to the crash report metadata. Any usernames will be scrubbed from expected path components. 
- CC-1193: carb.crashreporter-breakpad.plugin: optionally added the environment block to the crash report metadata. Any detectable usernames will be scrubbed from the variable values. This is enabled with the boolean setting ‘/crashreporter/includeEnvironmentAsMetadata’. This setting defaults to ‘false’. 
- CC-1138: Added - carb::ErrorApi, the low-level unified layer for propagating errors across modules and programming languages. High level (C++ and Python) utilities that are easier to use will be coming in a future release (soon).
- OVCC-1201: carb.crashreporter-breakpad.plugin at crash time will run py-spy (if present) to capture python traceback information about the crashing process, which is then uploaded as a file to the crash server. 
- OM-74259: omni.kit.app: add - IApp::restartAPI to restart the application
- OM-54868: omni.ext.plugin adds the - uninstallExtensionAPI
Changed
- POSSIBLY BREAKING CHANGE: CC-1199: omni.bind no longer requires an empty “Dummy.cpp” file on Windows; it is no longer packaged with the - carb_sdkand- carb_sdk+pluginspackages. On Linux an empty file is still required but this file has been renamed to Empty.cpp.
- OM-89273: changed the behavior of - carb::extras::EnvironmentVariableParserso that if no prefix string is given, all environment variables get stored as normal environment variables instead of pathwise overrides.
- carb.profiler-tracy.plugin: Updated to use Tracy v0.9.1. NOTE: Viewers will need to update to the same binary version in order to accept and view captures. 
- CC-1207: omni.telemetry.transmitter: the ‘default’ transmission protocol of the transmitter has now changed such that the ‘data’ field of each event is not converted to a string value before sending to the endpoint server. A new protocol mode called ‘dataWithStringify’ has been added to retain the previous behavior. This can be set using the ‘/telemetry/eventProtocol’ or ‘/telemetry/transmitter/ - /eventProtocol’ settings. 
- CC-1211: Windows: Error messages for failing to load plugins or extensions have been improved when it is suspected that the failure is due to a dependent library. Improved documentation for - carb::extras::loadLibrary().
- Call - ITasking::reloadFiberEventsin the startup functions of carb.profiler-cpu.plugin, carb.profiler-nvtx.plugin, and carb.profiler-tracy.plugin so they still work correctly when loaded on demand, as opposed to only at app startup.
Fixed
- OM-90424: Fixed the - configtoken set in omni.kit.app incorrectly resolving to release for debug builds on Linux
- OM-90358: carb.crashreporter-breakpad.plugin: avoided calling - abort()in the termination handler since it can cause up to two extra unnecessary crash reports to be generated and uploaded.
- CC-1210: omni.structuredlog.plugin: made retrieving the privacy settings safer, especially if a value in the given privacy file has the wrong inferred type (ie: a boolean instead of a string). 
- carb.profiler-mux.plugin: Fixed race condition when appending new profilers while another thread iterates over them. 
- OM-91369: Empty.cpp is now packaged along with omni.bind for MacOSX packages. 
- OVCC-1214: Fixed an issue with - carb::delegate::DelegateRef<>whereupon destruction it would unbind all elements from the referenced- carb::delegate::Delegate<>.
- OVCC-1212: Load hooks are no longer called with the Framework mutex locked in order to prevent deadlocks where another thread may be waiting on the Framework mutex, but a load hook is waiting on that other thread. However, load hooks must still complete before any attempts to acquire that specific interface return. 
- CC-1212: carb.crashreporter-breakpad.plugin now uses cached interfaces instead of acquiring interfaces when settings change. This can help prevent deadlocks involving the Framework mutex. 
- omni.ext: Create cache path anyway even when mkdir ext folders is disabled 
- omni.ext: Remove progressbar from extension packing/unpacking code (speedup) 
- OVCC-1219: carb.crashreporter-breakpad.plugin: all metadata and extra files key names will now be sanitized regardless of whether they come through a command line setting, config file, direct change to the settings registry, or one of the - carb::crashreporter::addCrashMetadata()or- carb::crashreporter::addCrashExtraFile()helper functions.
145.0
Added
- CC-1176: carb.tasking.plugin: Added - ITasking::reloadFiberEvents(), a safe method to reload- IFiberEventsinterfaces.
- CC-1137: carb.crashreporter-breakpad.plugin: allowed the crash reporter to enable its configuration functionality once the - carb.settings.pluginplugin has been loaded (or another plugin that provides the- carb::settings::ISettingsinterface). This can happen if the crash reporter plugin is loaded before the- carb.settings.pluginplugin is loaded.
Changed
- CC-1198: On Windows, kit.exe is now known as “NVIDIA Omniverse Kit” instead of “NVIDIA Omniverse Carbonite SDK”. 
Fixed
- OM-90036: Incorrect ternary logic when an optional - classDocstringparameter is passed to- carb::defineInterfaceClass.
- CC-1204: The Carbonite dependency files now have an “alias” of the - python-3.10dependency as- python. This is temporary until Packman allows aliases.
144.0
Added
- OM-81978: New - carb.profiler-mux.pluginthat can be used to forward profiler events to multiple other loaded implementations of- carb::profiler::IProfiler.
- Add start_time and thread_id to Python get_profile_events, and add Instant and Frame events to monitor. 
- CC-1158: carb.events.plugin: - IEventStreamobjects can be created with a name. If a name is not provided, a name is generated based on the caller of the creation function. The name can be retrieved via the- getNamefunction.
- ISubscriptionobjects now generate a name based on the module that contains the- onEventfunction if a name is not provided. The name can be retrieved via the- getNamefunction.
- Profiling of event notification now is more explicit and provides the name of the - IEventStreamand each- ISubscriptionas it is called, along with the- IEvent::typefield (which unfortunately is numeric as the string name is lost to hashing).
 
- CC-1161: added methods of determining whether a given plugin or module is a debug or release build without needing to load up and interrogate the library. On Windows, the string “(Debug)” will show up in the “Product Name” field of the module’s property window (“Details” tab). On Linux, the - g_carbIsDebugConfigsymbol will be present in debug modules and- g_carbIsReleaseConfigsymbol will be present in release modules.
- CC-1153: Added kit-kernel plugins omni.kit.app.plugin and omni.ext.plugin and launcher executable kit. 
- OM-88365: Added optional - classDocstringparameter to- carb::defineInterfaceClass.
- CC-1188: omni.platforminfo.plugin: added support for detecting and handling processes running under compatibility mode on Windows 10 and up. - omni::platforminfo::IOsInfowill now report as close to the actual OS version as it can even when running under compatibility mode.
Changed
- CC-1144: Telemetry: updated the default transmitter schemas packages download URLs. 
- CC-1159: carb.tasking.plugin: A task name can now be passed as a - Trackerto make task naming easier.
- CC-1149: StructuredLog: failed early during prebuild if the Carbonite package path passed to - setup_omni_structuredlog()either doesn’t exist or doesn’t contain the tool at the expected subfolder. Previously this would only fail out at build time if the tool was missing.
- CC-1168: carb.dictionary.plugin: New verbose printout on un-subscribing of a subscription with a list of remaining subscriptions that are active. 
- Standardized internally on - detailfor an implementation-specific namespace, as opposed to- details.
Fixed
- CC-1174: Fixed a situation whereby the Framework would reject a default plugin even though it supported the requested version. 
- CC-1173: Fixed a compile issue on Clang where include/carb/delegate/Delegate.h did not - #include <memory>.
- CC-1160: Framework: fixed framework startup so that it can succeed even if no plugins are present. 
- CC-1177 / OM-86573: carb.profiler-cpu.plugin: Fixed a stack overflow crash that could occur if a frame contained too many dynamic strings. 
- OM-85428: Build: made the command line flag generation in - omni.bind.batfiles deterministic to avoid unintentional rebuilding of projects.
- CC-1190: carb.dictionary.plugin: Fixed a potential assert (debug) or bad access (release) that could occur if multiple threads were iterating an item array. 
143.0
Added
- Added - CARB_FILE_DEPRECATEDto warn that a deprecated file has been included. This can be ignored by having- CARB_IGNORE_REMOVEFILE_WARNINGSdefined.
- CC-1139: Added - CARB_NODISCARD_TYPE,- CARB_NODISCARD_MSG, and- CARB_NODISCARD_TYPE_MSGto supplement the existing- CARB_NODISCARDmacro for decorating types, decorating functions with a custom message, and decorating types with a custom message, respectively. These fall back to their most reasonable approximation if the compiler does not support them.
- CC-1117: Added a carb.tasking.plugin debug visualizer to carb.natvis for Visual Studio 2019+ that displays an aggregate view of task counts by task function (see - [task counts by function]in the CarbTaskingDebug visualizer).
- CC-1118: Prerequisites of a carb.tasking.plugin task are now visible in the tasks listed under the - [task database]member of the CarbTaskingDebug visualizer (called- [prerequisite]).
- OM-66287: StructuredLog: added an optional process lifetime heartbeat event that can be emitted at regular intervals from omni.structuredlog.plugin. These heartbeat events are disabled by default but can be controlled using the - omni::structuredlog::IStructuredLogSettings2interface (specifically the- setHeartbeatPeriod()method).
- CC-1151: Windows crash dumps will included unloaded module info, which will aid debugging when a crash occurs in an unloaded module (such as when a callback is called but the module has been unloaded). 
- CC-51: carb.tasking now provides - carb::tasking::ITasking::nameTask()which allows naming a task. The task name shows up in debug information and is retrievable with- getTaskDebugInfo().
- include/carb/memory/Utils.h now has - carb::memory::protectedMemmove()and- carb::memory::protectedStrncpy(), which are implementations of- memcpy()and- strncpy()(respectively) that will return- falseif a read access violation occurs instead of crashing.
- CC-1141: StructuredLog: allowed all event output to be written to stdout or stderr using the - /structuredLog/defaultLogNamesetting and a value of either- /dev/stdoutor- /dev/stderr. When used, all events will be redirected to the specified stream regardless of per-event or per-schema settings.
Removed
- The following public items were determined to be internal to Carbonite only and have been removed: - omni::log::configureLogChannelFilterList()
- omni::log::registerLogChannelFilterList()
- omni::log::ILogChannelFilterList_abi
- omni::log::ILogChannelFilterList
- omni::log::ILogChannelFilterListUpdateConsumer_abi
- omni::log::ILogChannelFilterListUpdateConsumer
- omni::log::WildcardLogChannelFilter
- Associated Python bindings for the above 
 
Changed
- DEPRECATED: The following include files have been marked as Deprecated and may be removed in the future: - LogChannelFilterUtils.h 
- WildcardLogChannelFilter.h 
 
- CC-1113: carb.dictionary.plugin keeps child keys in the same order as they are created via - createItem,- update, or- duplicateItem. The- IDictionaryinterface was changed to version 1.1 to reflect this.
- CC-1113: carb.dictionary.serializer-json.plugin and carb.dictionary.serializer-toml.plugin were changed to SAX- style parsing, so that keys encountered are pushed into carb.dictionary.plugin in the order specified in the data. 
- CC-1117: carb.tasking.plugin now considers the debugTaskBacktrace setting to be on by default. 
- All non-generated public include files now use relative paths 
- CC-1147: Amended coding standard on thread-safety, internal code, and other practices. 
Fixed
- OM-71761: updated to openssl 1.1.1t, fixes CVE-2023-0286 for omni.telemetry.transmitter 
- OM-80517: Linux: Fixed some issues that could lead to deadlocks when running on Centos7 (glibc 2.17) 
- CC-1113: Log filters (specified in settings under - /log/channels) are now processed in order, provided that the underlying- IDictionary,- ISettingsand- ISerializerinterface(s) respect order. Note that the Carbonite- provided carb.dictionary.plugin, carb.dictionary.serializer-json.plugin, carb.dictionary.serializer-toml.plugin and carb.settings.plugin all respect order. The logging system now automatically monitors the- /log/channelssettings key and processes changes as they occur.
- Fixed and improved several visualizers for Carbonite types listed in carb.natvis (for Visual Studio 2019+). Carbonite types and members that have visualizer support are now tagged with - CARB_VIZ.
- OM-79835: omni.bind: Avoid touching .gen.h files when contents haven’t changed. 
- CC-1154: Fixed issues with public include files compiling on GCC 8, such as - -Wclass-memaccessin include/carb/container/IntrusiveUnorderedMultimap.h and include/carb/variant/Translator.inl
- CC-910: Update the forgeaudio library for carb.audio-forge.plugin to fix a possible crash that could occur on engine shutdown or restart. 
- CC-1156: fixed a bug in carb.launcher.plugin on Linux that could close a file descriptor with the same value as the process ID of the new child process. This mostly affects runs inside containers. 
142.0
Added
- OM-81922: updated to repo_build 0.29.4 to preserve symlinks when copying in premake 
- OM-59371: Requested feature to stop all voices - IAudioPlayback::stopAllVoices.
- CC-1087: New carb.audio-forge setting: - /audio/allowThreadTerminationForge will attempt to terminate its own threads if they’re detected to be hanging as a result of watchdog timers expiring. Terminating threads is not safe and may cause a crash/hang later on. Setting this to- falsewill switch the behavior to abort when the watchdogs expire. This is intended to be set to- falseduring tests to avoid a terminated thread resulting in a deferred crash.
- CC-241: Added - omni::function, an ABI safe drop-in replacement for- std::function. Support for- omni::functioncallbacks in ONI will be added in CC-1131.
- Added a carb.natvis visualizer for - omni::string.
Changed
- CC-1104: - carb::IFileSystem::subscribeToChangeEvents()on Mac OS now uses the- FSEventsbackend. This should have a lower performance overhead and modify events are no longer dependent on filesystem timestamps. The timing and ordering of events may change as a result. This also limits the maximum number of file subscriptions to ~512.
- OM-80477: allowed the structured log session ID to be retrieved without a consent check. 
Fixed
- OM-81171: Fixed several issues stemming from shutdown when started by Python. 
- CC-1116: removed a hard link dependency on X11 in - omni.platforminfo.plugin. The required functionality is now dynamically loaded from that library instead.
- CC-1126: Implemented a workaround for shutdown crashes on Linux where - exit()is called before the Carbonite framework is shut down. The Framework now attempts to register late- atexit()handlers and shut itself down in the event of an unexpected- exit().
- OM-81172: Linux: Fixed an issue with using the Carbonite allocation functions in a module that was not explicitly linking against libcarb.so that could lead to crashes if the symbol was not found. 
- CC-1112 and CC-1120: The GCC warning - noexcept-typewas producing false positives on- carb::cpp17::invokefamily functions when compiling in C++14 mode. This add the macros- CARB_DETAIL_PUSH_IGNORE_NOEXCEPT_TYPEand- CARB_DETAIL_POP_IGNORE_NOEXCEPT_TYPEto assist in disabling this warning when it is appropriate and fixes- invokefamily of functions when using- noexcept-specified function pointers.
141.0
Added
- CC-1078: Carbonite, through a new macro - CARB_PLUGIN_IMPL_EX, now has the ability for a plugin to support multiple versions for a given interface. The Framework also has the ability to serve multiple versions of itself, allowing for future change without breaking already-built plugins. See the Carbonite Interface Walkthrough documentation for more details.
- CC-1078: Documentation was added around ABI safety. See the ABI Compatibility guide in the Carbonite documentation. 
Changed
- CC-1078: Framework version has been changed to 0.6. The previous Framework version 0.5 is still supported, but plugins built after this version will not be compatible with earlier versions of Carbonite. 
- CC-1107: Attempting to load a Carbonite plugin with the same name as an already loaded plugin will now produce a warning log (instead of error) and will now return - carb::LoadPluginResult::eAlreadyLoadedinstead of- carb::LoadPluginResult::eFailed.
- CC-1107: Attempting to load an already-loaded ONI plugin with - carb::Framework::loadPlugin()will now return- carb::LoadPluginResult::eAlreadyLoadedand will no longer log that the dynamic library remains loaded after unload request.
Fixed
- CC-1098: Fixing passing the errorlevel through to the build system when the called-python routines return an error 
- CC-1103: Fixed an issue with packaging on Mac that was excluding python bindings. 
- CC-1086: Removed use of Carbonite logging in Breakpad Crash Reporter. Logging here can cause deadlock while crashing if a thread was logging and held the lock while crashing (noticed in OM-78013). 
- CC-1108: A Linux system that cannot create any more inotify instances when - carb::filesystem::IFileSystem::subscribeToChangeEventsis called will now fail gracefully with a warning message instead of crash.
- CC-1110: Fixed undefined reference linker errors that could occur in C++14 with header-only utilities on GCC, including Path.h, RobinHoodImpl.h and Utf8Parser.h, due to - static constexprmembers within classes.
140.0
Added
Changed
- CC-1088: updated to - repo_build0.28.12 to generate- compile_commands.jsonon MacOS
- CC-1085: bump all Conan dependencies for updated metadata. 
- For carb.crashreporter-breakpad.plugin: - CC-1065: flattened the folder structure in zip files for crash reports. All filenames in the flattened zip archive are also ensured to be unique. 
- CC-1065: added a manifest to crash report zip files that lists each file’s original location and upload key name. 
- CC-1073: prevented preserved crash dumps from being re-uploaded. 
 
- OM-18948: Detect incorrect usage of - ObjectPtrat compile time rather than runtime. Note, this may cause hand written ONI Python bindings to have to be re-written (i.e. use- omni::python::detail::PyObjectPtrrather than- omni::core::ObjectPtr).
Fixed
- CC-1068: Fixed carb.datasource-file.plugin’s - readDataand- readDataSyncfunctions not working properly on Mac
- CC-1077: Fixed an issue with - carb::extras::Pathwhere- replaceExtensionwould crash in Linux on startup in debug builds.
- CC-1065: fixed some potential zip file corruption in crash reports generated by carb.crashreporter-breakpad.plugin related to storing 0 byte files and missing files. 
- CC-1055/CC-1089: Updated to Python 3.7.15, 3.8.15, 3.9.15, 3.10.8 and zlib 1.2.13-1 to fix security issues. 
- CC-1072: Fixed two issues when fetching environment variables on Windows. Fetching a zero-sized value will no longer read uninitialized stack data. Fetching a value larger than 256 wide characters is no longer subject to a race condition if the environment variable changes between the size query and data fetching. 
- CC-1099: fixed the detection of the Windows 11 OS display name in omni.platforminfo.plugin on machines that were upgraded from Windows 10. 
139.0
Added
- CC-1064: added options to the - omni.structuredlogtool to allow it to skip the code formatting step.- added the - --skip-structuredlog-formatoption to the- build.{sh|bat}scripts and the- premake5tool.
- added the - skip_formatboolean argument to the- omni_structuredlog_schema()project function.
- added the - --skip-formatoption to the- tools/omni.structuredlog/omni.structuredlog.pyscript.
 
- OM-43302: Extended support for setting and querying the maximized/minimized/restored state of a glfw window. 
- CC-1060: Added more verbose logging to - carb::Framework::releaseInterface()to log which plugins still have references to an interface.
- CC-615: Preliminary VulkanSDK support for MacOS 
Changed
- Corrected the spelling of - omni::core::GetModuleDependenciesFn. While this is a public symbol it should not affect ABI and its use is generally confined to macros whose names did not change.
Fixed
- CC-1057: Fixed some constructors in - carb::ObjectPtrand- carb::container::BufferedObjectto not be- explicitas these potentially lead to compilation warnings/errors in C++17.
- OM-74155: Fixed an issue on Linux where walking a directory on XFS filesystems would sometimes not properly identify the type of a file/directory. 
- CC-1060: Fixed an issue where releasing interfaces from a script binding would not actually release the interface. 
- CC-1012: Fixed an issue where ONI modules did not properly initialize the Carbonite profiler. 
138.0
Added
- OM-58581: The new carb.audio bindings are now available in python versions prior to 3.10. 
Changed
- CC-629: updated to glfw-3.3.8, removed dynamic glfw libs 
Fixed
- CC-1031: Fixed an issue where outputting a structured logging event to a standard stream would unintentionally close the stream. This fix also ensures that the stream is flushed before continuing with the next message. 
- CC-1046: Fixed an issue where - carb::Frameworkwould not be- nullptr-padded, so functions added to the Framework later would be garbage data instead of- nullptr.
- CC-1046: Fixed an issue where older Carbonite releases (pre v135.0) would crash when compiled against newer headers (v135.0 and later). 
- CC-1052: - carb::container::LocklessStackon Linux is no longer lockless as registering multiple signal handlers in multiple dynamic libraries became untenable.
137.0
Added
- CC-448: carb.variant.plugin now supports a - VariantMaptype: an associative container with- Variantkeys and values that can be itself passed as a- Variant.
- CC-55, CC-1026: Added documentation about loading plugins and acquiring interfaces, and documentation of the generated and optional functions exported by plugins. 
Changed
- CC-1027: - CARB_EXPORTS(note the S) is no longer required to be defined in order for- CARB_EXPORTto export a function. This was the cause of much pain and lost hours. Now,- CARB_EXPORTalways exports a function, which is the typical need for functions like- carbOnPluginStartup(). The rare case of needing dynamic import/export is now handled by a new macro–- CARB_DYNAMICLINK–which will export if- CARB_EXPORTSis defined before carb/Defines.h is included, but otherwise imports (the default).
- CC-949: updated some packages to get several CVE fixes: - updated to zlib 1.2.13+nv2. 
- updated to OpenSSL 1.1.1q+nv7. 
- updated to libcurl 7.85.0+nv3. 
 
- CC-1034: changed code generated by - omni.structuredlogso that it now uses references to objects instead of pointers when passing to the various ‘send event’ functions This allows for easier access to inlined calls to emit messages instead of having to declare local variables for the object parameters. This also included generating default, basic, and copy constructors for each generated object struct as well as an assignment operator to make it easier to construct objects inline in the event helper macros.
- CC-1031: added support for writing structured log messages to stdout and stderr. The - f*FlagOutputToStderr,- f*FlagOutputToStdout, and- f*FlagSkipLogschema and event flags have been added to allow structured log events to be output to the stdout and stderr streams either in addition to the normal log or to exclude the output to the normal log.
Fixed
- CC-1029: If functions were added to an interface without changing the version, newer code that conditionally checked for the functions when running against an older version of the plugin (with a compatible version but without the functions) would see uninitialized memory instead of - nullptr. This has been fixed: the Framework now keeps a null region large enough for 32 functions following any interface memory so that reading beyond the end of it will show null function pointers for new functions.
- CC-1034: Fixed a code generation bug with the - omni.structuredlogtool. If a property in an object property specified in a schema contained a character that is not valid in a C++ symbol, invalid C++ code would be generated. This bug did not occur on property names that were outside of objects however.
- CC-47: Fixed potential deadlocks that could occur if multiple threads were acquiring interfaces at the same time. 
- CC-1039: To mitigate an issue that could potentially cause a dangling pointer crash in - deregisterLoggingForClient() if ONI was stopped and restarted without unloading all plugins, stopping ONI (i.e. withOMNI_CORE_STOP()`) will now unload all plugins.
136.0
Added
- carb::delegate::DelegateRefwas added which allows a reference to a- carb::delegate::Delegate.
- CC-1023: omni.bind now supports the - throw_if_nullattribute on method parameters. omni.bind will generate API code that checks if a parameter is- nullptr, and if so, throw an exception.
- CC-1022: omni.bind now supports the - no_acquireattribute on both return types and parameters.- no_acquiretells omni.bind that the returned pointer has not had- acquire()called on it and- ObjectPtrshould not be used in the API layer. Additionally, methods that end with- WithoutAcquirewill also use raw pointers rather than- ObjectPtron the returned pointer.- no_acquire/- WithoutAcquireare dangerous but useful in hot code paths where the cost of atomically incrementing the reference counts degrades performance.
- CC-1025: omni.bind now supports the - refattribute on both return types and parameters.- refconverts pointers in the ABI layer to references in the API layer.
- CC-1021: omni.bind now supports - throw_resultattribute on methods. When used, this attribute will throw an exception in the API layer when the ABI layer returns a bad- Resulterror code. This attribute can be combined with the- returnattribute (on a parameter) to return a value in the API layer instead of the ABI layer’s- Result.
- CC-1024: build now supports building all flavors of Python bindings. Before the user had to build each binding individually: 
- Added many - omni::core::Resultcodes.
- ObjectParamcan now be used as a boolean.- build -t bindings\carb.python-3.9 && build -t bindings\carb.python-3.10 && ... - Now: - build -t bindings\carb.python 
Changed
- OM-70174: updated to the latest - concurrentqueuepackage to fix some include issues in Kit and Carbonite.
Fixed
- CC-889: Fixed - carb::filesystem::IFileSystem::unsubscribeToChangeEvents()so that it is possible to unsubscribe from within the subscription callback.
- omni.bind now longer produces optimization warnings 
- OMNI_ASSERTmessages now include the filename.
- Fixed ambiguous pointer to - ObjectParamcasts.
- Removed troublesome usage of - OMNI_DECLARE_INTERFACEin ILogChannelFilter.h.
- Function/Methods in IObject.h now have correct - noexceptspecifiers.
135.0
Added
- CC-883: The carb.tokens.plugin plugin now supports environment variable replacement via tokens named - ${env.<name>}
- CC-63: Profiler channels have been added! Profiler channels can be configured at runtime via the - ISettingssystem and can be used in place of masks anywhere. Use- CARB_PROFILE_DECLARE_CHANNELto declare a channel, and then it can be turned on/off (even at runtime) with- /profiler/channels/<name>/enabled. Internally Carbonite’s profiling has changed to use channels with the following names (corresponding to plugins):- carb.assets 
- carb.eventdispatcher 
- carb.events 
- carb.scripting-python 
- carb.tasking 
- carb.windowing-glfw 
 
Changed
- CC-1015: silenced a warning message in - carb.audiothat can occur while enumerating capture devices on a system that does not have a microphone. Also downgraded several error messages around device enumeration to warnings.
Fixed
- CC-1011: Fixed an issue where - carb::cpp20::countl_zero()and carb.tasking.plugin would not run properly on pre-Haswell Intel CPUs.
134.0
Added
- OM-58581: Added bindings to carb.audio to add support for modifying carb.audio.Voice parameters, as well as the ability to play sounds from python. This functionality will not be available with versions of python prior to 3.10. 
- CC-1010: Added support for compressing crash dumps and crash report extra files for upload on all platforms. The crash report files will all be compressed into a single standard .zip file and only that .zip file will be uploaded. This feature is enabled with the - /crashreporter/compressDumpFilessetting. Note that the server side must also support receiving zipped crash reports before this can be enabled.
- CC-206: - ITaskingcan now be used with omni.experimental.job.plugin providing the underlying thread pool. This is enabled by setting- /plugins/carb.tasking.plugin/useOmniJob(default:- false) to- true. This allows other systems to also share worker threads by using omni.experimental.job.plugin.
Changed
- OM-57542: Updated ImGui version and added necessary package references. Added premake5 section for building SimpleGui plugin on MacOS. Changed SimpleGui’s renderer to support 32-bit indices. 
Fixed
- CC-249: fix comparison bug so that CC-249 is really fixed. 
- OM-58581: Fixed an out of bounds read in a - CARB_ASSERT()statement in carb.audio.
- CC-1006: Fixed the quick shutdown process so that it properly shuts down structured logging. 
- CC-860: Added support for uploading extra files with Carbonite crash reports. New files are added to the upload with a call to - carb::crashreporter::addExtraCrashFile(). Files are only uploaded if a crash occurs.
- CC-1009: Fixed - carb::container::LocklessStackon Linux to try and avoid crashes when modules that use- LocklessStackare unloaded in an order that is not the reverse of load order.
133.0
Added
- OM-62703: added - CARB_PLATFORM_NAMEcontaining the name of the current platform and- CARB_ARCH_NAMEcontaining the name of the current architecture.
- OM-62703: added some new flags to - carb::extras::loadLibrary()to expose some extra library loading behavior on Linux.
- CC-879: added a new version of - carb.scripting-python.pluginthat supports python 3.10. These are in subdirectories in the binaries directory which are labeled- scripting-python-[version]. Loading multiple python versions in a single process is dangerous, so it’s not possible to load multiple of these plugins simultaneously and not recommended to try to unload one and load another.
- OM-63213: added - omni::platforminfo::IMemoryInfo::getProcessPeakMemoryUsage()and- carb::extras::getPeakProcessMemoryUsage().
- OM-63213: added - omni::platforminfo::IOsInfo::getKernelVersion().
- CC-996: - carb::dictionary::ISerializerhas an updated- createDictionaryFromStringBuffer()function with more options that can produce better performance. The ABI supports the previous function, but new compilation will use the new function.
Changed
- ** BREAKING CHANGE ** CC-879: - carb.scripting-python.pluginwas moved into the- scripting-python-3.7msubdirectory in the binaries directory.
- CC-891: carb.tasking.plugin is now a task-stealing scheduler that scales better with more cores. Other changes: - The watchdog functionality has been split from the timer thread into its own thread. 
- Instead of one (potentially giant) thread pool, threads are divided up into thread-groups with four threads ideally. 
- When a task is added, a thread-group is chosen and assigned the task. If the thread-group has too much work, other thread-groups are woken and will try to steal tasks. 
- Resuming tasks now respects priority order. 
- Resuming a task that is pinned to a specific thread is more efficient. 
 
Fixed
- OM-62819: Fixed a performance issue in carb.profiler-cpu.plugin that was making it unusable in certain cases. 
- OM-62523: Addressed some docstrings that error when consumed by Sphinx. 
- CC-879: Fixed a bug where - IScripting::getObjectAsString()was not acquiring the GIL.
- CC-948: Fixed a hang that could occur if a log listener called back into the framework while the framework was loading a plugin. 
- CC-988: Fixed an issue where a deadlock could occur if a log listener attempted to acquire an interface. 
- CC-988: Fixed a compilation warning that could occur in TaskingHelpers.h. 
- OM-63659: Fixed an issue with carb.tasking where a stuck condition would be improperly realized and emergency threads started unnecessarily. 
- CC-996: Improved performance of carb.dictionary.serializer-json.plugin and carb.dictionary.plugin in some cases, especially with large JSON files. 
132.0
Added
- CC-868: added support for bindings for python 3.10 with pybind11 2.7. The pybind11 internals ABI has changed, so if you want to add pybind11 bindings on top of the Carbonite bindings, you will need to upgrade to an ABI compatible pybind (such as 2.7.1-08fa9f60). 
Changed
- BREAKING CHANGE The - CARB_PROFILE_FRAME()macro no longer increments- IProfileMonitorframes for last-frame events. This is because- CARB_PROFILE_FRAME()now supports multiple frame-sets (i.e. main thread and GPU thread). Instead, please call- IProfileMonitor::markFrameEnd()to increment a frame for the Profile Monitor.
- CC-868: The include path to pybind11 needs to be added on the build command line when building python bindings with Carbonite’s binding utilities headers. These previously required an include path pointing into the target-deps directory. 
- CC-868: Some workarounds for - -Wundeferrors in pybind11 2.3 have been removed because they break pybind11 2.7. The suggested fix is to disable- -Wundefuntil you can upgrade to 2.7.
- CC-902: Built-in plugins ( - ILogging,- IAssert,- IThreadUtil,- IFileSystem) are now always installed the first time the framework is acquired, and are not unloaded via- Framework::unloadAllPlugins(). They are only unloaded when the framework is released.
- CC-918: removed the - carb.ecsplugin, along with all of its headers, tests, and projects. This plugin was not used in any projects and has long since been superceded by other projects.
- CC-919: removed support for hot reloading C++ plugins. This feature was untested and unused and has become bit rotted. 
Fixed
- CC-907/OM-60787: Fixed an issue that could cause plugins to unload in an incorrect order. 
- CC-902: Calling - carb::acquireFrameworkAndRegisterBuiltins()multiple times is now safe and will no longer result in error logs.
- CC-880: carb.profiler-cpu.plugin: - CARB_PROFILE_FRAME()now outputs an event to the chrome-tracing file to mark the frame end. When a subsequent Tracy PR is merged, Tracy’s import-chrome tool will be able to translate these events into frame markers.
- CC-913: Fixed a rare bug in - carb::extras::HandleDatabasethat could lead to rare crashes in carb.tasking.
- CC-915: Fixed an issue with carb.profiler-tracy.plugin where the Tracy viewer gets confused with too many source locations. 
- CC-954: Fixed a problem with the RobinHood container hashing that was causing compilation issues on clang 14. 
131.0
Added
- CC-864: Added lock profiling interface, which is currently only used by carb.profiler-tracy.plugin 
- CC-848: Several performance improvements were made to carb.profiler-cpu.plugin. 
- CC-862: Completed the - invoke-family functions and meta queries (- invoke_r,- is_invocable,- is_invocable_r,- is_nothrow_invocable,- is_nothrow_invocable_r) and added requisite utility meta query- is_nothrow_convertible. These behave according to the rules in the current (as of August 2022) C++23 Standard Draft, but reside in the- carb::cpp17namespace, as that is when the functionality was introduced to the C++ Standard.
- CC-372: Added a setting - /log/forceAnsiColorthat allows the user to force the logger to use ANSI escape codes to color the console. Useful for CI/CD settings.
- CC-853: carb.tasking.plugin has a function that will bind trackers to a required object: - ITasking::bindTrackers().
Changed
- carb.profiler-cpu.plugin no longer exports Chrome Tracing Flow events by default. They can be enabled with setting key /plugins/carb.profiler-cpu.plugin/flow (boolean, default: - false).
- CC-848: carb.profiler-cpu.plugin now emits additional profiler zones for itself (profiling the profiler) if - carb::profiler::kCaptureMaskProfileris set in the capture mask.
- CC-848: Some of the carb.tasking.plugin profile zones are now static names instead of dynamic names to save time capturing these profiler zones. (Example: “Running fiber 123” is now just “Running fiber”). 
- Upgraded carb.profiler-tracy.plugin to Tracy 0.8.2 
- CC-658: Removed - carb::thread::getCurrentProcessor(). The only reasonable use of this function was in tests for thread pinning utilities, so the decision was made to remove it.
Fixed
- CC-854: Fixed locking that could lead to a performance issue with carb.settings and carb.dictionary. 
- CC-64: Performance is improved when carb.profiler-cpu.plugin is loaded but not started or has a capture mask of - 0.
- CC-855: Fixed a rare crash that could occur if carb.profiler-cpu.plugin was started and quickly shutdown. 
- CC-886: Added the missing - ChangeEventType.CREATEDtype to- carb.settingspython bindings.
- CC-862: - carb::cpp17::invoke_resultto be SFINAE-safe. Previously, when the- F(Args...)signature was not invocable, it was an error in the immediate context.
- CC-857: Fixed an issue with carb.profiler-tracy.plugin where - CARB_PROFILE_END()would still pay attention to the mask and could potentially cause profile zones to become out of sync. Applied the same fix from CC-603 to the Tracy profiler.
- CC-881: Fixed an issue with carb.profiler-tracy.plugin where profiler zone source location could be duplicated. 
- CC-537: Fixed omni.structuredlog python code generation. 
130.0
Changed
- CC-684: Failing to close a file will now report the file that failed to close and the underlying error. 
- CC-817: Non-quick shutdown returns back to two phases: the first phase is shutting down all plugins, followed by unloading all plugins. 
- CC-847: (Windows only) As a performance improvement, - OutputDebugStringis no longer called by default for log messages unless a debugger is attached. Calling- StandardLogger::setDebugConsoleOutput(true)will force debug output even when a debugger is not attached.
Fixed
- CC-817: Fixed an issue where interfaces are released before a plugin is shutdown. In some cases (such as carb.tasking.plugin) this can result in the interface being re-instantiated while shutting down. 
- Fixed verbose log spam in carb.settings.plugin (“node type mismatch” logs when a key did not exist). 
- Fixed verbose log spam in carb.audio-forge.plugin (“{context = xxx}” logs when updating a context). 
129.0
Added
- Warning logs are now emitted when a plugin unload is requested but the module is not unloaded. 
- Support for limiting the zone depth of a profile capture taken using the carb.profiler-cpu.plugin. The max zone depth can be set via the new - /plugins/carb.profiler-cpu.plugin/maxZoneDepthsetting.
Changed
- The - CARB_BINDINGS()and- CARB_BINDINGS_EX()macros take an additional optional parameter that is the string of the script language that the binding is for. If unspecified,- "python"is assumed.
- CC-808: - carb::quickReleaseFrameworkAndTerminate()no longer runs- carbOnPluginShutdown()for plugins that do not provide a- carbOnPluginQuickShutdown(); only the- carbOnPluginQuickShutdown()function is called if provided. This makes quick-shutdown significantly faster, but it is now highly recommended that all plugins that have files open for writing flush and close those files.
Fixed
- CC-779: Python script bindings are now considered dependencies of carb.scripting-python.plugin and now attempt to unload carb.scripting-python.plugin before dependent interfaces to improve shutdown stability. 
- Fixed an issue with - carb::extras::getLibraryHandleByFilename()that would leak shared object references on Linux.
- Fixed an issue with carb.scripting-python.plugin leaking a reference to the python shared object on Linux. 
- Fixed an issue with - omni.structuredlog.pluginwhere it would not be properly reset if the module failed to unload.
- CC-781: Fixed an issue with - carb::Delegatewhere parameters to- Call()were improperly- std::move’d, so if multiple receivers were bound, only the first receiver would receive the proper parameters.
- Fixed an issue where interfaces could be acquired (and plugins loaded) during a call to - Framework::unloadAllPlugins.
- Fixed an issue where shutting down the framework did not clear some state, causing inconsistencies and issues when the framework was later re-initialized. 
- Fixed a warning at shutdown from - carb.profiler-cpu.pluginabout “Failed to remove release hook”.
- Fixed a rare thread-safety crash with - omni.structuredlog.plugin.
- CC-809: fixed the auto-detection of MP3 files with both the ‘error protection’ bit enabled and disabled. Previously MP3 files with error protection enabled were failing to load. 
- CC-668: got carb.launcher.plugin building and passing all tests on MacOS. Some tests had to be disabled because MacOS doesn’t support the related functionality. 
128.0
Added
- CC-587: Basic support for Mac OS was added. - Carbonite binaries for Mac OS are not available yet. 
- CARB_PLATFORM_MACOShas been added for detection of Mac OS.
- CARB_POSIXwas added. This is set to- _POSIX_VERSIONon systems that are mostly-compliant with POSIX, such and Linux and Mac OS, and set to 0 on other systems, such as Windows.
- CARB_MACOS_UNIMPLEMENTED()has been added to mark code paths that are not supported yet on Mac OS. If you want to use Carbonite extras headers on Mac OS, you can grep for this symbol to verify whether the extras header is supported on Mac OS yet.
 
- OM-55766: - OMNI_GENERATED_APIHelper macro to access generated API
- OMNI_USE_FROM_GENERATED_APIHelper macro to bring member functions from generated API when function overloads are provided.
 
Changed
- CC-705: reworked the telemetry transmitter so that it now stores the processed and validated message strings instead of the JSON documents themselves in the event queue. This significantly reduces memory usage for the transmitter. 
- CC-745: Unsuccessfully loading a plugin optionally (with - tryAcquireInterface) will no longer produce any error logs.
- CC-743: Fixed a performance issue with - carb::tolowerand- carb::toupperon Linux.
- CC-716: - carb::extras::convertUtf8ToWide()and- carb::extras::convertWideToUtf8()no longer use the deprecated C++- wstring_convertlibrary and instead use our Utf8Parser library. This affects the failure condition of these functions.
Fixed
- CC-595: Use canonical paths in - omni::core::TypeFactoryImpl. Prior to this commit,- omni::core::TypeFactoryImplwould directly use the- moduleNamearguments provided to the- createType_abi,- registerInterfaceImplementationsFromModule_abi, and- unregisterInterfaceImplementationsFromModule_abifunctions. This caused an issue because- carb::FrameworkImpl::loadPluginswould call- registerInterfaceImplementationsFromModule_abiwith the canonical path of the module, and then future calls to createType with the non-canonical version of the path to the same module would reload the module because the module name (which is the path) would not match. This commit fixes that by making the three API methods above convert the moduleName argument to a canonical path for consistency.
- CC-747: Resolved a shutdown order issue with - carb::thread::ThreadLocalthat could sometimes lead to a crash.
- CC-751: Upgraded openssl in omni.telemetry.transmitter to 1.1.1q to address CVE-2022-2068. 
- CC-772: Resolved an issue with plugin unload order not respecting dependencies correctly. 
- CC-622: Fixed - carb::extras::Path::getParentPath()when resolving parent path’s with only 1 directory level.
127.0
Added
- CC-582: - carb::cpp20::atomic<>now supports waiting for non-primitive (but- is_always_lock_free) types.
- OM-53429: Added settings and support to the telemetry transmitter to be able to filter out messages that came from host apps run in different modes (ie: ‘dev’ vs ‘production’ vs ‘test’). The - /telemetry/transmitter/messageMatchModesetting is used to control this behavior. By default, all messages are allowed to pass through.
- CC-510: Adds - omni::experimental::IUrl, an RFC-3986 compliant URL implementation. It is currently experimental.
- OM-45102: Added separate functions for trimming strings in a UTF-8 friendly way or by using current C locale. Helper function for finding the last Unicode symbol in a UTF-8 string. 
- CC-714: Added - carb::thread::hardware_concurrency(), which is similar to- std::thread::hardware_concurrency()but will take docker cgroups into account if running from within a docker container.
- CC-705: added support for batching events when sending to NVDF backends. These will now send as many events as possible in a single HTTP request instead of sending each message individually. 
- CC-716: - convertUtf32ToUtf8()now has flags which allow you to return U+FFFD on codepoint conversion failure.
Changed
- CC-632: carb.tasking.plugin: Evaluated how calling - ITasking::applyRangerecursively works, especially with non- uniform workloads. In some cases, performance improvements up to 67% were seen in tests with Kit.
- OM-53429: Added a telemetry mode tag to each structured log message’s “source” field if running in “dev” or “test” mode. 
- CC-386: - omni.bindnow outputs a comprehensive diff when using- --fail-on-writeoption alongside the error message. This should help debugging CI errors by eliminating the “What’s different?” question that requires a re-run in the environment the build failed in.
- CC-705: changed the telemetry transmitter to limit the number of events that would be processed at any given time to help reduce the amount of memory used. Added the - /telemetry/transmitter/<index>/queueLimitoption to control the maximum number of events that can be processed at once. This new option defaults to 10000 events. In testing, this roughly corresponds to ~500-1000MB of memory usage.
- CC-714: carb.tasking.plugin and omni.job now use - carb::thread::hardware_concurrency()for default thread counts.
- CC-560: Deprecated the old - kSerializerOption*flags and renamed them to- fSerializerOption*to better comply with the coding standard. The use of the old flags will have to be changed in any Carbonite based apps.
Fixed
- CC-603: Fixed issue where repeated profiler runs caused incorrect profile in second run onwards. This was caused by zones ends unintentionally matching partial zone begins from the previous run. Please note that this has been fixed for the cpu profiler ONLY (/plugins/carb.profiler-cpu). 
- OM-34980: Fixed an issue with command line array argument in the form - [a, b]not replacing the whole previous array
- CC-628: Fixed a few more issues with - min/- maxin public headers, as well as adding a compilation test to prevent future uses.
- CC-625: - carb::framework::getPluginCountreturns only the count of carb plugins loaded. The change for CC-383 made- carb::framework::getPluginCountreturn the total number of carb and oni plugins, but- carb::framework::getPluginswould only return carb plugins, leading to empty entries in the- get_plugins()python function. This change restores the previous behavior of- carb::framework::getPluginCountonly returning the count of carb plugins.
- OM-53429: Fixed an issue in - omni.telemetry.transmitterwhere only the first transmitter would control whether the log directory was processed and whether events were uploaded. This has now been changed so that any transmitter that needs or can accept data will allow the logs to be processed and events uploaded.
- CC-697: Fixed use-after-move issue in - carb::extras::EnvironmentVariable
- CC-705: fixed the broken launch guard in the - omni.telemetry.transmitterapp.
- CC-705: fixed the trandmitter so that it no longer has the potential to resend events when multiple transmitter endpoints are out of sync. 
- CC-716: - convertUtf32ToUtf8()is now implemented identically across all platforms.
126.0
Added
- CC-505: - omni.telemetry.transmitternow has the capability to send data to multiple endpoints at once. To do this, just make the settings key- /telemetry/transmitterand array of objects. Each object will transmit to a separate telemetry endpoint.- The new setting - /telemetry/transmitter/retryLimithas been added to allow the transmitter to handle offline telemetry endpoints more gracefully.
 
- CC-505: - omni.telemetry.transmittercan specify an array of telemetry endpoints with the setting key- /telemetry/transmitter/endpointto specify fallback URLs to if your main endpoint goes down.
- CC-454, OM-28642: - omni.binddiagnostic reporting has been re-done for a better experience when reporting things to the user. Multiple errors can be reported by a single run of the program as opposed to stopping at the first issue (some errors are still considered fatal and will halt execution immediately). Diagnostic messages are highlighted based on their severity if the output is a TTY.
- CC-533: - carb::tasking::ITasking::applyRangeBatchwas added as a more tunable alternative to- applyRangeand reduces the function call overhead of- applyRange.
- CC-447: carb.variant.plugin.dll now supports - RString/- RStringU/- RStringKey/- RStringUKeyas contained types.
Changed
- CC-505: The following omni.telemetry.transmitter settings have been updated to work better with the multiple endpoint system. The old settings will continue to work as long as the - telemetry/transmittersettings key is not set; if you use the new settings keys, you must upgrade all of your keys to the new system.- /telemetry/resendEvents=>- /telemetry/transmitter/resendEvents
- /telemetry/transmissionLimit=>- /telemetry/transmitter/transmissionLimit
- /telemetry/endpoint=>- /telemetry/transmitter/endpoint
- /telemetry/schemasUrl=>- /telemetry/transmitter/schemasUrl
- /telemetry/authenticate=>- /telemetry/transmitter/authenticate
- /telemetry/authTokenUrl=>- /telemetry/transmitter/authTokenUrl
- /telemetry/authTokenKeyName=>- /telemetry/transmitter/authTokenKeyName
- /telemetry/authTokenExpiryName=>- /telemetry/transmitter/authTokenExpiryName
- /telemetry/eventProtocol=>- /telemetry/transmitter/eventProtocol
- /telemetry/seekTagName=>- /telemetry/transmitter/seekTagName
- /telemetry/authTokenType=>- /telemetry/transmitter/authTokenType
- /telemetry/oldEventThreshold=>- /telemetry/transmitter/oldEventThreshold
- /telemetry/ignoreOldEvents=>- /telemetry/transmitter/ignoreOldEvents
- /telemetry/pseudonymizeOldEvents=>- /telemetry/transmitter/pseudonymizeOldEventsThe following settings have been deprecated. These settings will continue to work as-is, but they are no longer supported when using the- /telemetry/transmittersettings key. To continue using this functionality, specify the directory or file in- /telemetry/transmitter/schemasUrlwith a- file://prefix.
- /telemetry/schemaFile
- /telemetry/schemasDirectory
 
Fixed
- CC-514: The - g_carbProfilerglobal variable is now automatically set to- nullptrwhen the profiler is unloaded and/or the framework is released. Once- carb::profiler::registerProfilerForClient()is called, a load hook is installed which will cause the- g_carbProfilerglobal variable to be set for a module once the profiler module loads. Previously this global variable would be left dangling, potentially leading to crashes. A plugin or application need only be rebuilt to pick up this fix.
- CC-585: Fixed an issue with - carb::hashPair()where it would erroneously always return 0.
- CC-593: Carbonite has changed its coding standard to not use keywords - minor- maxin public headers and changed all existing places that previously used these keywords. This is an effort to prevent compilation issues when Windows.h is included without defining- NOMINMAX.- ::carb_min()and- ::carb_max()have been added as alternatives to- std::minand- std::max, in include/carb/Defines.h.
- CC-597: Build fix in - omni::core::PluginManagerfor build error seen in clang.
125.0
Added
- CC-258: ONI Python bindings now support - omni::stringby conversion to Python-native- str.
- CC-520: Added python support for several - IProfilerfunctions that were missing.
- CC-506: Added “Robin Hood” open-addressing hash containers to - carb::container:- RHUnorderedMap,- RHUnorderedSet,- RHUnorderedMultimapand- RHUnorderedMultiset. While similar to the- stdunordered containers, they are not drop-in replacements, but should be useable in many cases.
- CC-497: Added support for the new NVDF protocol for omni.telemetry.transmitter. Use the settings key - /telemetry/eventProtocolto configure this.
- CC-497: Added an option to specify the name for seek tag in omni.telemetry.transmitter. Use the settings key - /telemetry/seekTagNameto configure this.
- CC-507: Removed some log messages in - ILauncherthat could lead to a deadlock in the child process.
- CC-440: Added overloads to allow - carb::extras::Guidto be used as a key in a- std::unordered_map.
- CC-440: Added - IAudioDevice::getDeviceCapsByGuid()and- IAudioDevice::getDeviceNameByGuid().
- CC-440: Added example.audio.device to demonstrate usage of the - IAudioDeviceinterface.
- CC-513: Added a walkthrough document and related example app and plugin to demonstrate how to create and use a Carbonite interface. 
- CC-383: Added the ability for ONI plugins to declare dependencies, and for Carbonite and ONI plugins to depend on each other. - omni::bindnow generates an- OMNI_PLUGIN_INTERFACEmacro that defines the- getInterfaceDesc()function, the same as carbonite interfaces. This allows for declaring dependencies to work the same between carb/omni. Omni modules can now export the function- getModuleDependenciesto declare their dependencies. Carbonite and ONI plugin dependecies are tracked together, to unload order can be guaranteed across frameworks.
Changed
- CC-520: For carb.profiler-cpu.plugin, the - CARB_PROFILE_FRAMEmacro now ignores the- maskparameter by default. This is an effort to make frame processing consistent no matter what capture mask is specified. This behavior can be returned to the previous behavior (where the- maskparameter is considered) by setting config key- /plugins/carb.profiler-cpu.plugin/ignoreFrameMaskto false.
- CC-497: Increased the omni.structuredlog log header size to 1024 when new log files are generated. Older versions of omni.telemetry.transmitter should continue to work with these longer headers. 
- CC-440: The audio example binaries have been renamed to better indicate which submodule they demonstrate. 
Fixed
- CC-516: Upgrade to OpenSSL 1.1.1o to fix multiple CVEs. 
- CC-520: Fixed a race condition in carb.profiler-cpu.plugin where it was possible to immediately query - IProfileMonitor::getLastProfileEventsafter- CARB_PROFILE_FRAMEbut not receive the previous frame’s information (instead it was still the frame-before-previous).
- CC-519: Changed the - omni.structuredlogtool to disable warning C4127 on Windows in generated header files. This warning occurs when a constant is used in an if-statement (which the generated code does intentionally on release builds). This can be treated as an error in builds that use higher warning levels.
- OM-50917: Fixed some issues with the audio device notifier in - carb.audioon Windows when using the WASAPI backend.
124.0
Added
- CC-498: Added more debugging log output to ILauncher when a new child process fails to launch (as error or warning level messages) and when a new process handle is first created (as info level messages). Only launch descriptor values that differ from their defaults will be output. 
- CC-291: Added documentation for - /audio/nullBackend/CaptureTestMode.
- CC-291: Added - /audio/nullBackend/ReportsOverrunsfor testing overrun detection in- IAudioCapture.
Changed
- CC-478: On Windows, the memory functions ( - carb::allocate,- carb::deallocate, and- carb::reallocate) no longer require carb.lib to be linked in order to build; instead, by default they now find the underlying- carbReallocatefunction from carb.dll at runtime. However, sometimes it is desirable to have carb.dll loaded implicitly. This is now accomplished by defining- CARB_REQUIRE_LINKED=1before including include/carb/Memory.h and will also require linking against carb.lib.
- CC-500: Changed the exit codes returned from - carb::launcher::ILauncher::waitProcessExit()and from- carb::launcher::ILauncher::getProcessExitCode()on Linux in the case of a crashed child process so that they return the same value that a shell would report in- $?. This does not in any way affect the exit code returns in the case of child processes that exit normally. It is left up to an exercise for the host app to detect and handle the event of a crashed child process. In general, Linux processes will return a value that is 128 plus the number of the signal (ie: SIGSEGV, SIGABRT, etc) that killed the process. On Windows a crashed process will generally have an exit code that starts with 0xc0000000 (though this is not true in the case of- raise(),- abort(), or a failed- assert()call which all typically set an exit code of- 3).
- CC-291: Renamed some device backend settings in carb.audio-forge to make it easier for users to find settings. - /audio/oldWindowsBackendwas renamed to- /audio/WASAPI/legacyBackend.
- /audio/nullDeviceCountwas renamed to- /audio/nullBackend/DeviceCount.
- /audio/nullBackendIsFunctionalwas renamed to- /audio/nullBackend/IsFunctional.
- /audio/nullBackendCaptureTestModewas renamed to- /audio/nullBackend/CaptureTestMode.
 
Fixed
- CC-486: Improved performance of carb.tasking.plugin: fewer system calls to wake a thread, and fiber stack reset (if - /plugins/carb.tasking.plugin/resetFiberStackis- true) now only occurs in a single thread when no other tasks are available to run.
- Fixed a compilation issue with - CARB_PROFILE_EVENT()macro.
- DRIVE-4086: Fix for reconciling an external callers held zoneId with the new/replayed zoneId created on fiber switch. 
- CC-473: Allow for plugins to depend on interfaces they provide. 
- OM-36366: Fixed a bug in - carb.audiothat would cause a muted sound to not be muted if the- carb::audio::fPlaybackModeFadeInflag was also used.
123.0
Added
- OM-48634: Add GPU timestamp injection interface to - IProfiler.
- OM-48808: Reworded some output in the crash reporter about the size and readability of the crash dump file to make it more clear whether the dump file was deleted due to a successful upload or not. 
- CC-470: The - Frameworknow supports “load hooks”: a load hook is a callback that is called when an interface becomes available from a plugin load. This can be used to weakly couple plugins, such as if a Profiler plugin doesn’t normally load carb.tasking.plugin, but takes action when it is otherwise loaded.
- OM-49026: Improved the - carb.crashreporter-breakpad.pluginstartup by deferring symbol loading until a crash actually occurs.
- CC-485: Improved performance of carb.tasking.plugin on Windows by setting the system timer to the highest resolution available. 
- CC-485: Further improved performance of carb.profiler-cpu.plugin when used with carb.tasking.plugin by more quickly recording task switches. 
Changed
- CC-479: Upgraded to FLAC-1.3.4. This fixes CVE-2021-0561. 
- CC-449: - IAudioCaptureon Windows no longer uses DSound. It now uses the same capture system as on Linux, with a device backend built on Windows Audio Services. Functionality on Windows should not change substantially; the only major difference is that the new system has improved overrun detection. Additionally, this means the- nulldevice backend will now work with- IAudioCaptureon Windows.
Fixed
- OM-48865: Fix potential infinite loop in ProfilerNvtx ‘endEx’. 
- OM-47219: A better fix for the degenerative performance issue when carb.profiler-cpu.plugin was used with carb.tasking.plugin and /plugins/carb.profiler-cpu.plugin/fibersAsThreads as - true.
- CC-422: - carb::Frameworkwill not print a warning message when a plugin acquires an interface that is not listed as a dependency if that interface is provided by the plugin that is loading it. a dependency if that interface is provided by the plugin that is loading it.
- CC-475 - omni.experimental.job.pluginno longer links with X11.
- CC-472: Fixed an issue that could cause a hang if multiple threads in different modules were using - carb::RStringat the same time.
- CC-483: Worked around a few places in the logging system that could deadlock via interaction with internal locks in GLIBC 2.17, especially when logging in a thread while a different thread loads a python binding .so which registers a log listener in a static initializer. 
- CC-483: Fixed a potential hang that could occur when using - carb::getCachedInterfacesimultaneously from multiple threads.
122.0
Added
- CC-359: carb.variant.plugin now supports strong types ( - carb::Strong).
- CC-415: carb.variant.plugin now has a new - carb::variant::VariantArraytype which can be used to create an array of variants, and now also supports- std::pair<Variant, Variant>.
- CC-415: carb.variant.plugin now defines (in the - carb::variant_literalsnamespace) a literal- _vthat can be appended to a literal to create a- Varianttype from it (e.g.- 123_v,- "Hello"_v, etc.)
- CC-359: carb.assets.plugin is now documented and now sends (via carb.eventdispatcher.plugin, if available) events - Asset.BeginLoadingwhen loading (or re-loading) starts for an asset, and- Asset.EndLoadingwhen loading finishes. See- carb::assets::IAssets::loadAsset()in include/carb/assets/IAssets.h for more information.
- CC-441: Added a specialization of std::hash for carb::cpp17::variant. 
- CC-376: - omni.bindgenerated Python bindings now support keyword parameters with names based on their C++ parameter name (in- snake_case). This can be overridden with- OMNI_ATTR("py_name=something_else").
Changed
- BREAKING CHANGE: The types - Id,- Pooland- Snapshotwithin the- carb::assetsnamespace have been converted to strong types (- carb::Strong) instead of fake pointer types. As such, assigning them to- 0or- nullptrwill now cause a compile error. Instead use their default constructed or special invalid types:- kInvalidAssetId,- kInvalidPooland- kInvalidSnapshot, respectively. For- printf-style formatting, instead of using- %p, use the format specifier for the underlying type and call the- .get()function. This is to better facilitate types passing through the Variant system.
- BREAKING CHANGE: The rarely-used - carb::assets::CreateContextFnloader function must now return a- carb::assets::LoadContext*instead of a- void*; the rarely-used symbol- carb::assets::OnDependancyChangedFnhas had its spelling correct to- carb::assets::OnDependencyChangedFn.
- CC-275: Updated the Windows audio playback backend to an improved implementation. If you run into playback issues, you can restore the old backend with this settings key: - /audio/oldWindowsBackend.
- OM-39028: improved - carb::dictionaryconversion error reporting
- CC-420: On Linux, changes the - carbReallocatefunction to be weak-linked. This alters the memory functions which use it (- carb::allocate,- carb::deallocate, and- carb::reallocate) to understand this and gracefully fail when the- carbReallocatefunction is not available. This allows users which only incidentally use these functions to not link against- libcarb.so. This case is common for plugins which might use an- omni::string.
Fixed
- CC-404/OM-46660: Fixed an issue with carb.input.plugin where action mappings referencing a device were not cleaned up when a device was destroyed, potentially causing a crash later when the destroyed device was dereferenced. 
- CC-423: Worked around an internal compiler error with gcc-7 that can occur in some cases when using include/omni/String.inl. 
- OM-47219: Fixed a degenerative performance issue when carb.profiler-cpu.plugin was used with carb.tasking.plugin and /plugins/carb.profiler-cpu.plugin/fibersAsThreads as - true.
- CC-455: Fixed an issue with - carb::tasking::IFiberEventswhere a task may have ended and a new task begun without any notification.
- OM-33460: Fixed ObjectParam member access operator. 
- CC-373: - fillOutArraylifted restriction for array size argument. It used to be- uint32_t, now it’s any- unsignedtype.
- CC-359: Fixed an issue with - carb::variant::Variantwhere- getValue<const char*>would read garbage from a- Variantof type- const char*.
121.0
Added
- CC-289: Allowed - omni.structuredlog.pluginto be used in a ‘standalone’ mode. This plugin can be used in a non-Carbonite app without the need for other dependent libraries (including ‘carb.dll/so’). When being used in standalone mode, the omni/structuredlog/StructuredLogStandalone.h header should be used to pull in the supported dependencies. The structured log library is expected to be present in the same directory as the main executable. The example.structuredlog.dynamic example app demonstrates how the library can be used in standalone mode.
- CC-396: Added string conversion helpers to Utf8Parser.h, which will allow easy conversions between UTF-8 and UTF-16/UTF-32. 
- CC-377: Added carb.eventdispatcher.plugin which is a replacement for carb.events.plugin for immediate events (the carb.events.plugin is more of a message queue). Additional features: - Allows observers to filter which events they receive. 
- Doesn’t use carb.dictionary.plugin; instead it uses a new extensible variant system in carb.variant.plugin which is faster than dictionary and supports the same types. 
- More clearly defined behavior of recursive event dispatching when adding/removing observers. 
- Lack of ref-counting prevents crashes like OM-43254 from unreleased events. 
 
- CC-421: Carb python logging will now convert to string and log any python object. 
Fixed
- CC-401: Update Python and OpenSSL dependencies to fix a security vulnerability. 
- CC-396: Fixed some security issues in - carb::extras::Utf8Parseraround invalid characters.
120.0
Added
- CC-363: Added support for specifying other types of authentication tokens in - omni.telemetry.transmitter. This now supports long-lived API keys as tokens through the use of the ‘/telemetry/authTokenType’ setting and specifying a local file through ‘/telemetry/authTokenUrl’ instead of a URL. These two options can also be used to specify a long-lived API key that is downloaded from a custom URL or read from a file. The ‘/telemetry/authTokenKeyName’ and ‘/telemetry/authTokenExpiryName’ settings can also be used to specify different ways to parse the token out of a JSON blob from all sources. By default, the token type is detected based on whether it is retrieved from a URL or file.
- CC-199: Added the - IJobinterface.- IJobis an experimental ONI interface that provides an abstraction for a foreign job system.
Changed
- Documentation for - omni::stringexplaining the requirement for linking against carb.dll/libcarb.so to use- omni::string
- OM-45612: Changed an error message from carb.profiler to a warning since it could potentially be written out frequently and flood the telemetry data lake if it is redirected as a telemetry event. 
Fixed
- CC-364: Fixed improper use of - memory_order_relaxedin- carb::tasking::TaskGroupand improper use of- volatile.
- CC-355: Fixed some minor rendering issues in - IAudioUtils::drawWaveform(). Golden image tests that use this functionality will likely need their images regenerated.
- CC-362: Fixed the - flagsparameter validity checks in- carb::audio::createSoundFromFile()and- carb::audio::createSoundFromBlob().
- CC-362: - IAudioData::getFormat()has had its documentation corrected.
- CC-362: Fixed the confusing behavior of - SoundData.get_format()on streaming sounds in the- carb.audiopython bindings.
119.0
Added
- OM-44734: Added a ‘retry count’ to each crash dump’s metadata. If a crash dump fails to upload multiple times, it will eventually be deleted and considered corrupt instead of letting failing crash dump files pile up locally and attempting to upload on each new run. The retry count to delete failed dumps after is controlled with the setting ‘/crashreporter/retryCount’. This is an integer value that defines the maximum number of times to try an upload of any given crash dump file. This setting defaults to 10 tries. This can be set to a lower value to delete so that on the next run, any local dumps that have already been tried and failed that many times will be deleted if they fail again. 
- CC-329: added python bindings for - IAudioData.
Fixed
- CC-353: Fixed a build break in GCC 9.3.0 caused by - __attribute__(())syntax changes.
- CC-374: Fixed memory orders and contention issues that could arise on high CPU counts, especially on AArch64 machines. 
118.0
Added
- CC-316: Added the - audio/pulseAudio/enumerateMonitorssetting to allow PulseAudio’s loopback (AKA monitors) devices to be enumerated as audio capture devices.
- CC-331: Added - carbGetSdkVersion()and include/carb/SdkVersion.h to allow access to the SDK version string. A helper macro was also added to allow verification of whether the loaded Carbonite framework version matches the header files that are being used in a host app.
- OM-44740: Added the Carbonite SDK version as metadata in the crash reporter. 
Changed
- CC-301: Changed all of the Carbonite framework globals (ie: - g_carb*) so that they are weakly linked. This is to resolve an issue related to pulling in include/carb/extras/ headers from pure ONI modules. When this happened, the linker would often add an undefined reference to one of the framework globals because something in the header called- CARB_ASSERT(),- CARB_LOG_*(), etc.
- OM-44182: Changed the ‘quick shutdown’ process to include unloading the omni.core plugins as well as the Carbonite plugins. 
- CC-304: - carb::delegate::Delegatenow allows itself to be destructed while in a callback.
Fixed
- OM-43654: Evaluated all Carbonite Python bindings and released the GIL (global interpreter lock) wherever appropriate. 
- CC-326: Fixed a crash that could sometimes occur in carb.profiler-cpu.plugin when - /plugins/carb.profiler-cpu.plugin/recordSourceInfowas enabled (the default).
- OM-43254: - carb::memory::PooledAllocatorbehaves correctly if the underlying allocator throws during- allocate().
- OM-43254: Resolved and issue with carb.dictionary.plugin where a - std::bad_allocexception could be raised during operations that could create a new- dictionary::Item. This is now considered a fatal condition instead of allowing an exception to cross the ABI boundary.
- OM-43898: Thread safety improvements to fix a rare crash and a few other issues in carb.audio. 
117.0
Added
- CC-298: - omni::stringnow supports- printf-style formatting through additional constructors and functions:- assign_printf,- append_printf,- insert_printfand- replace_printf.- _vprintfversions of these functions also exist that accept a- va_list.
- CC-253: Adds overloads to - omni::stringfor- std::string,- carb::cpp17::string_view, and- std::string_view. These additional overloads make it easier to use- omni::stringwith- std::string.
- CC-274: Implemented - carb::container::IntrusiveUnorderedMultimap. See the documentation for more details and example usage.
- CC-193: Adds - CARB_TOOLCHAIN_CLANGdefinition to be- 1when a Clang-infrastructure tool is running (- 0otherwise).
Changed
- CC-266: Both the omni.bind and omni.structuredlog tools now support the - --fail-on-writeoption that causes them to fail their operation if a change to a generated file needs to be written to disk. This is used in the CI build scripts to ensure that MRs that make changes to generated code always include the latest version. If the build fails due to this error, the solution is to run a local build first and commit any changed files. Changes to generated files can occur if the codegen tools in the Carbonite SDK (or- repo_formatsince the Carbonite codegen tools also use it for code formatting) are updated and produce different results from previous. This can occur any time the Carbonite SDK version is updated in the dependecies of another project.
- OM-43576: Removed the - MiniDumpWithDataSegsflag from the crash dumps on Windows. This skips adding the global data segments of each module to the crash dump which can make some debugging tasks more difficult. However, if needed that dump flag can be added back by using the ‘/crashreporter/dumpFlags=WithDataSegs’ setting. Removing this flag does have the benefit of significantly reducing the size of crash dump files, especially in projects that have a large number of loaded modules.
- CC-247: Warn, instead of fail, when a user asks for 0.x and we have an implementation 0.y (where y > x). Previously, we error out when x != y since according to semver 0.* versions should not be considered to be backwards compatible (but they could be). Note that in 1.0 and higher there would be no change to how versions are checked. In that case, minor versions are always backwards compatible. 
Fixed
- CC-295: Fixed compilation errors in - omni::stringwhen exceptions are disabled.
- CC-303 / OM-43576: Now that - MiniDumpWithDataSegshas been removed from crash dumps,- RStringvalues cannot be resolved in minidumps. CC-303 resolves that by including additional debugging information for- RStringin crash dumps. Also establishes better testing practices for future- RStringversion changes.
- CC-306: Fixed a compiler error when using - operator+(carb::extras::Path, const char*)in the- omninamespace. That operator was ambigous following the additional- operator+overloads added by CC-253. Added additional- operator+overloads for- carb::extras::Pathto remove the ambiguity.
- OM-43783: Fixed an issue in - carb::cpp20::counting_semaphoreand- binary_semaphorewhere threads would busy wait.
- OM-43783: Fixed an issue in include/carb/Framework.h that would cause issues if - free()was- #define’d (i.e. for memory debugging).
- OM-43783: Cleaned up some Intellisense warnings in include/carb/cpp17/Variant.h 
- OM-43783: Fixed some ambiguous operator errors and namespace issues with include/omni/String.inl and include/carb/cpp17/StringView.h that could occur when building external projects. 
- OM-43783: Issues around - std::vsnprintf()that are worked around in include/carb/extras/StringSafe.h also now apply to- std::snprintf()as well.
- CC-193: Changes GNUC compiler-specific warning macros (those with names like - CARB_IGNOREWARNING_GNUC) to be available when- CARB_COMPILER_MSCis- 1and a Clang-infrastructure tool is being run (- CARB_TOOLCHAIN_CLANGis- 1). This now correctly suppresses GNUC-specific warnings being emitted on the Windows platform from Clang.
- OM-43819: Allowed the - omni.structuredlog.pluginmodule’s ‘shutdown’ flag to be cleared each time the plugin is reloaded, even if the previous unload didn’t actually remove it from memory. This prevents some crashes and potential loss of functionality on Linux when dlclose() silently leaves the library loaded.
- Reverted CC-5: Ability for crashreporter to upload files (attachments) to S3. The original change was causing issues on Linux related to the static linking of OpenSSL in carb.crashreporter-breakpad.plugin and conflicting with the static linking of OpenSSL in Python 3.7. A future Carbonite build will reinstate this functionality. 
116.0
Added
- CC-183: Added - std::stringand- carb::cpp17::string_viewoverloads to- IDictionary::makeAtPath().
- CC-82: Added optional support for zipping crash dump files before uploading them. The zip implementation supports 4+GB files and can process files without allocating memory at crash time. The zip files are typically ~10% the size of the original file in practice, so crash dump upload time should be greatly reduced once supported on the server side. 
- CC-252: Added DLL boundary safe - allocate,- deallocate, and- reallocatetop level functions to Carbonite. These functions all use an internal reallocation function within carb.dll/libcarb.so, making them safe to use from different modules.- carb::Framework::internalRealloc,- carb::Framework::allocate,- carb::Framework::free, and- carb::Framework::reallocateare now deprecated in favor of these new top level functions.
- CC-263: Added - IFileSystem::makeCanonicalPathEx2(). This version takes an extra- flagsparameter that allows some behaviour to be controlled. By default on Windows, this version assumes that the caller has already checked if the given file already exists. The- carb::filesystem::fCanonicalFlagCheckExistshas been added to get back the same behaviour as- IFileSystem::makeCanonicalPathEx().
- CC-244: Added a framework for simple geolocation to the telemetry transmitter. This will be used to allow the transmitter to exit itself early on startup if its current country matches a country code in a restricted regions list (specified in the ‘/telemetry/restrictedRegions’ setting). This is currently disabled due to the need for an account to use various geolocation APIs. This may be enabled at some point in the future. By default, the transmitter is allowed to run in all regions. 
- CC-246: Added - omni::detail::PointerIterator, a wrapper iterator for a possibly-cv-qualified- T*as a- Titerator class. It does not change the semantics from the fundamental logic of pointers. This is meant to be used on container types with contiguous storage (such as- vectorand- string), as returning a pointer directly from iterator functions (- begin()and- end()) would be inappropriate.
- CC-218: Added flags and settings to the telemetry transmitter to control the behaviour of how old events are processed if they are encountered in a telemetry log. 
- CC-8: Added - omni::string, an ABI safe replacement for- std::stringthat also offers DLL-Boundary safe allocation.
- CC-290: Added - carb::extras::getLibraryHandleFromFilename()to get a library handle without forcing a load (ie: only retrieve the handle if the library is already loaded in the process).
Changed
- CC-262: Improved some logging in the telemetry transmitter. It will now output the path to log directory it will be scanning and whether it is able to get a valid authentication token (if needed). 
- CC-281: Changed the way the omni.structuredlog.plugin plugin loads the privacy settings on startup. In addition to the previous method of loading the state into the ISettings dictionaries, it now also loads and caches the privacy settings state internally on plugin load. 
- CC-290: Added a - flagsparameter to- carb::extras::loadLibrary()to allow a module name to be constructed internally from a base filename instead of having to explicitly call- carb::extras::createLibraryNameForModule()first.
- CC-290: Changed - carb::extras::createLibraryNameForModule()to allow path components to also be included in the base library name instead of only supporting the base name itself.
Fixed
- OM-42834: Fixed an issue on x86-64 Linux where carb.windowing-glfw.plugin required libGLX but did not link against it, potentially causing crashes if libGLX.so was unloaded before it. 
- OM-28142: omni.bind now only updates copyright in .gen.h files if the code contents of the file change. 
- CC-266: omni.structuredlog now only updates the copyright year in .gen.h files if other code changes also occurred. 
- CC-268: carb.events now keeps subscriptions at a given - Orderin the same order as when they were registered.
- CC-278: Resolved an issue where carb.profiler-cpu.plugin could potentially access memory from a DLL/SO after it had been unloaded. 
- CC-279: Resolved a rare issue with carb.tasking where a task could be assigned to an emergency thread which wouldn’t execute the task and could leave the task in a stuck state. 
- CC-293: Fixed an issue where carb.tasking could crash shortly after unloading if emergency threads had been started. 
- CC-217: Evaluated and fixed several places that were incorrectly using - std::memory_order_relaxed.
- CC-292: Fixed an issue in carb.datasource-file.plugin where a crash could rarely occur when the plugin was shut down and unloaded. 
115.0
Changed
- CC-276: Instead of using getFileStat to determine the filesize of an opened file use fseek / ftell on linux and getFileSizeEx on windows. getFileStat retrieves costly information like the time converted to the local timezone which showed up in profilings. 
- CC-276: use DeleteFileEx to delete a file on Windows instead of ShFileOperationW for performance reasons. 
Added
- CC-222: ILauncher: Added - ILauncher::waitForStreamEnd()to wait for the- stdoutor- stderrstreams from a child process to end completely before doing other operations on the process handle. This allows a caller to ensure all the data from the child process has been received before destroying the process handle or waiting for the child process to exit. Since the reads from these streams happen asynchronously, it was not previously possible to ensure all data had been received without waiting for a fixed period of time after the child process exits.
- CC-222: ILauncher: added a single extra read callback call for - stdoutor- stderrstreams when the stream ends. The end of the stream is signalled by delivering a callback with a zero byte count.
- CC-248: Exposed all of the minidump ‘type’ flags to the settings under - /crashreporter/dumpFlags. These can either be specified as a single hex value for all the flags to use (assuming the user knows what they are doing), or with- MiniDump*flag names separated by comma (‘,’), colon (‘:’), bar (‘|’), or whitespace. There should be no whitespace between flags when specified on the command line. The ‘MiniDump’ prefix on each flag name may be omitted if desired. This defaults to an empty string (ie: no extra flags). The flags specified here may either override the default flags or be added to them depending on the value of- /crashreporter/overrideDefaultDumpFlags. This option is ignored on Linux.
Changed
- CC-222: ILauncher: documented some behavior on Linux where destroying a process handle before the child process exits could result in the child process terminating. This occurs if a read callback has been registered for the child process, then the child process tries to write to the stream (ie: - stdoutor- stderr) after the parent process has destroyed the handle. This occurs because the Linux kernel’s default behavior on trying to write to a broken pipe or socket is to raise a SIGPIPE signal. This cannot be worked around in a general case without the child process knowing to ignore SIGPIPE.
Fixed
- CC-220: Fixed a crash that could occur in carb.dll on Windows in - carb::filesystem::FileSystemWatcherWindows, especially when watching paths that were mapped to network shares.
- CC-5: Added ability for crashreporter to upload files (attachments) to S3. By default the - .dmpand- .dmp.tomlare uploaded, but other files can be specified in the settings (either statically in config file or dynamically via the settings interface). By default only internal NVIDIA crashes are uploaded to carb-telemetry bucket. A future update will include a web interface and backtrace.io link to the data.
- CC-242: Fixed a issue on Windows that would cause DLLs to fail to load if their pathname exceeded 260 characters. 
114.0
Added
- Functions for string trimming 
- overwriteOriginalWithArrayHandlingfunction in- DictionaryUtils.hthat handles overwriting of arrays during dictionary merge
- CC-192: Added the - /audio/nullDeviceCountsetting to allow the number of null audio devices to be configured for testing purposes.
- CC-192: Added the - /audio/nullBackendIsFunctionalsetting to allow the null backend to simulate broken audio devices for testing purposes.
- Some additional flags were added to - carb::extras::SharedMemory.
- A - carb::extras::SharedMemory::open()overload was added to support opening an existing region by name.
- carb::this_process::getId()and- carb::this_process::getIdCached()were added to carb/process/Util.h;- carb::this_thread::getProcessId()and- carb::this_thread::getProcessIdCached()are now deprecated.
- carb::this_process::getUniqueId()was added to generate a process-specific unique ID for the uptime of the machine since PID can be reused.
- carb::memory::testReadable()was added to carb/memory/Util.h to test if a memory word can be read from an address without crashing.
- CC-182: - carb::Frameworknow has memory management functions that enable cross-plugin memory blocks:- allocate,- freeand- reallocate. Memory allocated with these functions by one plugin can be passed to and freed by a different plugin or the executable.
- CC-185: Added task debugging functions to carb.tasking.plugin: - ITasking::getTaskDebugInfo()and- ITasking::walkTaskDebugInfo(). These functions allow retrieving runtime debug information about tasks.
- CC-235: The carb.assets.plugin system will now provide more debug information about orphaned assets when asset types are unregistered and the system is shut down. 
Changed
- CC-190: Allowed the - /telemetry/schemasUrlsetting to be treated as either an array of URL strings or just a single URL string. If multiple URLs are provided, they will be tried in order until a schemas package successfully downloads. This allows for a way for the ‘backup’ URLs to be provided for the telemetry transmitter.
- carb::extras::CmdLineParser now trims whitespace character for keys and values 
- OM-34980: Helper functions for processing command line arguments handle array and JSON values 
- CC-192: carb.audio previously had two - nullaudio backends that could be chosen in different configurations (there was no obvious way to do this). Only one of these- nullbackends should be possible to use anymore. Audio devices under the- nullbackend may appear to have changed as a result of this.
- CC-192: - IAudioPlayback::setOutput()now checks for invalid flags, so it will now fail if non-zero flags are passed in which contain neither of- fOutputFlagDeviceor- fOutputFlagStreamer.
- How - carb::extras::SharedMemory::createOrOpen()uses the- sizeparameter when opening an existing shared memory region has changed to be safer. On Linux the shared memory region grows to accommodate a larger size; on Windows growth is not supported, so requesting a larger size will fail. Previously the- sizeparameter was ignored which could lead to invalid memory accesses.
- On Linux, a global semaphore named - /carbonite-sharedmemoryis used to synchronize the- carb::extras::SharedMemorysystem across multiple processes. If a process crashed or was killed with this semaphore acquired, all apps that use- carb::extras::SharedMemory(or derivative systems, such as- RStringand carb.dictionary) would hang when attempting to acquire the semaphore. Now, a warning log (or print to- stderr) is emitted after 5 seconds of waiting on the semaphore.
- CC-58: Previously, - Framework::unloadAllPlugins()would terminate all plugins (calling- carbOnPluginShutdown) and then on a subsequent pass unload the plugin (call- FreeLibrary()or- dlclose()). Now, the plugin is unloaded immediately after termination.
Fixed
- Replaced usage of - kUpdateItemOverwriteOriginalwith- overwriteOriginalWithArrayHandlingin code that handles configuration processing
- CC-192: Capture devices capabilities queried through - IAudioDevice::getDeviceCaps()and- IAudioCapture::getDeviceCaps()will now report- fDeviceFlagConnectedon working devices.
- CC-192: Audio device capabilities queried through - IAudioDevice::getDeviceNamewill no longer report- fDeviceFlagConnected, since that function does not test for device connectivity/functionality.
- CC-192: When using the - nullaudio device backend on Linux,- IAudioPlaybackand- IAudioDevicein some configurations could report different playback devices. This should no longer occur.
- CC-181: On Linux, shared memory regions used for - carb::RStringcould be left over from an incomplete previous run of a Carbonite application, causing crashes when RString was initialized. This has been fixed in a backwards-compatible way so that the application validates the shared memory.
- Fixed an issue with - extras::isTestEnvironment()leaking module references on Linux.
- Fixed an issue with - IFileSystem::getExecutablePath()and- IFileSystem::getExecutableDirectoryPath()not initializing in a thread-safe manner.
- Fixed an incorrect error message that was reported when using - ILauncheron Windows.
- CC-227: omni.structuredlog timestamp checking has been fixed, so it won’t regenerate files during every build. 
- CC-213: Fixed carb.audio returning - AudioResult::eInvalidParameterand- AudioResult::eDeviceDisconnectedwhen- AudioResult::eDeviceLostshould have been returned.
113.0
Fixed
- BREAKING CHANGE: - carb::Format::B5_G6_R5_UNROMspelling was corrected to- carb::Format::B5_G6_R5_UNORM.
- CC-1: - carb::RStringKeyand- carb::RStringUKeynow satisfy- std::is_standard_layout<>in order to conform to better ABI safety. The binary layout of these classes did not change and are therefore backwards compatible with older Carbonite binaries.
- CC-184: Fixed an issue where running a Carbonite executable as root on Linux could potentially cause other Carbonite executables by other users to crash on startup when either the - SharedMemoryor- RStringsystems were in use.
- Fixed a shared memory leak on Linux when the - RStringsystem was in use and shutdown occurred with- carb::quickReleaseFrameworkAndTerminate().
- OM-39751: - IAudioCapture::getSoundFormat()will no longer report its format as- eDefaultand it will also no longer report a channel mask of 0.
- CC-164: Fixed an issue where - carb::profiler::ProfileEventobjects within a frame provided by- carb::profiler::IProfileMonitorwould not be sorted correctly.
- CC-219: fixed - IAudioPlaybackleaking- Streamerobjects when the- Contextis destroyed.
Added
- Documentation for our release and versioning process, docs/Releasing.html|rst 
- Implemented - carb::cpp20::bit_castand- carb::cpp20::endianin include/carb/cpp20/Bit.h.
- carb/tasking/TaskingHelpers.h now contains additional macros such as - CARB_ASYNCand- CARB_MAYBE_ASYNCto signal that a function is called from a task. Macros such as- CARB_ASSERT_ASYNCto assert that a function is running in task context.
- OM-41046: added - waitForClose()to- carb::audio::OutputStreamer, so that it is possible to verify when the output file is no longer being written to when you disconnect the streamer via- IAudioPlayback::setOutput().
- OM-41046: exposed - fOutputFlagAllowNoStreamersin- IAudioPlaybackto allow clients to easily have an audio context with no underlying audio device. This is mainly intended to simplify testing.
- CC-176: Added support for fixed length string buffers in structs to - omni.bind.
- Implemented carb.simplegui.plugin, a wrapper around Dear ImGui with a built-in Vulkan raster renderer that significantly simplifies the work required to get a usable GUI for example projects. This also removes Carbonite’s dependency on the carb_gfx_plugins. 
- OM-39664: Added the - omni::platforminfo::IDisplayInfointerface to use to collect information on all the attached displays in the system and their supported display modes.
Changed
- carb::dictionary::getStringArray()now has its parameters marked as- const.
- CC-163: Changed the - omni.structuredlogtool so that it only writes the output files if they have changed versus the code that has been generated or the output file doesn’t exist yet. If the file already exists and is identical to the generated code, the output will just be ignored. This is to avoid having to touch timestamps for unmodified generated files and to avoid the possibility of a write permission error if another project with a missing dependency is currently reading from the generated file.
- OM-39751: add - /audio/maxDefaultChannelsto limit the number of audio channels that are used when opening an audio device with a default speaker mode. This was an issue when opening the “null” device in ALSA which reported the maximum possible number of audio channels. Opening an- IAudioPlaybackcontext with more than 16 channels requires some additional setup, so this should not be automatic.
- OM-35496: added some extra omni.structuredlog bindings to python. As a result, omni.structuredlog now ships an - __init__.pyand a binary instead of only shipping a binary.
- CC-23: Applicable carb.tasking.plugin settings are now dynamic and will be reloaded automatically when they change. 
112.53 @joshuakr
Changed
carb.profiler-cpu.plugin Improvements
- The - IProfilerinterface now supports Instant events via macro- CARB_PROFILE_EVENT(). Instant events are drawn on the timeline with zero duration. Instant events may not be supported by profilers other than profiler-cpu.
- The - IProfilerinterface now supports Flow events via macros- CARB_PROFILE_FLOW_BEGIN()and- CARB_PROFILE_FLOW_END(). Flow events draw as an arrow between two zones and can begin and end in different threads. Flow events may not be supported by profilers other than profiler-cpu.
- When using carb.tasking.plugin and profiler-cpu, an Instant event is automatically emitted when a task is queued. A Flow event is automatically drawn from where the task was queued to when the task begins executing. When the setting key /plugins/carb.profiler-cpu.plugin/fibersAsThreads is - false, Flow events are automatically drawn to connect all zones executing the task as they move between various task threads.
- For profiler zones, the Category field is now automatically set to the name of the library containing the zone. 
- The resulting (possibly compressed) json output from carb.profiler-cpu.plugin is more compact. 
- The “begin” event (via - CARB_PROFILE_BEGIN()or- CARB_PROFILE_ZONE()) is now slightly faster.
- The “frame complete” event (via - CARB_PROFILE_FRAME()) is now slightly faster.
- Fixed a few possible crashes that could occur if a library had been unloaded when unprocessed profile events referenced it. 
112.52 @jshentu
Added
- OM-40643: Added - createCursorto- IWindowing. Allowing supplying custom image and use it as cursor shape.
112.51 @cdannemiller
Changed
- Removed trailing new lines from all CARB_LOG messages as Carbonite will automatically add this newline to each log. 
112.50 @jroback
Added
- OM-36988: Added carb::extras::Uuid, UUIDv4 class for UUIDv4 unique identifiers 
112.49 @jfeather
Fixed
- OM-39751: removed an optimization for an edge case in carb.audio-forge that prevented certain callbacks from being sent. 
112.48 @saxonp
Added
- OM-22490: Include the deps folder in the Carbonite Package 
112.47 @evanbeurden
Fixed
- OM-40193: Deferred creation of the standard logger log file until a message is actually written to it. This was to fix the behaviour of a log file being truncated by a secondary concurrent launch of an app trying to write to the same log file even if the new process did not write any log messages. 
- OM-40193: Fixed the behaviour of - carb::logging::StandardLogger::setFileConfiguration()in the case of disabling logging to file when the log file has not been opened yet. Previously the log filename was not being cleared as documented.
- OM-40193: Allowed - carb::filesystem::IFileSystem::closeFile()to fail gracefully if passed- nullptr. This makes the function more friendly to use and makes its behaviour match expected common OS level behaviour for similar functions such as- fclose()and- CloseHandle().
- OM-40193: Enabled much more of the - omni.telemetry.transmitterapp’s logging by default. This allows it to leave a log file that can be reliably used for post mortem analysis of its behaviour.
- OM-40193: Updated the OpenSSL version used in the - omni.telemetry.transmitterapp to fix some issues under CentOS7.
112.46 @hfannar
112.45 @evanbeurden / @joshuakr
Fixed
- OM-40256: Fixed a potential race condition calling the IEventListener::onEvent() functions for subscribers to an event stream. It was previously possible to have the subscription removed at the same time the object was being used to call the onEvent() function. 
- OM-40212: Fixed an issue where serialized events sent from different threads could be received out-of-order despite the serialization. Added documentation for carb.events. 
112.44 @joshuakr
Added
- OM-39253: For - carb::profiler::IProfiler,- CARB_PROFILE_BEGIN()now returns a value that can be passed to- CARB_PROFILE_END()for validation.
- OM-33647: carb.profiler-cpu.plugin now outputs source information if available. This can be disabled with setting: /plugins/carb.profiler-cpu.plugin/recordSourceInfo (default: true). 
- Documentation for header files in include/carb/profiler/. 
Fixed
- OM-40102: Fixed a carb.tasking issue where a timed-wait could cause - ITasking::suspendTask()to not work correctly.
112.43 @jfeather
Fixed
- OM-40135: Converting bytes to frames with a variable-bitrate format in the audio utilities in AudioUtils.h will no longer result in a divide-by-zero. Note that this behavior is still an error. 
- OM-40135: setting - AudioImageDesc::lengthTypeto- UnitType::eBytesshould now function correctly instead of hitting a divide-by-zero.
- OM-40135: Fixed a bug where sounds would fail to encode due to libvorbis setting - bitrate_nominalto a negative number.
112.42 @evanbeurden
Added
- OM-39664: Added a concept of ‘volatile’ metadata to the crash reporter. These are metadata values that change frequently (ie: free RAM, frame rate, etc) that should only be collected in the event a crash does actually occur. 
- OM-39664: Added the ‘/crashreporter/debuggerAttachTimeoutMs’ config option to provide a wait period after a crash occurs where a debugger can attach before the crash upload and metadata processing actually occurs. 
- OM-39664: Added RAM, swap, and VM space information as metadata in the crash report. 
112.41
Fixed
- OM-40023: Add an error message when - remove()fails in- IFileSystem::removeFile()to match the Windows behavior.
112.40
Fixed
- OM-39974: Fixed a memory corruption crash that could occur when - IInput::clearActionMappingswas called in a multi-threaded environment.
112.39
Fixed
- Updated the following INFO log from carb.audio from - [carb.audio.context] the bus count would not be changed => exitingto- [carb.audio.context] the bus count would not be changed => nothing to do- Changed that message to VERBOSE as well. 
 
112.38
Fixed
- carb::audio::IAudioUtils::drawWaveform()will no longer encounter errors when the sound offset is specified in a unit other than frames.
112.37
Changed
Enable C++17 on codebase
- OM-34896: Enable C++17. By default Carbonite now compiles with C++17. Linux toolchains stay the same as before, MSVC has been moved to VS2019. All existing binaries remain 100% compatiable, including python bindings. Projects using Carbonite can continue using C++14. Carbonite remains backwards compatible with C++14. 
112.36
Fixed
- Fixed a bug in ILauncher on Linux where destroying a process handle could incorrectly close a file descriptor it didn’t own. 
112.35
Changed
Drastically improved performance of carb.profiler-cpu.plugin
- OM-33716: Change carb.profiler-cpu.plugin to use per-thread queues instead of a global ringbuffer. This greatly improved performance by reducing contention: about 99.5% faster in highly contended cases. 
- Switched to using Ryu and {fmt} for conversion of numeric values to string in the profiler for additional speed improvement. Adjusted compression settings so that a generated .gz profile is about 2% larger but much faster. 
- OM-39381: Fixed an issue where - CARB_PROFILE_FUNCTIONincorrectly generated the function name.
112.34
Fixed
- OM-39573: Fixed an issue where dictionary keys that ended with - _0could drop the- _0.
112.33
Fixed
- OM-38834: - IFileSystem::readFileLine()now consumes the line ending even if there is no room for it in the buffer provided. See the documentation for- IFileSystem::readFileLine()for more information.
Changes
- Keys for carb.dictionary.plugin now internally use - carb::RString. This has no effect on the plugin interface, ABI or API but should result in higher performance and less (transient and long-term) memory usage.
- Compile-breaking change: carb/rstring/RString.h has moved to carb/RString.h. 
112.32
Fixed
- Added better collection of the Windows product name string to include Windows Server versions in - omni::platforminfo::IOsInfo.
- Added support for retrieving page file information in - omni::platforminfo::IMemoryInfo.
- Added support for retrieving the system compositor vendor and version in - omni::platforminfo::IOsInfo.
112.31
Fixed
- OM-38790: Fixed memory corruption and invalid memory accesses that could occur in the - RStringsystem on Linux.
- Improved stability around - carb::extras::SharedMemoryand- carb.launcher.
Added
- Added a - CARB_RETRY_EINTRmacro for GCC on Linux to automatically retry operations when- EINTRis reported.
- All Carbonite python bindings are now built for Python 3.9 in addition to the previous platforms. 
112.30
Fixed
- Improved the retrieval of available physical RAM in - carb::extras::getPhysicalMemory().
112.29
Added
- Added the - omni.platforminfo.pluginplugin. This provides interfaces to access the CPU, memory, and OS information for the calling process.
- Added python bindings for the - omni.platforminfo.pluginplugin.
112.28
Fixed
Structured Logging:
- Fixed a thread race condition that could lead to a crash. 
112.27
Fixed
carb.scripting-python.plugin
- Using global context - getGlobalContext()no longer causes stack overflow.
Changed
carb.scripting-python.plugin
- Enabled UTF-8 mode for Python scripting by default. (https://www.python.org/dev/peps/pep-0540) It can be turned off with the - /plugins/carb.scripting-python.plugin/pythonFlags/Py_UTF8Modesetting.
112.26
Reverted
- The changes from 112.19 have been reverted pending further testing. 
112.25
Fixed
carb.input.plugin
- OM-37121: Allow - filterBufferedEvents()to be called multiple times before- distributeBufferedEvents()is called.
- Compile-breaking change: The - InputEventFilterFnnow returns a- FilterResultenum instead of- bool. Previous return values of- falseshould now return- FilterResult::eRetainand previous return values of- trueshould now return- FilterResult::eConsume.
Other
- carb::getCachedInterfacecan now take a template parameter to reference a specific plugin. If specified, the parameter must be a global const char array to have the requisite template linkage.
- Improved some error messages around - tryAcquireInterfacefailures.
112.24
Fixed
carb.assets.plugin
- OM-38102: The carb.assets system would consider successful but zero-byte loads from a datasource as failures. This is no longer the case: zero-byte successful loads are now treated as success and the asset will proceed with the loading process. 
- carb::assets::IBlobAssetnow supports- nullptr/zero-byte data and has been changed to version 1.0.
112.23
Changes
carb.crashreporter-breakpad.plugin
- OM-38102: Crashes now store metadata as a separate file alongside crashes, so if crash uploads must be deferred until a subsequent run, the proper metadata can be uploaded. 
- The uptime of the application (measured as time that carb.crashreporter-breakpad.plugin has been loaded) is now automatically included in the metadata as - UptimeSeconds.
- The UUID of the dump is now included in the metadata as - DumpId.
- Crash metadata is included in the human-readable text file that is produced alongside the crash dump. 
112.22
Changed
- fix carb.log_* python functions to provide more source info (file, line number, module etc) to the logging system. 
112.21
Fixed
- OM-37197: When carb.crashreporter-breakpad.plugin detects a crash and writes out the callstack in the .txt file, it now attempts to discern source file and line information (via - addr2line) and include it in the report.
- Resolved an erroneous log message “Failed to create or open a semaphore” that would be logged when using - RStringin multiple modules.
112.20
Removed
- Removed the - omni/extras/InterruptableSleep.hheader and related classes in favor of using- carb::cpp20::binary_semaphoredirectly instead.
112.19
Added (Reverted in 112.26)
- Functions for string trimming 
- OM-34980: Helper functions for processing command line arguments handle array and JSON values 
Changed (Reverted in 112.26)
- carb::extras::CmdLineParser now trims whitespace character for keys and values 
112.18
Fixed
- OM-37431: Fixed an internal carb.tasking assumption that could lead to - CARB_CHECKviolations.
- OM-37902: Fixed a race condition with certain timed waits that could lead to asserts and test failures. 
112.17
Fixed
- OM-37870: Fixed an issue that was causing - carb::tasking::Futurereturned from- ITasking::addTask(and variants) to be signaled before a task was complete, causing spurious test failures. Added documentation.
112.16
Added
- Added the omni.telemetry.transmitter tool to its own package that is published with the other Carbonite packages. This was done for easier deployment of the tool in non-Carbonite projects that want to use it. 
112.15
Added
- OM-31214: Added a function - carb::quickReleaseFrameworkAndTerminate()which will attempt to shutdown all plugins, flush- stdoutand- stderr, and terminate the app via- TerminateProcess()on Windows or- _exit()on Linux.
Fixed
- carb.memory has been disabled by default for Debug builds (it was already disabled by default for Release builds) as it could cause shutdown crashes. 
- On Windows, if - main()exits and the Carbonite framework has not been shut down, the framework now attempts to shut itself down before all threads are terminated.
- A workaround was implemented when using carb.tasking with ASan and UBSan: false errors could previously be reported due to fiber stack memory being reused. If ASan is detected, the memory for thread stacks is now - mmap’d to- PROT_NONEinstead of unmapped, leaving the address space non-reusable but preventing the errors.
112.14
Fixed
- OM-37286: Fixed possible UB with - carb::tasking::Trackersstoring an- initializer_list.
- Fixed a compile issue with include/carb/assets/IAssets.h on GCC 10. 
112.13
Fixed
- OM-34654: carb.dictionary.serializer-json could not handle serializing or parsing float values such as - infor- nan, which could cause corrupted JSON files from failed serialization. This has been fixed to serialize those values as strings so they can be serialized/deserialized properly.
112.12
Changed
- carb.crashreporter is now enabled by default on Linux. 
112.11
Changed
- Changed carb.crashreporter-breakpad to determine the absolute path of the crash dump directory during configuration rather than in the crash handling code path to prevent possible errors while crashing. 
112.10
Changed
- Changed command line setting parsing to also parse hexadecimal and octal values. 
112.9
Fixed
- Changed command line setting parsing to also parse hexadecimal and octal values. 
112.8
Fixed
- Made the handling of finding the system temp directory more robust on Linux and improved some error messages from - carb::filesystem::IFileSystem::makeTempDirectory().
112.7
Fixed
- Command line settings are now parsed as 64 bit integers and doubles, rather than 32 bit integers and floats. This prevents clamping of values larger than the maximum values of 32 bit integers or floats. 
112.6
Changed
- Changed carb.crashreporter-breakpad to print the absolute path of the crash dump file. 
112.5
Changed
- carb.crashreporter is now disabled by default on Linux. 
112.4
Changed
- Added a - omni::core::ImplementsCastthat only implements the- cast_abifunction.
112.3
Fixed
CrashReporter-Breakpad changes
- OM-34471: Reduced the amount of redundant Verbose log output. 
- OM-36335: Asynchronous uploading of crash dumps was holding a mutex that could block the main thread. This mutex is no longer held while the upload is pending, allowing the main thread to proceed. 
112.2
112.2
- Changed the code generator for structured logging to use - repo_format.
112.1
Fixed
- Resolved an issue with counted - RStringobjects from 112.0 where the length was not always taken into account.
112.0
Changed
RString changes
- RStringAPI has a minor change:- isNone()is replaced by- isEmpty(), and default-constructed- RStringwill refer to an empty string (- c_str()returns “”). Similarly,- eRString::RS_Noneis replaced by- eRString::Empty.
- RStringand variant classes now have constructors that accept a counted string (length provided) and a- std::string.
- As such, - RStringnow supports strings with embedded NUL (‘\0’) characters.
CrashReporter-Breakpad changes
- Windows minidumps now include data segment information (global variables). 
- RStringdata is included in Windows minidumps.
- Settings key - /crashreporter/preserveDump(default: false) can be used to have a dump file remain even after it has been uploaded to the server.
- Several log messages when writing a crash dump and uploading were changed from Verbose to Warn to be more visible. 
Fixed
- On Linux, processes launched via - ILauncherwith- fLaunchFlagNoStdOutand/or- fLaunchFlagNoStdErrwould close the file handles for- stdoutand- stderr, allowing them to be reused. This could lead to undefined behavior.
111.21
Added
- Added - BitScanForward,- BitScanReverse, and- PopCountfunctions to- carb::math
111.20
- Optimized read access of the IDictionary interface. 
Fixed
Changed
- OM-36102: carb.crashreporter-breakpad prints crash dump file location at error level when crash occurs. 
111.18
Fixed
- omni::core::cast would not compile if used with - IObjectand the Implementation uses multiple inheritance.
- Added a unit test for the above. 
111.17
Fixed
- OM-13024 and OM-25736: Interfaces (that may be non-trivial) were always memcpy’d when instantiated. Now, by means of a new plugin function - carbOnPluginRegisterEx2(automatically generated by- CARB_PLUGIN_IMPL), the plugin interfaces are now constructed in place without memcpy. This requires the plugin to be recompiled against Carbonite 111.17. The Carbonite Framework version did not change and remains version 0.5. Any plugins compiled against Carbonite Framework 0.5 will continue to work (but will perform the memcpy which is unsafe if the Interface struct is not trivial), and Carbonite Framework 0.5 from Carbonite 111.16 and previous will continue to load newer plugins.
111.16
Fixed
- OM-34946: C++17 compile error with pybind11 and BindingsPythonUtils.h 
111.15
Fixed
- OM-35664: Fixed an issue with plugin unload ordering where dependencies could be unloaded to early. This was rare and generally affected plugins which had a stated dependency in - CARB_PLUGIN_IMPL_DEPSbut did not acquire the dependency until- carbOnPluginShutdown()was called.
111.14
Fixed
- OM-35375: It was possible for some - ISettingssetter functions such as- setStringto call callbacks while an internal lock was held. This could lead to some deadlock situations if another thread was querying the settings.
111.13
Fixed
- Renamed tempalte vars in - TypeTraits.hto avoid conflicting with termios.h
Changed
- Moved the telemetry transmitter helper functions in - include/omni/structuredlog/Telemetry.hfrom the- omni::structuredlognamespace to- omni::telemetry.
- Implied ‘test’ mode in the telemetry transmitter when the - /telemetry/schemaFileor- /telemetry/schemasDirectoryoptions are used.
111.12
Fixed
- Fixed the - omni.structuredlogtool to only disable MSVC’s ‘fast up-to-date’ check for projects that make use of the tool. Projects that do not use the tool will still skip the build check if they are up to date.
Changed
- omni::structuredlog::launchTransmitter()will now automatically pass a number of settings from the host process to the child process, so that launching the transmitter is easier.
111.11
Changed
- Updated to repo_format 0.6.4 
111.10
Fixed
- Fixed an issue with carb.profiler-tracy.plugin where throwing a C++ exception could cause issues after the plugin was unloaded. 
Added
- Added a helper function to - carb::launcher::ArgCollectorto collect all the settings in a given branch and add them as arguments that can be passed to a child process.
111.9
Changed
- Upgraded to repo_format 0.6.0 and ran latest repo_format on all code. This results in a large change to copyright ranges in the header of source files only. 
111.8
Changed
- Added support for memory profiling to carb.profiler-tracy.plugin. 
111.7
Fixed
- Fixed potential memory corruption that could occur within carb.tasking, especially with - ITasking::applyRange().
Changed
- omni.telemetry.transmitter requires - --/telemetry/allowRoot=trueto be able to run as root. This was done to prevent users from running the transmitter with- sudoand causing permission issues with the lock files.
111.6
Fixed
Shutdown/unload improvements
- Change 110.0 introduced a tweak to unload ordering that would attempt to discover “implicit dependencies” by plugins acquiring interfaces through - tryAcquireInterface. There were issues with this implementation and it was disabled in version 111.3.
- A corrected unload order is now present in Carbonite. If plugin Foo acquires an interface from plugin Bar, Foo must now be unloaded before Bar. The exception to this rule is a circular reference, in which case unload order is the reverse of the load order. 
Added
- Added documentation for the various structured log settings to the Telemetry Overview docs. 
- Added documentation for the various telemetry transmitter settings to the Telemetry Overview docs. 
- Added - /structuredlog/logDirectoryto allow the output directory of structured logging to be specified by Settings.
111.5
Added
Structured Log
- Documented the wildcard helper functions in - include/omni/str/Wildcard.h.
- Added settings keys to allow structured log schemas to be enabled or disabled from config files or command line. - The following new settings paths have been added to disable schemas and events. Each key under this path will enable or disable one or more schemas or events (wildcards are allowed): - /structuredLog/state/schemas: enable or disable zero or more schemas when they are first registered.
- /structuredLog/state/events: enable or disable zero or more events when they are first registered.
 
- The following new settings keys have been added to disable schemas and events. Each of these keys is expected to be an array of strings indicating the schema or event name and its enable or disable state: - /structuredLog/schemaStates: enables or disables zero or more matching schemas when they are first registered.
- /structuredLog/eventStates: enables or disables zero or more matching events when they are first registered.
 
- For more information, see - include/omni/structuredlog/StructuredLogSettingsUtils.hor consult the generated documentation package.
- Added - /structuredlog/logDirectoryto allow the output directory of structured logging to be specified by Settings.
 
Utilities
- Added - carb::this_thread::getProcessId()and- carb::this_thread::getProcessIdCached()to wrap the platform-specfic code needed to get a process ID.
111.4
Fixed
- Fixed a hang that could occur rarely with - carb::getCachedInterface<>on the AArch64 platform.
111.3
Changed
- The “Improvements to Carbonite Shutdown” from version 110.0 have been revoked pending review. An issue was discovered that would cause improper plugin unload order on shutdown. 
111.2
Added
String-interning (registered fast-comparison strings)
- A registered string class - RStringhas been added in carb/rstring/RString.h.
- The - RStringclass is case-sensitive, but has companion class- RStringUthat is “un-cased” (i.e. case-insensitive).
- The - RStringand variant classes can be (in)equality checked in O(1), and non-lexicographically sorted in O(1) time.
- All registered strings are shared within an application’s memory space across multiple modules and can be used prior to - main()without needing to instantiate the Carbonite framework.
- Carbonite registered strings are similar to Unreal’s - FName,- boost::flyweight<std::string>and USD’s- TfToken.
111.1
Added
- /telemetry/schemasDirectoryand- /telemetry/schemaFilehas been added to omni.telemetry.transmitter. This will allow debug builds to load their telemetry schemas from disk instead of requiring a HTTP download.
- /telemetry/authenticationhas also been added to the transmitter to allow test cases where authentication can’t be used.
Fixed
- Fixed a shutdown crash that could occur if a cached interface was destroyed after the Carbonite framework has been unloaded. 
111.0
Removed
- Removed unused, untested lua bindings. 
110.1
Fixed
- Fixed an issue with carb.scripting-python.plugin where - IScripting::executeScript()and- IScripting::executeScriptWithArgs()would crash if the script had incorrect Python grammar.
110.0
Changed
Improvements to Carbonite Shutdown
- If a plugin creates a dependency with - tryAcquireInterface(), that dependency could be unloaded before the plugin is unloaded, leading to potential crashes at shutdown. Now such a dependency is taken into account during plugin unloading so that plugins are unloaded before their dependencies.
- The - getCachedInterface()helper function no longer tries to re-acquire the interface if the interface has been released. The- resetCachedInterface()function will evict the cached interface and reset so that the next call to- getCachedInterface()will attempt to re-acquire the interface. Releasing the entire framework however does reset the cached state so that it can be re-acquired.
- Cached interfaces are now evicted immediately prior to calling - carbOnPluginShutdownfor a plugin. This causes- getCachedInterface()to return- nullptrinstead of an interface that is in the process of destructing.
109.0
Changed
- carb::extra::EnvironmentVariableis now RAII class.
108.14
Added
- IAudioDevice::getBackend()has been added to allow users to check which audio backend they’re running under to make specific decisions based on which audio system is running. This is mainly intended to be used to detect if ALSA is in use, which makes some operations (such as device enumeration) costly.
108.13
Changed
- omni.telemetry.transmitter switched from environment variables to ISettings. This allows users to configure omni.telemetry.transmitter with the config.toml file or via command line arguments. - OMNI_TELEMETRY_ENDPOINThas been replaced with- /telemetry/endpoint.- OMNI_TELEMETRY_SCHEMAS_URLhas been replaced with- /telemetry/schemasUrl.
108.12
Changed
- omni.telemetry.transmitter no longer uses python. 
- omni::structuredlog::launchTransmitter()has had the arguments for its python environment removed.
108.11
Changed
- The carb.tasking.plugin heuristic that guides - carb::tasking::ITasking::applyRangehas been adjusted to allow for more parallelism, especially with fewer than 512 items.
108.10
Fixed
- Callstacks reported by carb.crashreporter-breakpad.plugin during crash time now include offsets next to the function names in order to be more accurate. 
108.9
Changed
- carb.profiler-cpu is now statically linked to zlib on Linux. This was the existing behavior on windows. 
- Public include files should now build cleanly with /W4 warning level on MSVC and -Wall on GCC. 
Added
carb.tasking.plugin Additions
- If the /plugins/carb.tasking.plugin/debugTaskBacktrace key is true and a task enters the Waiting state, the backtrace is now captured and stored at - carb::tasking::TaskBundle::m_backtracefor a given task. The entire database of tasks is available at- carb.tasking.plugin.dll!carb::tasking::Scheduler::s_scheduler->m_taskHandleDband can be added to the watch window.
- carb::tasking::ScopedTrackingnow exists to be able to start and end tracking on- carb::tasking::Trackerswithout having to add a dummy task (OM-33470).
108.8
Fixed
- Fixed the - omni.structuredlogtool when it is called using an external project (ie: outside of Carbonite). Previously this script would generate prebuild commands that would not work properly under MSVC. They would however build correctly when run through- build.{bat|sh}. This tool has now been fixed to write out a full build script for MSVC prebuild commands and write out a similar set of commands for use on Linux.
108.7
Changed
carb.tasking.plugin Changes:
- An optimization where a task that waits on another task may attempt to execute the dependent task immediately, regardless of priority. 
- Dependency helper classes - carb::tasking::Anyand- carb::tasking::Allcan now take iterators as input.
- Fixed a small rare memory leak at shutdown. 
108.6
Added
Additional features for carb.tasking.plugin
- “Task Storage” has now been exposed in the - ITaskinginterface (similar to thread-local storage, but for tasks).
- Full support for - Promiseand- Futuretypes.
- Added support for specifying multiple schemas to be built in a single project. Multiple schemas may now be specified as an array in a single call to - omni_structuredlog_schema(). A single schema to be built may still be specified by passing an object containing the parameters instead of a full array.
108.5
Added
- Added support for anonymized and pseudonymized events in the telemetry transmitter. 
Fixed
- Fixed some structured log schemas that don’t always rebuild properly under MSVC. This was caused by a limitation of MSVC projects generated under premake. This problem didn’t exist on Linux. 
108.4
Changed
- Class names in generated structured log headers have changed to include the version in their name. This will require changes in structured log calls that use enum types or object types and code that uses generated structured log python bindings. 
Fixed
- The - OMNI_FORCE_SYMBOL_LINKmacro now correctly evaluates, so redefinition errors should no longer occur.
- It should now be possible to include multiple versions of a structured log schema without encountering build errors. 
108.3
Fixed
- Added a more helpful error message when setup_omni_structuredlog() isn’t called in a premake script that uses omni_structuredlog_schema(). 
108.2
Changed
- Added - isWindowFloatingand- setWindowFloatingto- carb::windowing::IWindowing, and implemented them for carb.windowing-glfw.plugin.
108.1
Changed
- Upgraded to the newest version of repo_format, which includes clang-format v12. 
- Removed the –clang-format and –clang-format-style options from the omni.bind python script, these are replaced with –format-module, which gives the user more flexibility in choose how and if they want to format the code. 
Breaking Changes
- Users are required to upgrade to repo_format 0.5.4 or later. 
108.0
Changed
- `ILogMessageConsumer_abi::onMessage_abi()`` had its prototype changed to add the TID, PID and timestamp, so that this data will be available when using asynchronous logging. 
107.3
Fixed
- Fixed a rare debug assert in ITasking. 
- Fixed an issue where a carb::tasking::Semaphore could assert on destruction. 
Changed
omni.structuredlog.lua has replaced the questionable carb_path global with
setup_omni_structuredlog() to specify the carbonite path.
107.2
Changed
IAssets
The IAssets interface has changed to better support ITasking and to deprecate carb::tasking::Counter.
- The - IAssets::loadAsset()functions no longer take a- Counterobject. Instead, they take a- carb::tasking::Trackerhelper object similar to the- ITasking::addTaskfunctions. This allows specifying multiple variant types of trackers to asset loading (including the now-deprecated- Counterobjects).
- The - IAssets::loadAssetExfunction is deprecated and directs the caller to use the safer- loadAssetwrapper functions.
- The - LoadAssetFnand- CreateContextFnno longer pass a- Counterand expect data to be returned rather than passed through an output argument. Since these functions are called from Task Context as a co-routine, they are free to use any of the fiber-safe waiting methods provided by- ITaskingto await other operations.
107.1
Fixed
Python uses static openssl again
107.0 inadvertently used a python package that had switched to dynamically linking libssl.so and libcrypto.so, so dependencies would encounter linking issues. 107.1 switches back to a python package that has these dependencies statically linked.
107.0
Changed
ITasking 2.0
The ITasking interface has undergone some extensive improvements that are (mostly) backwards-compatible with existing
code.
- The - Countertype is deprecated. The interface remains for the time being but will now produce deprecation warnings for manual- Countermanipulation. Instead,- TaskGroupis a more efficient means of grouping tasks together.
- The - Anyand- Allhelper objects for- RequiredObjectused by- ITasking::addSubTaskare now nestable.
- Tasks can now be canceled before they have started executing. See - ITasking::tryCancelTask().
- The - ITasking::addTaskInand- ITasking::addTaskAtfunctions now accept multiple tracker objects.
- The - ITaskingfunctions- yieldUntilCounterand- waitForTaskhave been combined into a generic- wait()function. The- wait()function can also use- Anyand- Allhelper objects.
- Unhandled exceptions thrown from a task will now treat the task as canceled. 
- A fiber-aware futex system has now been exposed to allow for generic waiting. 
- The - PinGuardand wrapper classes such as- CounterWrapperno longer need an- ITasking*pointer passed to them, nor do they cache the pointer. These classes now rely on the- carb::getCachedInterfacehelper function.
IAssets
The IAssets interface has changed to better support ITasking and to deprecate carb::tasking::Counter.
- The - IAssets::loadAsset()functions no longer take a- Counterobject. Instead, they take a- carb::tasking::Trackerhelper object similar to the- ITasking::addTaskfunctions. This allows specifying multiple variant types of trackers to asset loading (including the now-deprecated- Counterobjects).
- The - IAssets::loadAssetExfunction is deprecated and directs the caller to use the safer- loadAssetwrapper functions.
- The - LoadAssetFnand- CreateContextFnno longer pass a- Counterand expect data to be returned rather than passed through an output argument. Since these functions are called from Task Context as a co-routine, they are free to use any of the fiber-safe waiting methods provided by- ITaskingto await other operations.
HandleDatabase
- HandleDatabase has a new function - handleWasValid()to check if a handle was previously valid but has been released.
- Added an - addRef()function that accepts a valid- TrueType*.
106.7
Changed
- carb.crashreporter-breakpad.plugin was updated to use Google Breakpad chrome_90 release. 
106.6
Changed
- Renamed the - OmniCoreStartArgs::paddingmember to- OmniCoreStartArgs::flagsand added some flags to control the behavior of some of the built-in object overrides more explicitly. Specifically to allow for the- ILogand- IStructuredLogobjects to be able to be disabled without having to create a dummy stub implementation for each of them. This member was intentially unused before and did not change size so it should not cause any breakages from the name and usage change.
106.5
Changed
- Moved documentation related docs into repo_docs repo. 
106.4
Changed
- carb.scripting-python.plugin: - executeScript()and- executeScriptWithArgs()now do just-in-time script compilation when called for the first time. Previously the script was compiled each time the functions were called.
106.3
Fixed
- Fixed a crash that would occur in an app started from Python if carb.scripting-python.plugin was initialized but the GIL had been released by the calling thread. 
106.2
Fixed
- The carb.tasking plugin will now discard all pending tasks when released. Only the tasks currently running will be allowed to finish. Note that this will potentially cause leaks; if it is important to clean up rather than abandoning tasks, use a - carb::tasking::Counteror other means to ensure that all necessary tasks have completed before releasing carb.tasking.plugin.
106.1
Added
- Added - omniGetBuiltInWithoutAcquire()to carb.dll/libcarb.so which will become the new entry-point for accessing interfaces. The existing functions- omniGetLogWithoutAcquire(),- omniGetTypeFactoryWithoutAcquire()and- omniGetStructuredLogWithoutAcquire()are now deprecated and will be removed in a future version.
106.0
Broke
- Removed - ICachinginterface. The interface had no known usage in the wild.
Fixed
- Restored - omniGetTelemetryWithoutAcquirewhich was removed between 105.0 and 105.1.
105.2
Changes
Improvements to carb.tasking’s parallel_for()/applyRange()
The parallel_for() and applyRange() functions in ITasking should be seeing 5-10% improvement in certain situations.
Improvements to LocklessQueue and LocklessStack
The InputIterator-style push() functions on these containers now accept InputIterator types that dereference into
both T* and T& types to allow for different situations.
Fixed
- Using carb.tasking’s - applyRange()function should prevent stuck checking and fix the occasional “carb.tasking is likely stuck” messages.
- Fixed an issue that could sometimes cause a crash at shutdown in carb.profiler-cpu and carb.dictionary. 
105.1
Fixed
.pyd files that call OMNI_PYTHON_GLOBALS can now access carb::Framework from within the bindings.
105.0
Removed
The mirror tool dependency has been removed along with associated tests.
carb.windowing-glfw now only supports X11/GLX on Linux. The Wayland/EGL backend has been removed.
104.0
Broke
ITokens 0.1 -> 1.0
ITokens::calculateDestinationBufferSize now accepts a pointer to store an error code (ResolveResult) of the
calculation.  This is an ABI breaking change.
ITokens::calculateDestinationBufferSize and ITokens::resolveString now accept special flags (ResolveFlags) that allow to modify token resolutioin process.  This is an ABI breaking change.
All Interfaces Bumped to at least 1.0
- IObject0.1 -> 1.0
- IAssert0.2 -> 1.0
- IAssetsBlob0.1 -> 1.0
- IAudioCapture0.4 -> 1.0
- IAudioData0.6 -> 1.0
- IAudioDevice0.1 -> 1.0
- IAudioGroup0.1 -> 1.0
- IAudioPlayback0.5 -> 1.0
- IAudioUtils0.3 -> 1.0
- ICaching0.1 -> 1.0
- IDataSource0.3 -> 1.0
- IDictionary0.8 -> 1.0
- IEcs0.1 -> 1.0
- IEvents0.2 -> 1.0
- IFileSystem0.1 -> 1.0
- IMemoryTracker0.1 -> 1.0
- IProfileMonitor0.3 -> 1.0
- ISettings0.6 -> 1.0
- IFiberEvents0.1 -> 1.0
- IThreadPool0.1 -> 1.0
- IThreadUtil0.1 -> 1.0
- ITypeInfo0.1 -> 1.0
- IGLContext0.1 -> 1.0
This change was made to avoid potentially unnecessary breaking changes (due to semantic versionings 0 major rule) in the future.
103.1
Fixed
RingBuffer improvements
The carb/container/RingBuffer object had a problem with high contention. The RingBuffer now performs much better in a high-contention environment.
carb.profiler-cpu improvements
Because it was based on the RingBuffer, carb.profiler-cpu.plugin also suffered from debilitating performance problems that have been resolved with the RingBuffer improvements.
Resolved potential Linux hang in carb::thread::futex
The Futex system had a rare hang that could occur in certain situations where a wait() would not be woken by a notify()
due to a race condition. This also affected things using carb::cpp20::atomic<> which was based on
carb::thread::futex.
PooledAllocator no longer constrained by “buckets”
The template parameter for the number of “buckets” in use by the PooledAllocator has now been removed.
PooledAllocator will now happily allocate memory until the underlying allocator runs out of memory.
103.0
Fixed
getCachedInterface() now re-acquires when framework/plugin unloaded
If an interface is released (or the entire framework is released), carb::getCachedInterface() will now detect this and
attempt to re-acquire the interface (or return nullptr if it is no longer available). This fixes issues where plugins
may be often released and re-acquired.
NOTE: Do not use static when calling acquireInterface as this will not properly reset if the interface is released.
Instead, use carb::getCachedInterface().
NOTE: To streamline the adoption process, the Carbonite framework version was not modified. Two new functions were
added to carb::Framework. Since the framework version was not altered, it is possible for code built against the new
getCachedInterface() to load older versions of Carbonite without error, but this will result in a crash instead of a
failure to load the Carbonite framework. This edge case was deemed to be rare and the cost to alter the framework
version much higher than the benefit granted.
Added
Release Hooks for plugins and the framework
The Carbonite framework now has two new functions: addReleaseHook() and removeReleaseHook(). These function as sort
of atexit()-like behavior for the Carbonite framework based on an interface being released. If nullptr is specified
as the interface, then the Release Hook will be called back when the Carbonite framework itself is released.
102.15
Added
carb.tasking lock debugging
Since carb.tasking is a fiber-based tasking system, tasks that enter a waiting state and then wake can resume on any
thread (unless pinned with carb::tasking::PinGuard). Locks like std::mutex, std::recursive_mutex and
std::shared_mutex that are locked before waiting and unlocked after waking see this as a thread that doesn’t own the
lock attempting to release the lock. To discover these conditions, a config option has been added to carb.tasking:
/plugins/carb.tasking.plugin/debugLocks (default:false). When this option is enabled, having a task wait while holding
a mutex will result in an Error log and assert.
102.14
Fixed
IAssets potential OnChangeEvent call during/after unsubscribe
Fixes an issue with IAssets where an OnChangeEvent callback could be in progress during
unsubscribeToChangeEvents. The behavior now waits in the unsubscribe call for any callback in progress to finish. It
is now also possible to unsubscribe during the callback.
Added
carb::tasking::RecursiveMutexWrapper
carb::tasking::MutexWrapper will now abort if used recursively. If recursion is desired, use RecursiveMutexWrapper.
HandleDatabase::releaseIfLastRef
Added a function HandleDatabase::releaseIfLastRef which allows special functionality if-and-only-if a handle reference
is the last reference, atomically.
Changed
ITasking performance improvement
ITasking now benefits from a performance optimization for starting the next pending task immediately when a task
completes.
ISettings/IDictionary changes
- Retrieving an array via python bindings will keep the elements of the array as their proper types rather than collapse them to a common type. 
- ISettings::getPreferredArrayTypeand- IDictionary::getPreferredArrayTypenow use the first element as a baseline type to convert to, instead of trying to convert everything to- eBoolby default. This was causing an array of- [0.0, 0.0, 0.0]to convert to- [False, False, False]erroniously.
102.13
Fixed
IAssets delay reloading fix
Fixes two issues introduced with 102.11:
- IAssets::yieldForAssetLoadedcould spuriously wait if an asset reload was in progress.
- Unregistering an AssetType would wait for pending assets to reload, even if the reload delay was very long. Now asset reloads are abandoned immediately upon unregistering an AssetType. 
ITasking crash fix
Fixes a rare crash with use of carb::tasking::Any and carb::tasking::All in 102.10
102.12
Fixed
ITasking fix for “carb.tasking is likely stuck” during applyRange()
In long-running parallel tasks during applyRange() the carb.tasking stuck checking feature could determine that the
system is stuck even when it is not. Now applyRange() contributes to the heuristic which should reduce false positive
stuck warnings.
102.11
Changes
IAssets version 1.0
IAssets has been promoted to version 1.0 with a few additional changes. AssetTypeParams has been created as a
parameter for registerAssetType() to contain all of the configuration information for Asset Types; this struct should
start as AssetTypeParams::getDefault() and then any parameter changes can be made.
The AssetTypeParams struct has a new reloadDelayMs option (default=100 ms). For Asset Types that automatically
reload, this will wait for reloadDelayMs to elapse from the last datasource change notification in an effort to
prevent multiple reloads for multiple changes in rapid succession that can occur when an asset is being written to.
102.10
Changes
ITasking::addSubTask() and ITasking::addThrottledSubTask() support lists of required Counter objects
In some cases, it is desirable to wait until any or all of a group of Counter objects become complete in order to
start a sub-task. To that end, addSubTask() and addThrottledSubTask() now accept an initializer_list of Counters,
passed into helper objects carb::tasking::Any or carb::tasking::All, such as:
tasking->addSubTask(carb::tasking::All{ counter1, counter2 }, ...)
Which would wait until both counter1 and counter2 are complete before starting the sub-task. carb::tasking::Any
is specified similarly but waits until at least one of the passed Counters is complete.
ITasking::addTask() and variants support lists of notify Counter objects
In some cases, it is desirable for multiple Counter objects to be incremented before a task starts and decremented when
the task completes. Previously, only one Counter could be passed to addTask() variant functions and the other Counter
objects would need to be manually incremented/decremented. Now, addTask() variants (except for addTaskAt() and
addTaskIn()) will allow passing an initializer_list of Counters. Each of the non-nullptr Counter objects passed will
be incremented before the addTask() variant function returns and decremented upon task completion.
102.9
Added
New feature: CARB_STRONGTYPE
CARB_STRONGTYPE now exists in carb/Strong.h to declare a strong type. The using and typedef keywords do not
actually create a new type; they just create aliases for the type. CARB_STRONGTYPE declares a structure that acts like
the referenced type but is strongly typed and requires explicit assignment.
New feature: carb::delegate::Delegate
Delegate implements a std::function-like loose-coupling system but allows multiple bindings and thread-safe access.
Additionally, it attempts to be as safe as possible allowing bound callbacks to unbind themselves (or other callbacks)
safely when the callback is executing. See carb/delegate/Delegate.h for more information.
102.8
Fixed
Performance improved in ITasking::applyRange()
A degenerate case was identified that could cause ITasking::applyRange() to perform poorly under very short workloads.
This has been corrected. In some cases, small workloads may still perform more poorly than a straight for() loop due
to the overhead in dispatching tasks to other threads and subsequent cache performance. Performance testing uses of
applyRange() is advised.
Added
ITasking::parallelFor() implementation
ITasking::parallelFor() now exists as a wrapper for ITasking::applyRange(). These new funtions allow specifying the
classic parameters to for loops: begin, end and optional step values.
102.7
Changes
ITypeFactory now calls onModuleCanUnload and onModuleUnload
Previously, ~ITypeFactory would simply call dlclose/FreeLibrary to shutdown each loaded plugin.  This patch now
attempts to call each plugin’s onModuleCanUnload, and if it returns true, onModuleUnload is called followed by
dlclose/FreeLibrary.  If a plugin’s onModuleCanUnload returns false it may be called again after other plugins
are unloaded.  If onModuleUnload cannot be safely called, either because onModuleCanUnload returns false or it is
not defined, ~ITypeFactory will call dlclose/FreeLibrary on the loaded plugin.
This is new behavior and may expose bugs in previously existing onModuleCanUnload/onModuleUnload implementations.
102.6
Changes
Debugging mode for waiting tasks
ITasking now supports a new boolean setting: /plugins/carb.tasking.plugin/debugWaitingTasks (default=false). This
setting parks all waiting tasks in a dedicated thread so that they will show up in debuggers. For Visual Studio, the
Parallel Stacks and Threads windows will now have threads named “carb.task wait” and __WAITING_TASK__() will be in the
call stack. For GDB, the threads will appear with the name “carb.task wait” and will show up in the “info threads” list.
Note that this debugging feature can create hundreds of transient threads and may negatively affect performance, but
can be useful for debugging hangs.
Debugging mode for Task and Counter creation backtrace
ITasking now supports a new boolean setting: /plugins/carb.tasking.plugin/debugTaskBacktrace (default=false). This
setting will capture a backtrace when ITasking::addTask() is (or variants are) called. This backtrace is available to
view in the debugger as a local variable DebugTaskCreationCallstack in the carb::tasking::TaskBundle::execute
function whenever a task is being executed. Similarly, a backtrace will be captured for Counter objects created with
ITasking::createCounter and ITasking::createCounterWithTarget. This backtrace is available as a local variable in
the Counter::wait function called DebugCounterCreationCallstack. At carb.tasking.plugin shutdown time, the
creation backtrace of any leaked Counter objects is logged as a Warning.
102.5
Fixed
- Fixed a crash that could occur sometimes in carb.tasking.plugin 
102.4
Fixed
- Carbonite SDK + Plugins package no longer has licensing errors. 
102.3
Changes
ITasking will attempt to detect a “stuck” condition and attempt to get “unstuck”
It is possible to get ITasking into a situation where it is stuck: a task uniquely locks a resource and then waits in
a fiber-safe way. Other tasks attempt to lock the same resource but don’t wait in a fiber-safe way until all task
threads are blocked waiting on the resource. At this point ITasking is stuck because when the task that holds the lock
becomes ready to run, no threads are available to run it. The new emergency-unstick system will detect this and start
emergency threads to process ready tasks, attempting to un-stick the system.
The stuck-check time can be configured using ISettings key /plugins/carb.tasking.plugin/stuckCheckSeconds (default:
1; set to 0 to disable).
102.2
Fixed
IAssets::unregisterAssetType() now waits until all assets are actually unloaded
In prior versions, performing several IAssets::unloadAsset, IAssets::unloadAssets or IAssets::releaseSnapshot could
start unloading data in the background. A call to IAssets::unregisterAssetType after this point could potentially
destroy the asset type, but would not wait for the background unload tasks to complete. This could cause issues at shutdown
where other systems would shut down expecting that after unregistering the type that they would no longer be used. This
fix causes IAsset::unregisterAssetType to wait for any pending load/unloads to complete before returning.
Fixes an issue where IAssets could stop updating an asset
If an asset was loaded twice and one of the assets was unloaded, the system would ignore changes to the underlying data and no longer update the still-loaded asset. This has been resolved.
102.1
Fixed
Task priority changes to ITasking
ITasking now correctly respects task priority when resuming tasks that have slept, waited or suspended.
ITasking compile fixes
ITasking::addTask() and variants would fail to compile in situations where they were capturing additional parameters
that would be passed to the Callable parameter. These compile issues have been fixed.
102.0
Broke
Normalized Mouse Coordinate in IInput
IInput interface version has bumped from 0.5 to 1.0.  This is to support mouse coordinates being returned in either
normalized or pixel coordinates.
- IInput::getMouseCoordswas renamed to- IInput::getMouseCoordsPixel.
- Added - getMouseCoordsNormalized.
- Python: - MouseEvent.get_mouse_coordswas renamed to- MouseEvent.get_mouse_coords_pixel.
- Python: Added - MouseEvent.get_mouse_coords_normalized.
carb.imaging.plugin.dll Has Moved to the rendering Repo
IImaging has moved to the rendering repo.
- Kit is incompatible with older Carbonite builds that still have carb.imaging.plugin.dll. 
- carb.imaging.plugin.dll users outside kit/rendering must: - Pull rtx_plugins instead of Carbonite 
- Add a header include path from rtx_plugins/include. 
- Add plugins/carb_gfx to your search library path. 
- kit/rendering users can no longer rely on carb.imaging.plugin.dll being built ahead of time and must make it a build prerequisite by including it in their - dependson.
 
Transition discussion can be found here.