Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.13.4] - 2024-06-07
Fixed
Reshuffled the
ExecutionController::compile_abi
call insideExecutionController::execute_abi
andExecutionController::executeDefinition_abi
to occur before acquiring the execution-related mutex locks. This helps to prevent deadlocks that can occur whencompile_abi
is invoked within execution, which involves upgrading a read topology lock into a write lock.
[0.13.3] - 2024-04-02
Fixed
Refactored a piece of logic in nested isolate task execution so that full-stack task processing is done across all three scheduling types.
[0.13.2] - 2024-03-15
Fixed
Fixed and reactivated a bunch of faulty unit tests (mostly usage of condition variables and latches in said tests).
Fixed a somewhat-rare bug in ParallelScheduler that can cause hangs during nested isolation task processing if the first task in each task stack was originally added by a different ParallelSpawner instance than the one currently running.
Fixed a bug that could sometimes incorrectly decide that a call to execution was made recursively within a post- process task, thereby cancelling the operation when it could have proceeded without issue.
[0.13.1] - 2024-02-02
Changed
Fix a deadlock that can occur during combined parallel-recursive on-demand execution that’s invoked via ExecutionController::executeDefinition.
Added
New unit test to validate the aforementioned change.
[0.13.0] - 2024-01-31
Changed
IExecutionController::schedulePreProcessTask and IExecutionController::schedulePreProcessTask now use the new ScheduleFunction implementation for forwarding captured invokables to their corresponding ABI methods.
TbbSchedulerState and ParallelScheduler to use carb’s LocklessStack implementation (which was recently modified to be truly lock-free in Linux + more performant in general).
Removed
Deleted the custom LockFreeStack header implementation and its associated unit tests (since we’re now using carb’s concurrent stack instead).
[0.12.1] - 2024-01-25
Changed
Fix debug assertion in ExecutionController.
[0.12.0] - 2024-01-22
Changed
Pre-process task lifetime management to clean up tasks originally enqueued from a different extension when said extension is about to be unloaded (thus preventing the task from potentially calling into now-unloaded code).
Pre-process tasks can no-longer be recursively scheduled from within pre-process task evaluation. Instead, pre-process tasks can be scheduled to “persist” (i.e. to always be evaluated as long as the module from which they came from stays loaded) or to act as “one-offs” (i.e. to be cleaned up immediately after their first evaluation).
Some unit tests to reflect the new behavior.
[0.11.1] - 2024-01-17
Changed
Pre-process tasks now always run before execution graph compilation rather than execution.
Modified a few unit tests for correctness.
Logging level for certain warnings to prevent unnecessary spamming of the console.
[0.11.0] - 2024-01-16
Changed
Modify TbbSchedulerState to utilize threadsafe LIFO data containers (lockless stacks) for storing enqueued tasks (helps in preventing stack overflows when dealing with execution graphs where the number of nodes per NodeGraphDef tends to be much larger than the depth of nested NodeGraphDefs).
Modify ParallelScheduler to prevent execution continuation via tasks that were enqueued by different/ non-local ParallelSpawner instances during nested isolate processing (helps in preventing stack overflows).
Added
New LockFreeStack implementation (borrowed from CVCUDA).
New unit tests to validate the aforementioned changes.
[0.10.1] - 2023-12-20
Changed
Force nested isolation tasks to bypass the scheduler and be executed directly in order to reduce the chance of stack overflow errors from occurring (OM-117092).
[0.10.0] - 2023-12-05
Changed
Consolidated pre- and post-process tasks onto the ExecutionController.
All execution and compilation that’s invoked from the ExecutionController is now serialized.
Relevant synchronization changes to make pre- and post-process task handling/scheduling thread-safe.
Added
New unit tests to validate the aforementioned changes.
[0.9.3] - 2023-11-30
Changed
PassPipeline instancing logic should only work with NodeGraphDefs.
[0.9.2] - 2023-11-15
Changed
ExecutionController::executeDefinition cannot be used to execute the top-level execution graph’s NodeGraphDef.
[0.9.1] - 2023-11-09
Changed
Make all derived omni::graph::exec::unstable::IExecutionContext execute methods private in the omni::kit::exec::core::unstable::IExecutionContext interface in order to prevent the latter interface from being utilized to directly compute a graph; prefer using the ExecutionController object for invoking execution at the kit-EF integration level.
ExecutionController::executeDefinition now returns early with a success status if one attempts to call the method on a null definition. This method now also uses its internal omni::kit::exec::core::unstable::ExecutionContext object to call the required execution methods rather than using the omni::kit::exec::core::unstable::IExecutionContext interface, since in the latter we’ve hidden all execution calls (as mentioned in the first bullet point).
Added
Unit tests to validate the new ExecutionController::executeDefinition behavior.
[0.9.0] - 2023-10-18
Added
Ability to register serial ‘pre-tasks’ that runs before compilation of graphs
[0.8.0] - 2023-10-18
Added
New synchronization mechanisms in the EF-kit integration layer that mainly target the ExecutionController, including:
Serialized, blocking execution graph compilation relative to other requests to to execute, traverse, or compile the same graph.
Logic to detect and gracefully handle recursive compilation-in-compilation, compilation-in execution, and execution-in-compilation calls.
Additional acquisition of a USD writer lock during graph compilation if said graph is explicitly associated with some USD context.
Continued allowance of concurrent graph execution/traversal, including multithreaded evaluation from a single and/or multiple different contexts.
Unit tests to validate the new additions.
Changed
Reintroduction of graph compilation prior to computing the pre- and post-render graphs.
[0.7.2] - 2023-10-16
Changed
Updated some documentation associated with ExecutionContext::isExecutingThread’s usage.
[0.7.1] - 2023-10-10
Changed
Fixed typo by renaming ITbbSchedulerState::geState to ITbbSchedulerState::getState.
[0.7.0] - 2023-10-09
Changed
Removed the execution mutex from ExecutionController.
Modified the ParallelScheduler to support multiple different execution contexts (potentially associated with the same execution graph) being kickstarted across multiple different threads (with many threads potentially being used to kickstart execution from a single context).
Added new unit tests for the ParallelScheduler.
[0.6.0] - 2023-08-24
Changed
Added mutex locks to ExecutionController::execute_abi and ExecutionController::executeDefinition_abi in order to prevent parallel execution of the same execution Graph within the same ExecutionContext.
[0.5.1] - 2023-07-21
Changed
Renamed Node::createForDef references to Node::create.
[0.5.0] - 2023-07-17
Changed
Renamed PassPipeline::execute_abi to PassPipeline::run_abi.
[0.4.1] - 2023-05-17
Changed
Expose the DumpTopology debugging setting as a Python binding.
DumpTopology setting is no longer a carb setting.
Remove logic that only generates the GraphViz file at execution graph “compile” time.
[0.4.0] - 2023-02-22
Changed
Renamed omni.kit.exec to omni.kit.exec.core
[0.3.0] - 2023-02-15
Changed
Execution Framework is enabled by default
[0.2.0] - 2023-02-08
Added
Added support for Isolate tasks
[0.1.1] - 2023-01-20
Changed
Simplification of serial tasks scheduling
[0.1.0] - 2022-11-14
Initial version