def lock(self, blocking=True): """ lock the file :param blocking: If blocking is True, will block there until cup gets the lock. True by default. :return: return False if locking fails :raise Exception: raise cup.err.LockFileError if blocking is False and the lock action failed """ flags = 0x1 if FILELOCK_SHARED == self._locktype: flags = FILELOCK_SHARED elif FILELOCK_EXCLUSIVE == self._locktype: flags = FILELOCK_EXCLUSIVE else: raise err.LockFileError('does not support this lock type') if not blocking: flags |= FILELOCK_NONBLOCKING ret = None try: ret = fcntl.flock(self._fhandle, flags) except IOError as error: raise err.LockFileError(error) except Exception as error: raise err.LockFileError(error) return ret
def __init__(self, fpath, locktype=FILELOCK_EXCLUSIVE): """ exclusive lockfile, by default. Notice that the file CANNOT exist before you intialize a LockFile obj. Otherwise, it will raise cup.err.LockFileError :raise: cup.err.LockFileError if we encounter errors """ self._fpath = fpath self._locktype = locktype self._fhandle = None try: # if FILELOCK_EXCLUSIVE == locktype: # self._fhandle = os.open( # self._fpath, os.O_CREAT|os.O_EXCL|os.O_RDWR # ) # else: self._fhandle = os.open(self._fpath, os.O_CREAT | os.O_RDWR) except IOError as error: raise err.LockFileError(error) except OSError as error: raise err.LockFileError(error) except Exception as error: raise err.LockFileError( 'catch unkown error type:{0}'.format(error))
def unlock(self): """unlock the locked file""" if platforms.is_linux(): try: fcntl.flock(self._fhandle, FILELOCK_UNLOCK) except Exception as error: raise err.LockFileError(error) elif platforms.is_windows(): win_unlockfile(self._fhandle)
def unlock(self): """unlock the locked file""" try: fcntl.flock(self._fhandle, FILELOCK_UNLOCK) except Exception as error: raise err.LockFileError(error)