class MutexLock(AbstractFileLock): """:class:`MutexLock` is a thread-based rw lock based on :class:`dogpile.core.ReadWriteMutex`.""" def __init__(self, filename): self.mutex = ReadWriteMutex() def acquire_read_lock(self, wait): ret = self.mutex.acquire_read_lock(wait) return wait or ret def acquire_write_lock(self, wait): ret = self.mutex.acquire_write_lock(wait) return wait or ret def release_read_lock(self): return self.mutex.release_read_lock() def release_write_lock(self): return self.mutex.release_write_lock()
def __init__(self, filename): self.mutex = ReadWriteMutex()
def __init__(self): """Thread safe buffer of monitoring points""" self._mutex = ReadWriteMutex() self._buffer = {}
class MonitoringBuffer(object): def __init__(self): """Thread safe buffer of monitoring points""" self._mutex = ReadWriteMutex() self._buffer = {} def add_points(self, points, timetag=None): """Add a :class:`dict` of point(s) to the buffer. This is to support points without metadata (old-style monitoring points)""" try: timestamp = timetag or bat_now() self._mutex.acquire_write_lock() for k, v in points.items(): self._buffer[k] = { 'value': v, 'name': k, 'timestamp': timestamp } finally: self._mutex.release_write_lock() def add_full_points(self, points): """ points is a list of dict, each is a monitor point """ try: self._mutex.acquire_write_lock() for point in points: name = point['name'] mon_point = { 'name': name, 'timestamp': point.get('timestamp', bat_now()), 'unit': point.get('unit', ''), 'status': point.get('status', 'OK'), 'value': point['value'] } self._buffer[name] = mon_point finally: self._mutex.release_write_lock() def add(self, name, value, timestamp=None, status="OK", unit=""): """Add a monitor point with metadata""" try: timestamp = timestamp or bat_now() point = { 'name': name, 'timestamp': timestamp, 'unit': unit, 'status': status, 'value': value } self._mutex.acquire_write_lock() self._buffer[name] = point finally: self._mutex.release_write_lock() def remove(self, keys): points = keys if isinstance(keys, basestring): points = (keys, ) try: self._mutex.acquire_write_lock() for k in points: if k in self._buffer: self._buffer.pop(k) finally: self._mutex.release_write_lock() def clear(self): """ Clear the buffer """ try: self._mutex.acquire_write_lock() self._buffer.clear() finally: self._mutex.release_write_lock() def get(self, keys): """Get given point names `keys` from buffer :param list keys: a list of point names. """ if isinstance(keys, basestring): keys = (keys, ) try: self._mutex.acquire_read_lock() return [self._buffer[k] for k in keys if k in self._buffer] finally: self._mutex.release_read_lock()