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

1# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# SPDX-License-Identifier: Apache-2.0 

3 

4from __future__ import annotations 

5 

6import json 

7import sys 

8from dataclasses import dataclass 

9from pathlib import Path 

10from typing import Literal 

11 

12MODE_CANARY: Literal["canary"] = "canary" 

13MODE_LOAD: Literal["load"] = "load" 

14VALID_MODES: tuple[Literal["canary"], Literal["load"]] = (MODE_CANARY, MODE_LOAD) 

15 

16STATUS_OK: Literal["ok"] = "ok" 

17STATUS_NOT_FOUND: Literal["not-found"] = "not-found" 

18 

19DYNAMIC_LIB_SUBPROCESS_MODULE = "cuda.pathfinder._dynamic_libs.dynamic_lib_subprocess" 

20DYNAMIC_LIB_SUBPROCESS_CWD = Path(__file__).resolve().parents[3] 

21 

22 

23@dataclass(frozen=True) 

24class DynamicLibSubprocessPayload: 

25 status: Literal["ok", "not-found"] 

26 abs_path: str | None 

27 

28 

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

39 

40 

41def build_dynamic_lib_subprocess_command(mode: str, libname: str) -> list[str]: 

42 return [sys.executable, "-m", DYNAMIC_LIB_SUBPROCESS_MODULE, mode, libname] 18409KLdMNOPQbRefghSTijklUcmnopqrstuvwxyzABCDEFVGWHXIYJZ!#

43 

44 

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