00001 /** @file rutz/spin_lock.h */ 00002 00003 /////////////////////////////////////////////////////////////////////// 00004 // 00005 // Copyright (c) 2007-2007 University of Southern California 00006 // Rob Peters <rjpeters at usc dot edu> 00007 // 00008 // created: Tue Sep 4 14:12:19 2007 00009 // commit: $Id: spin_lock.h 8741 2007-09-05 21:03:52Z rjpeters $ 00010 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/rutz/spin_lock.h $ 00011 // 00012 // -------------------------------------------------------------------- 00013 // 00014 // This file is part of GroovX. 00015 // [http://www.klab.caltech.edu/rjpeters/groovx/] 00016 // 00017 // GroovX is free software; you can redistribute it and/or modify it 00018 // under the terms of the GNU General Public License as published by 00019 // the Free Software Foundation; either version 2 of the License, or 00020 // (at your option) any later version. 00021 // 00022 // GroovX is distributed in the hope that it will be useful, but 00023 // WITHOUT ANY WARRANTY; without even the implied warranty of 00024 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00025 // General Public License for more details. 00026 // 00027 // You should have received a copy of the GNU General Public License 00028 // along with GroovX; if not, write to the Free Software Foundation, 00029 // Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. 00030 // 00031 /////////////////////////////////////////////////////////////////////// 00032 00033 #ifndef GROOVX_RUTZ_SPIN_LOCK_H_UTC20070904211219_DEFINED 00034 #define GROOVX_RUTZ_SPIN_LOCK_H_UTC20070904211219_DEFINED 00035 00036 #if defined(HAVE_LIBKERN_OSATOMIC_H) 00037 # include "rutz/spin_lock_darwin.h" 00038 namespace rutz { typedef spin_lock_darwin spin_lock_t; } 00039 00040 #elif defined(HAVE_PTHREAD_SPINLOCK_T) 00041 # include "rutz/spin_lock_pthreads.h" 00042 namespace rutz { typedef spin_lock_pthreads spin_lock_t; } 00043 00044 #else 00045 # error no spinlock implementation available 00046 #endif 00047 00048 namespace rutz 00049 { 00050 00051 class spin_lock_locker 00052 { 00053 private: 00054 spin_lock_t* m_spin_lock; // if null, then we do no locking/unlocking 00055 00056 spin_lock_locker(const spin_lock_locker&); 00057 spin_lock_locker& operator=(const spin_lock_locker&); 00058 00059 public: 00060 spin_lock_locker(spin_lock_t* lock) : m_spin_lock(lock) 00061 { 00062 if (m_spin_lock) 00063 m_spin_lock->lock(); 00064 } 00065 00066 ~spin_lock_locker() 00067 { 00068 if (m_spin_lock) 00069 m_spin_lock->unlock(); 00070 } 00071 00072 void unlock() 00073 { 00074 if (m_spin_lock) 00075 m_spin_lock->unlock(); 00076 m_spin_lock = 0; 00077 } 00078 }; 00079 00080 } 00081 00082 #define GVX_SPIN_CONCAT2(x,y) x##y 00083 #define GVX_SPIN_CONCAT(x,y) GVX_SPIN_CONCAT2(x,y) 00084 00085 #define GVX_SPIN_LOCK(x) \ 00086 ::rutz::spin_lock_locker GVX_SPIN_CONCAT(anonymous_lock,__LINE__) (x) 00087 00088 #define GVX_SPIN_LOCK_IF(doit, x) \ 00089 ::rutz::spin_lock_locker GVX_SPIN_CONCAT(anonymous_lock,__LINE__) ((doit) ? (x) : 0) 00090 00091 static const char vcid_groovx_rutz_spin_lock_h_utc20070904211219[] = "$Id: spin_lock.h 8741 2007-09-05 21:03:52Z rjpeters $ $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/rutz/spin_lock.h $"; 00092 #endif // !GROOVX_RUTZ_SPIN_LOCK_H_UTC20070904211219DEFINED