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 Set an environment variable "EDNA_LOCK" to help debugging
31 any dead-locks- inside EDNA
32 """
33
34 __authors__ = [ "Jérôme Kieffer" ]
35 __contact__ = "jerome.kieffer@esrf.fr"
36 __license__ = "LGPLv3+"
37 __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France"
38 __date__ = "20120401"
39 import uuid, sys, os, traceback
40 import threading
41 _Semaphore = threading._Semaphore
42
43 if os.environ.get("EDNA_LOCK", False):
45 """
46 threading.Semaphore like class with helper for fighting dead-locks
47 """
49 _Semaphore.__init__(self, *arg, **kwarg)
50 self.blocked = []
51
53 if self._Semaphore__value == 0:
54 uid = uuid.uuid4()
55 self.blocked.append(uid)
56 sys.stderr.write("Blocking sem %s" %
57 os.linesep.join([str(uid)] + \
58 traceback.format_stack()[:-1] + [""]))
59 return _Semaphore.acquire(self, *arg, **kwarg)
60
62 if self.blocked:
63 try:
64 uid = self.blocked.pop()
65 except Exception:
66 pass
67 else:
68 sys.stderr.write("Released sem %s %s" % (uid, os.linesep))
69 _Semaphore.release(self, *arg, **kwarg)
70
72 self.acquire()
73 return self
74
77 else:
78 Semaphore = threading.Semaphore
79