/*************************************************************************** * Copyright (C) 2005 by Jeff Ferr * * root@sat * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program 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 General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "jsemaphore.h" #include "jsemaphoreexception.h" #include "jmutex.h" #include #include namespace jthread { bool is_wait_time_out = false; Semaphore::Semaphore(uint16_t value_) { if (sem_init(&_semaphore, 0, value_)) { if (errno == EINVAL) { throw SemaphoreException("Operation would increase the semaphore count !"); } else { throw SemaphoreException("Unknown semaphore error !"); } } _count = 0; } Semaphore::~Semaphore() { while (sem_destroy(&_semaphore) == EBUSY) { Notify(); } } void Semaphore::Close() { sem_close(&_semaphore); } void Semaphore::Wait() { sem_wait(&_semaphore); } void Semaphore::Wait(struct timespec time_) { /* struct timespec t; t.tv_sec = time_.seconds; t.tv_nsec = time_.nano_seconds; */ sem_timedwait(&_semaphore, &time_); } void Semaphore::Notify() { if (sem_post(&_semaphore)) { if (errno == ERANGE) { throw SemaphoreException("Operation would increase the semaphore count !"); } else { throw SemaphoreException("Unknown semaphore error !"); } } } bool Semaphore::TryWait() { if (sem_trywait(&_semaphore)) { if (errno == EAGAIN) { return false; } throw SemaphoreException("Unknown semaphore error !"); } return true; } int Semaphore::GetValue() { int r; sem_getvalue(&_semaphore, &r); return r; } };