00001
00002
00003 #ifndef OSL_LIGHT_MUTEX_H
00004 #define OSL_LIGHT_MUTEX_H
00005
00006 #include <boost/thread.hpp>
00007 #include <boost/utility.hpp>
00008 namespace osl
00009 {
00010 namespace misc
00011 {
00012 class LightMutex : boost::noncopyable {
00013 volatile int lock;
00014 public:
00015 class scoped_lock;
00016 LightMutex() :lock(0) {}
00017 bool tryLock(){
00018 int dummy;
00019 asm __volatile__(" movl $1,%0" "\n\t"
00020 " xchgl (%1),%0" "\n\t"
00021 : "=&q"(dummy)
00022 : "q"(&lock)
00023 : "cc");
00024 return dummy==0;
00025 }
00026 bool waitLock(int counter){
00027 for(int i=0;i<counter;i++){
00028 asm __volatile__(" pause" "\n\t");
00029 if(lock==0)
00030 return true;
00031 }
00032 return false;
00033 }
00034 void unLock(){
00035 lock=0;
00036 }
00037 };
00038 class LightMutex::scoped_lock : boost::noncopyable {
00039 LightMutex& m;
00040 public:
00041 scoped_lock(LightMutex& m) :m(m){
00042 while(!m.tryLock()){
00043 for(int i=0;i<2;i++){
00044 if(!m.waitLock(100)) break;
00045 if(m.tryLock()) return;
00046 }
00047 boost::thread::yield();
00048 }
00049 }
00050 ~scoped_lock(){
00051 m.unLock();
00052 }
00053 };
00054 }
00055 using misc::LightMutex;
00056 }
00057 #endif
00058
00059
00060
00061
00062