SemClass/VoMaKu
SemClass/ziptitap
f1class Lock:f1class Lock:
n2    const_ = Nonen2    cn = None
33
4    def __new__(item):4    def __new__(item):
n5        if item.const_ is None:n5        if item.cn is None:
6            item.const_ = super(Lock, item).__new__(item)6            item.cn = super(Lock, item).__new__(item)
7            item.dict_semofor = {}7            item.dict_semofor = {}
n8        return item.const_n8        return item.cn
99
10    @staticmethod10    @staticmethod
11    def locked(item):11    def locked(item):
n12        item.lock = Sem()n12        item.lock = Semaphore()
13        item.counter = None13        item.count = None
1414
n15        def delete_obj(self):n15        def dlt_obj(self):
16            del self.lock16            del self.lock
17            try:17            try:
18                super(type(self), self).__del__18                super(type(self), self).__del__
19            except AttributeError:19            except AttributeError:
20                pass20                pass
21            else:21            else:
22                super(type(self), self).__del__()22                super(type(self), self).__del__()
n23        item.__del__ = delete_objn23        item.__del__ = dlt_obj
24        return item24        return item
2525
n26class Sem:n26class Semaphore:
2727
28    def __init__(self):28    def __init__(self):
29        self.resources = Lock()29        self.resources = Lock()
3030
n31    def __get__(self, const_, owner):n31    def __get__(self, cn, owner):
32        locked = self.resources.dict_semofor.get(const_.counter)32        locked = self.resources.dict_semofor.get(cn.count)
33        if not locked:33        if not locked:
n34            self.resources.dict_semofor[const_.counter] = id(const_)n34            self.resources.dict_semofor[cn.count] = id(cn)
35            return const_.counter35            return cn.count
36        elif locked == id(const_):36        elif locked == id(cn):
37            return const_.counter37            return cn.count
38        else:38        else:
39            return None39            return None
4040
n41    def __delete__(self, const_):n41    def __delete__(self, cn):
42        if self.resources.dict_semofor.get(const_.counter) == id(const_):42        if self.resources.dict_semofor.get(cn.count) == id(cn):
43            self.resources.dict_semofor[const_.counter] = None43            self.resources.dict_semofor[cn.count] = None
44        const_._lock = None44        cn._lock = None
4545
t46    def __set__(self, const_elem):t46    def __set__(self, cn, v):
47        if self.resources.dict_semofor.get(const_.counter) == id(const_):47        if self.resources.dict_semofor.get(cn.count) == id(cn):
48            self.resources.dict_semofor[const_.counter] = None48            self.resources.dict_semofor[cn.count] = None
49        const_.counter = elem49        cn.count = v
50import sys50import sys
51exec(sys.stdin.read(), globals())51exec(sys.stdin.read(), globals())
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op