Coverage for cuda / pathfinder / _dynamic_libs / subprocess_protocol.py: 93.33%
45 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-25 01:07 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-25 01:07 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2# SPDX-License-Identifier: Apache-2.0
4from __future__ import annotations
6import json
7import sys
8from dataclasses import dataclass
9from pathlib import Path
10from typing import Literal
12MODE_CANARY: Literal["canary"] = "canary"
13MODE_LOAD: Literal["load"] = "load"
14VALID_MODES: tuple[Literal["canary"], Literal["load"]] = (MODE_CANARY, MODE_LOAD)
16STATUS_OK: Literal["ok"] = "ok"
17STATUS_NOT_FOUND: Literal["not-found"] = "not-found"
19DYNAMIC_LIB_SUBPROCESS_MODULE = "cuda.pathfinder._dynamic_libs.dynamic_lib_subprocess"
20DYNAMIC_LIB_SUBPROCESS_CWD = Path(__file__).resolve().parents[3]
23@dataclass(frozen=True)
24class DynamicLibSubprocessPayload:
25 status: Literal["ok", "not-found"]
26 abs_path: str | None
29def format_dynamic_lib_subprocess_payload(
30 status: Literal["ok", "not-found"],
31 abs_path: str | None,
32 *,
33 error: dict[str, str] | None = None,
34) -> str:
35 payload: dict[str, object] = {"status": status, "abs_path": abs_path} 1567123
36 if error is not None: 1567123
37 payload["error"] = error 1123
38 return json.dumps(payload) 1567123
41def build_dynamic_lib_subprocess_command(mode: str, libname: str) -> list[str]:
42 return [sys.executable, "-m", DYNAMIC_LIB_SUBPROCESS_MODULE, mode, libname] 18409KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ!#
45def parse_dynamic_lib_subprocess_payload(
46 stdout: str,
47 *,
48 libname: str,
49 error_label: str,
50) -> DynamicLibSubprocessPayload:
51 # Use the final non-empty line in case earlier output lines are emitted.
52 lines = [line for line in stdout.splitlines() if line.strip()] 140KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ
53 if not lines: 140KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ
54 raise RuntimeError(f"{error_label} produced no stdout payload for {libname!r}") 14
55 try: 10KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ
56 payload = json.loads(lines[-1]) 10KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ
57 except json.JSONDecodeError: 10
58 raise RuntimeError(f"{error_label} emitted invalid JSON payload for {libname!r}: {lines[-1]!r}") from None 10
59 if not isinstance(payload, dict): 1KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ
60 raise RuntimeError(f"{error_label} emitted unexpected payload for {libname!r}: {payload!r}")
61 status = payload.get("status") 1KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ
62 abs_path = payload.get("abs_path") 1KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ
63 if status == STATUS_OK: 1KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ
64 if not isinstance(abs_path, str): 1LMNOPQbRSTUcVWXYZ
65 raise RuntimeError(f"{error_label} emitted unexpected payload for {libname!r}: {payload!r}")
66 return DynamicLibSubprocessPayload(status=STATUS_OK, abs_path=abs_path) 1LMNOPQbRSTUcVWXYZ
67 if status == STATUS_NOT_FOUND: 1KdbefghijklcmnopqrstuvwxyzABCDEFGHIJ
68 if abs_path is not None: 1dbefghijklcmnopqrstuvwxyzABCDEFGHIJ
69 raise RuntimeError(f"{error_label} emitted unexpected payload for {libname!r}: {payload!r}")
70 return DynamicLibSubprocessPayload(status=STATUS_NOT_FOUND, abs_path=None) 1dbefghijklcmnopqrstuvwxyzABCDEFGHIJ
71 raise RuntimeError(f"{error_label} emitted unexpected payload for {libname!r}: {payload!r}") 1K