Coverage for cuda/pathfinder/_dynamic_libs/load_dl_common.py: 100.00%
25 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-03 02:41 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-03 02:41 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2# SPDX-License-Identifier: Apache-2.0
4from __future__ import annotations
6from collections.abc import Callable
7from dataclasses import dataclass
8from typing import TYPE_CHECKING
10if TYPE_CHECKING:
11 from cuda.pathfinder._dynamic_libs.lib_descriptor import LibDescriptor
14class DynamicLibNotFoundError(RuntimeError):
15 pass
18class DynamicLibNotAvailableError(DynamicLibNotFoundError):
19 pass
22class DynamicLibUnknownError(DynamicLibNotFoundError):
23 pass
26@dataclass
27class LoadedDL:
28 abs_path: str | None
29 was_already_loaded_from_elsewhere: bool
30 _handle_uint: int # Platform-agnostic unsigned pointer value
31 found_via: str # "CUDA_PATH" covers both CUDA_PATH and CUDA_HOME env vars
34def load_dependencies(desc: LibDescriptor, load_func: Callable[[str], LoadedDL]) -> None:
35 """Load required dependencies, then best-effort runtime dependencies.
37 A plain ``DynamicLibNotFoundError`` from an optional dependency is
38 suppressed. More specific contract errors and failures while loading a
39 dependency that was found remain errors.
40 """
41 for dep in desc.dependencies: 1aheifbcgd
42 load_func(dep) 1ifd
43 for dep in desc.optional_dependencies: 1ahefbcgd
44 try: 1efbcgd
45 load_func(dep) 1efbcgd
46 except DynamicLibNotFoundError as exc: 1ebcgd
47 # Both public contract errors inherit DynamicLibNotFoundError, but
48 # neither an unknown descriptor nor platform incompatibility means
49 # that an optional runtime component is simply absent.
50 if type(exc) is not DynamicLibNotFoundError: 1ebcd
51 raise 1bc