00001 00031 #ifndef GALOIS_RUNTIME_LL_PADDED_LOCK_H 00032 #define GALOIS_RUNTIME_LL_PADDED_LOCK_H 00033 00034 #include "SimpleLock.h" 00035 #include "CacheLineStorage.h" 00036 00037 namespace Galois { 00038 namespace Runtime { 00039 namespace LL { 00040 00043 template<bool concurrent> 00044 class PaddedLock; 00045 00046 void LockPairOrdered(PaddedLock<true>& L1, PaddedLock<true>& L2); 00047 bool TryLockPairOrdered(PaddedLock<true>& L1, PaddedLock<true>& L2); 00048 void UnLockPairOrdered(PaddedLock<true>& L1, PaddedLock<true>& L2); 00049 void LockPairOrdered(PaddedLock<false>& L1, PaddedLock<false>& L2); 00050 bool TryLockPairOrdered(PaddedLock<false>& L1, PaddedLock<false>& L2); 00051 void UnLockPairOrdered(PaddedLock<false>& L1, PaddedLock<false>& L2); 00052 00053 template<> 00054 class PaddedLock<true> { 00055 mutable CacheLineStorage<SimpleLock<true> > Lock; 00056 00057 public: 00058 void lock() const { Lock.data.lock(); } 00059 bool try_lock() const { return Lock.data.try_lock(); } 00060 void unlock() const { Lock.data.unlock(); } 00061 friend void LockPairOrdered(PaddedLock<true>& L1, PaddedLock<true>& L2); 00062 friend bool TryLockPairOrdered(PaddedLock<true>& L1, PaddedLock<true>& L2); 00063 friend void UnLockPairOrdered(PaddedLock<true>& L1, PaddedLock<true>& L2); 00064 }; 00065 00066 template<> 00067 class PaddedLock<false> { 00068 public: 00069 void lock() const {} 00070 bool try_lock() const { return true; } 00071 void unlock() const {} 00072 }; 00073 00074 } 00075 } 00076 } // end namespace Galois 00077 00078 #endif