00001 // 00002 // http://discuss.microsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind0009A&L=ATL&P=R6194&D=0&I=-3 00003 // Posted by Pavel Lebedinsky <pll@INFRA2000.COM> 00004 // 00005 #ifndef __Simple_LOCK_H_Included__ 00006 #define __Simple_LOCK_H_Included__ 00007 00008 //#include <Windows.h> 00009 #include "atomic_util.h" 00010 #include "system_abstraction.h" 00011 00012 class SimpleRWLock 00013 { 00014 volatile int m_nReaders; 00015 volatile int m_nWriters; 00016 00017 public: 00018 SimpleRWLock() 00019 { 00020 m_nReaders = 0; 00021 m_nWriters = 0; 00022 } 00023 00024 static const char *name() { return "Simple_Lock"; } 00025 00026 void enter_read(void) 00027 { 00028 for (;;) 00029 { 00030 atomic_inc(&m_nReaders); 00031 if (m_nWriters == 0) break; 00032 atomic_dec(&m_nReaders); 00033 thread_yield(); 00034 } 00035 } 00036 00037 void enter_write(void) 00038 { 00039 for (;;) 00040 { 00041 if (atomic_cmpexch_return(&m_nWriters, 1, 0) == 0) 00042 { 00043 while (m_nReaders != 0) thread_yield(); 00044 break; 00045 } 00046 thread_yield(); 00047 } 00048 } 00049 00050 void leave_read(void) 00051 { 00052 atomic_dec(&m_nReaders); 00053 } 00054 00055 void leave_write(void) 00056 { 00057 atomic_dec(&m_nWriters); 00058 } 00059 }; 00060 #endif // __Simple_LOCK_H_Included__