/* * Copyright (C) 2015 by Multi-Tech Systems * * This file is part of libmts-io. * * libmts-io is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * libmts-io is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libmts-io. If not, see . * */ /*! \file MTS_IO_LockFile.cpp \brief A brief description \date Oct 8, 2014 \author sgodinez A more elaborate description */ #include #include #include #include using namespace MTS::IO; LockFile::LockFile(const std::string& sFile) : m_sFile(sFile) , m_iLockFd(-1) , m_iLockErr(-1) { } LockFile::~LockFile() { unlock(); } bool LockFile::lock(uint32_t attemptMillis) { if (isLocked()) { return true; } m_iLockFd = ::open(m_sFile.c_str(), O_CREAT | O_RDWR, 0644); if (m_iLockFd >= 0) { MTS::Timer timer; timer.start(); while (timer.getMillis() < attemptMillis) { m_iLockErr = ::flock(m_iLockFd, LOCK_EX | LOCK_NB); if (m_iLockErr == 0) { return true; } else if (errno != EWOULDBLOCK) { break; } ::usleep(((rand() % 10) + 1) * 100000); //Sleep from 100ms to 1 Second } ::close(m_iLockFd); } m_iLockFd = -1; return false; } void LockFile::unlock() { ::flock(m_iLockFd, LOCK_UN); ::close(m_iLockFd); m_iLockFd = -1; m_iLockErr = -1; } bool LockFile::isLocked() { return m_iLockErr == 0; }