00001 /**************************************************************** 00002 * 00003 * Copyright (c) 2010 00004 * 00005 * Fraunhofer Institute for Manufacturing Engineering 00006 * and Automation (IPA) 00007 * 00008 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00009 * 00010 * Project name: care-o-bot 00011 * ROS stack name: cob_driver 00012 * ROS package name: cob_relayboard 00013 * Description: custom Mutex implementation 00014 * 00015 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00016 * 00017 * Author: Christian Connette, email:christian.connette@ipa.fhg.de 00018 * Supervised by: Christian Connette, email:christian.connette@ipa.fhg.de 00019 * 00020 * Date of creation: Feb 2009 00021 * ToDo: - Remove this class 00022 * 00023 * +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00024 * 00025 * Redistribution and use in source and binary forms, with or without 00026 * modification, are permitted provided that the following conditions are met: 00027 * 00028 * * Redistributions of source code must retain the above copyright 00029 * notice, this list of conditions and the following disclaimer. 00030 * * Redistributions in binary form must reproduce the above copyright 00031 * notice, this list of conditions and the following disclaimer in the 00032 * documentation and/or other materials provided with the distribution. 00033 * * Neither the name of the Fraunhofer Institute for Manufacturing 00034 * Engineering and Automation (IPA) nor the names of its 00035 * contributors may be used to endorse or promote products derived from 00036 * this software without specific prior written permission. 00037 * 00038 * This program is free software: you can redistribute it and/or modify 00039 * it under the terms of the GNU Lesser General Public License LGPL as 00040 * published by the Free Software Foundation, either version 3 of the 00041 * License, or (at your option) any later version. 00042 * 00043 * This program is distributed in the hope that it will be useful, 00044 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00045 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00046 * GNU Lesser General Public License LGPL for more details. 00047 * 00048 * You should have received a copy of the GNU Lesser General Public 00049 * License LGPL along with this program. 00050 * If not, see <http://www.gnu.org/licenses/>. 00051 * 00052 ****************************************************************/ 00053 00054 #ifndef MUTEX_INCLUDEDEF_H 00055 #define MUTEX_INCLUDEDEF_H 00056 //----------------------------------------------- 00057 #include <pthread.h> 00058 00059 const unsigned int INFINITE = 0; 00060 00061 00062 class Mutex 00063 { 00064 private: 00065 pthread_mutex_t m_hMutex; 00066 00067 public: 00068 Mutex() 00069 { 00070 pthread_mutex_init(&m_hMutex, 0); 00071 } 00072 00073 Mutex( std::string sName) 00074 { 00075 // no named Mutexes for POSIX 00076 pthread_mutex_init(&m_hMutex, 0); 00077 } 00078 00079 ~Mutex() 00080 { 00081 pthread_mutex_destroy(&m_hMutex); 00082 } 00083 00086 bool lock( unsigned int uiTimeOut = INFINITE ) 00087 { 00088 int ret; 00089 00090 if (uiTimeOut == INFINITE) 00091 { 00092 ret = pthread_mutex_lock(&m_hMutex); 00093 } 00094 else 00095 { 00096 timespec abstime = { time(0) + uiTimeOut, 0 }; 00097 ret = pthread_mutex_timedlock(&m_hMutex, &abstime); 00098 } 00099 00100 return ! ret; 00101 } 00102 00103 void unlock() 00104 { 00105 pthread_mutex_unlock(&m_hMutex); 00106 } 00107 }; 00108 //----------------------------------------------- 00109 #endif 00110