-
Notifications
You must be signed in to change notification settings - Fork 47
Expand file tree
/
Copy pathacllite_resource.py
More file actions
110 lines (90 loc) · 3.2 KB
/
Copy pathacllite_resource.py
File metadata and controls
110 lines (90 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
"""
Copyright (R) @huawei.com, all rights reserved
-*- coding:utf-8 -*-
CREATED: 2021-01-20 20:12:13
MODIFIED: 2021-02-03 14:04:45
"""
import threading
import acl
import acllite_utils as utils
REGISTER = 0
UNREGISTER = 1
class _ResourceList(object):
"""Acl resources of current application
This class provide register inferace of acl resource, when application
exit, all register resource will release befor acl.rt.reset_device to
avoid program abnormal
"""
_instance_lock = threading.Lock()
def __init__(self):
self.resources = []
def __new__(cls, *args, **kwargs):
if not hasattr(_ResourceList, "_instance"):
with _ResourceList._instance_lock:
if not hasattr(_ResourceList, "_instance"):
_ResourceList._instance = object.__new__(
cls, *args, **kwargs)
return _ResourceList._instance
def register(self, resource):
"""Resource register interface
Args:
resource: object with acl resource, the object must be has
method destroy()
"""
item = {"resource": resource, "status": REGISTER}
self.resources.append(item)
def unregister(self, resource):
"""Resource unregister interface
If registered resource release by self and no need _ResourceList
release, the resource object should unregister self
Args:
resource: registered resource
"""
for item in self.resources:
if resource == item["resource"]:
item["status"] = UNREGISTER
def destroy(self):
"""Destroy all register resource"""
for item in self.resources:
if item["status"] == REGISTER:
item["resource"].destroy()
item["status"] = UNREGISTER
resource_list = _ResourceList()
class AclLiteResource(object):
"""
AclLiteResource
"""
def __init__(self, device_id=0):
self.device_id = device_id
self.context = None
self.stream = None
self.run_mode = None
def init(self):
"""
init resource
"""
print("init resource stage:")
ret = acl.init()
utils.check_ret("acl.init", ret)
ret = acl.rt.set_device(self.device_id)
utils.check_ret("acl.rt.set_device", ret)
self.context, ret = acl.rt.create_context(self.device_id)
utils.check_ret("acl.rt.create_context", ret)
self.stream, ret = acl.rt.create_stream()
utils.check_ret("acl.rt.create_stream", ret)
self.run_mode, ret = acl.rt.get_run_mode()
utils.check_ret("acl.rt.get_run_mode", ret)
print("Init resource success")
def __del__(self):
print("acl resource release all resource")
resource_list.destroy()
if self.stream:
print("acl resource release stream")
acl.rt.destroy_stream(self.stream)
if self.context:
print("acl resource release context")
acl.rt.destroy_context(self.context)
print("Reset acl device ", self.device_id)
acl.rt.reset_device(self.device_id)
acl.finalize()
print("Release acl resource success")