spin_lock.h

Go to the documentation of this file.
00001 
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 10134 2008-03-04 17:58:05Z rjpeters $
00010 // $HeadURL: file:///lab/rjpeters/svnrepo/code/trunk/groovx/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 //
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 10134 2008-03-04 17:58:05Z rjpeters $ $HeadURL: file:///lab/rjpeters/svnrepo/code/trunk/groovx/src/rutz/spin_lock.h $";
00092 #endif // !GROOVX_RUTZ_SPIN_LOCK_H_UTC20070904211219DEFINED

The software described here is Copyright (c) 1998-2005, Rob Peters.
This page was generated Wed Dec 3 06:49:41 2008 by Doxygen version 1.5.5.