00001 /* 00002 * Semaphore.cc 00003 * 00004 * Smalltalk like class library for C++ 00005 * Semaphore. 00006 * 00007 * Copyright (c) 2003 Milan Cermak 00008 */ 00009 /* 00010 * This library is free software; you can redistribute it and/or 00011 * modify it under the terms of the GNU Lesser General Public 00012 * License as published by the Free Software Foundation; either 00013 * version 2.1 of the License, or (at your option) any later version. 00014 * 00015 * This library is distributed in the hope that it will be useful, 00016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 * Lesser General Public License for more details. 00019 * 00020 * You should have received a copy of the GNU Lesser General Public 00021 * License along with this library; if not, write to the Free Software 00022 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00023 */ 00024 #include <stdio.h> 00025 #include <semaphore.h> 00026 #include <errno.h> 00027 00028 #include <stlib/os/Semaphore.h> 00029 #include <stlib/OSError.h> 00030 00031 using namespace OS; 00032 00033 Semaphore::Semaphore(void) 00034 { 00035 sem_init(&handle, 0, 0); 00036 } 00037 00038 Semaphore::~Semaphore(void) 00039 { 00040 sem_destroy(&handle); 00041 } 00042 00043 /* Instance creation protocol */ 00044 Semaphore *Semaphore::forMutualExclusion(void) 00045 { 00046 Semaphore *mutex = new Semaphore; 00047 mutex->signal(); 00048 return mutex; 00049 } 00050 00051 /* Communication protocol */ 00052 void Semaphore::signal(void) 00053 { 00054 sem_post(&handle); 00055 } 00056 00057 void Semaphore::wait(void) 00058 { 00059 int retCode; 00060 00061 do { 00062 retCode = sem_wait(&handle); 00063 } while (retCode == -1 && errno == EINTR); 00064 if (retCode == -1) { 00065 (new OSError(new String(sys_errlist[errno]), __PRETTY_FUNCTION__)) 00066 ->raiseFrom(this); 00067 } 00068 }