/* * Copyright (c) 2014, The Linux Foundation. All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of The Linux Foundation nor the names of its contributors may be used to * endorse or promote products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef __LOCKER_H__ #define __LOCKER_H__ #include #include #define SCOPE_LOCK(locker) Locker::ScopeLock scopeLock(locker) namespace sde { class Locker { public: class ScopeLock { public: explicit ScopeLock(Locker& locker) : locker_(locker) { locker_.Lock(); } ~ScopeLock() { locker_.Unlock(); } private: Locker &locker_; }; Locker() { pthread_mutex_init(&mutex_, 0); pthread_cond_init(&condition_, 0); } ~Locker() { pthread_mutex_destroy(&mutex_); pthread_cond_destroy(&condition_); } void Lock() { pthread_mutex_lock(&mutex_); } void Unlock() { pthread_mutex_unlock(&mutex_); } void Signal() { pthread_cond_signal(&condition_); } void Broadcast() { pthread_cond_broadcast(&condition_); } void Wait() { pthread_cond_wait(&condition_, &mutex_); } int WaitFinite(long int ms) { struct timespec ts; struct timeval tv; gettimeofday(&tv, NULL); ts.tv_sec = tv.tv_sec + ms/1000; ts.tv_nsec = tv.tv_usec*1000 + (ms%1000)*1000000; ts.tv_sec += ts.tv_nsec/1000000000L; ts.tv_nsec += ts.tv_nsec%1000000000L; return pthread_cond_timedwait(&condition_, &mutex_, &ts); } private: pthread_mutex_t mutex_; pthread_cond_t condition_; }; } // namespace sde #endif // __LOCKER_H__