|
7 | 7 | import os |
8 | 8 | import sys |
9 | 9 | import threading |
| 10 | +from contextlib import contextmanager |
10 | 11 | from ctypes import * |
11 | 12 | from typing import ClassVar |
12 | 13 |
|
@@ -247,31 +248,32 @@ def _LoadAMDGPULibrary(): |
247 | 248 |
|
248 | 249 |
|
249 | 250 | ## C function wrappers ## |
250 | | -def amdgpu_device_initialize(card=1): |
| 251 | +@contextmanager |
| 252 | +def amdgpu_device(card=1): |
251 | 253 | _LoadAMDGPULibrary() |
252 | 254 |
|
253 | 255 | try: |
254 | 256 | fd = os.open(f"/dev/dri/card{card}", os.O_RDONLY) |
255 | 257 | except Exception: |
256 | 258 | raise AMDGPUError(AMDGPU_ERROR_CARD_NOTFOUND) |
257 | 259 |
|
258 | | - c_major = c_uint32() |
259 | | - c_minor = c_uint32() |
260 | 260 | device = c_amdgpu_device_t() |
261 | | - fn = _amdgpuGetFunctionPointer("amdgpu_device_initialize") |
262 | | - # If receive an error print here, try |
263 | | - # sudo vim /etc/default/grub |
264 | | - # and add "amdgpu.dc=0" to GRUB_CMDLINE_LINUX_DEFAULT |
265 | | - # then run "sudo update-grub" and reboot. |
266 | | - ret = fn(fd, byref(c_major), byref(c_minor), byref(device)) |
267 | | - _amdgpuCheckReturn(ret) |
268 | | - return c_major.value, c_minor.value, device |
269 | 261 |
|
| 262 | + try: |
| 263 | + c_major = c_uint32() |
| 264 | + c_minor = c_uint32() |
| 265 | + fn = _amdgpuGetFunctionPointer("amdgpu_device_initialize") |
| 266 | + ret = fn(fd, byref(c_major), byref(c_minor), byref(device)) |
| 267 | + _amdgpuCheckReturn(ret) |
| 268 | + |
| 269 | + yield device |
270 | 270 |
|
271 | | -def amdgpu_device_deinitialize(device): |
272 | | - fn = _amdgpuGetFunctionPointer("amdgpu_device_deinitialize") |
273 | | - ret = fn(device) |
274 | | - _amdgpuCheckReturn(ret) |
| 271 | + finally: |
| 272 | + try: |
| 273 | + fn = _amdgpuGetFunctionPointer("amdgpu_device_deinitialize") |
| 274 | + fn(device) |
| 275 | + finally: |
| 276 | + os.close(fd) |
275 | 277 |
|
276 | 278 |
|
277 | 279 | def amdgpu_query_gpu_info(device): |
|
0 commit comments