MCPcopy Create free account
hub / github.com/ActiveState/code / Sem

Class Sem

recipes/Python/577655_POSIX_Semaphore_FreeBSD/recipe-577655.py:52–180  ·  view source on GitHub ↗

A POSIC semaphore.

Source from the content-addressed store, hash-verified

50c_struct_timespec_p = POINTER(c_struct_timespec)
51
52class Sem(object):
53 """A POSIC semaphore."""
54 O_CREAT = 0x0200 # create if nonexistent
55 O_EXCL = 0x0800 # error if already exists
56
57 _clock_gettime = get_func("libc.so", "clock_gettime", None, (c_int32, c_struct_timespec_p))
58
59 _error = get_func("libc.so", "__error", POINTER(c_int), ())
60
61 _sem_close = get_func("libc.so", "sem_close", c_int, (c_sem_p,))
62 _sem_destroy = get_func("libc.so", "sem_destroy", c_int, (c_sem_p,))
63 _sem_getvalue = get_func("libc.so", "sem_getvalue", c_int, (c_sem_p, c_int_p))
64 _sem_init = get_func("libc.so", "sem_init", c_int, (c_sem_p, c_int, c_uint))
65 _sem_open = get_func("libc.so", "sem_open", c_sem_p, (c_char_p, c_int))
66 _sem_post = get_func("libc.so", "sem_post", c_int, (c_sem_p,))
67 _sem_timedwait = get_func("libc.so", "sem_timedwait", c_int, (c_sem_p, c_struct_timespec_p))
68 _sem_trywait = get_func("libc.so", "sem_trywait", c_int, (c_sem_p,))
69 _sem_unlink = get_func("libc.so", "sem_unlink", c_int, (c_char_p,))
70 _sem_wait = get_func("libc.so", "sem_wait", c_int, (c_sem_p,))
71
72 def __init__(self, value=1, name=None, oflags=0x0200):
73 """Create a semaphore with initial value, possible name and flags."""
74 if name:
75 self.sem = None
76 self.sem_p = self._sem_open("/%s" % name, oflags)
77 if not self.sem_p:
78 raise SemError()
79 else:
80 self.sem = c_sem()
81 self.sem_p = c_sem_p(self.sem)
82 if self._sem_init(self.sem_p, 0, value):
83 raise SemError()
84
85 def __del__(self):
86 """Cleanup the semaphore."""
87 if self.sem is None:
88 res = self._sem_close(self.sem_p)
89 else:
90 res = self._sem_destroy(self.sem_p)
91 if res:
92 raise SemError()
93
94 def __len__(self):
95 """The current value of the semaphore."""
96 return self.getvalue()
97
98 def __enter__(self):
99 """Decrement the value of the semaphore, waiting if required."""
100 self.wait()
101 return self
102
103 def __exit__(self, exc_type, exc_value, traceback):
104 """Increment the value of the semaphore."""
105 self.post()
106
107 def acquire(self, blocking=True):
108 """Decrement the value of the semaphore, block if requested and
109 required."""

Callers

nothing calls this directly

Calls 2

POINTERFunction · 0.85
get_funcFunction · 0.70

Tested by

no test coverage detected