Ticket #2918: shared_mutex.hpp.patch
File shared_mutex.hpp.patch, 3.1 KB (added by , 14 years ago) |
---|
-
shared_mutex.hpp
49 49 return *reinterpret_cast<T const*>(&res); 50 50 } 51 51 52 enum 53 { 54 unlock_sem = 0, 55 exclusive_sem = 1 56 }; 57 52 58 state_data state; 53 59 detail::win32::handle semaphores[2]; 54 detail::win32::handle &unlock_sem;55 detail::win32::handle &exclusive_sem;56 60 detail::win32::handle upgrade_sem; 57 61 58 62 void release_waiters(state_data old_state) 59 63 { 60 64 if(old_state.exclusive_waiting) 61 65 { 62 BOOST_VERIFY(detail::win32::ReleaseSemaphore( exclusive_sem,1,0)!=0);66 BOOST_VERIFY(detail::win32::ReleaseSemaphore(semaphores[exclusive_sem],1,0)!=0); 63 67 } 64 68 65 69 if(old_state.shared_waiting || old_state.exclusive_waiting) 66 70 { 67 BOOST_VERIFY(detail::win32::ReleaseSemaphore( unlock_sem,old_state.shared_waiting + (old_state.exclusive_waiting?1:0),0)!=0);71 BOOST_VERIFY(detail::win32::ReleaseSemaphore(semaphores[unlock_sem],old_state.shared_waiting + (old_state.exclusive_waiting?1:0),0)!=0); 68 72 } 69 73 } 70 74 71 75 72 76 public: 73 shared_mutex(): 74 unlock_sem(semaphores[0]), 75 exclusive_sem(semaphores[1]) 77 shared_mutex() 76 78 { 77 unlock_sem=detail::win32::create_anonymous_semaphore(0,LONG_MAX);78 exclusive_sem=detail::win32::create_anonymous_semaphore(0,LONG_MAX);79 semaphores[unlock_sem]=detail::win32::create_anonymous_semaphore(0,LONG_MAX); 80 semaphores[exclusive_sem]=detail::win32::create_anonymous_semaphore(0,LONG_MAX); 79 81 upgrade_sem=detail::win32::create_anonymous_semaphore(0,LONG_MAX); 80 82 state_data state_={0}; 81 83 state=state_; … … 84 86 ~shared_mutex() 85 87 { 86 88 detail::win32::CloseHandle(upgrade_sem); 87 detail::win32::CloseHandle( unlock_sem);88 detail::win32::CloseHandle( exclusive_sem);89 detail::win32::CloseHandle(semaphores[unlock_sem]); 90 detail::win32::CloseHandle(semaphores[exclusive_sem]); 89 91 } 90 92 91 93 bool try_lock_shared() … … 150 152 return true; 151 153 } 152 154 153 unsigned long const res=detail::win32::WaitForSingleObject( unlock_sem,::boost::detail::get_milliseconds_until(wait_until));155 unsigned long const res=detail::win32::WaitForSingleObject(semaphores[unlock_sem],::boost::detail::get_milliseconds_until(wait_until)); 154 156 if(res==detail::win32::timeout) 155 157 { 156 158 for(;;) … … 394 396 return; 395 397 } 396 398 397 BOOST_VERIFY(!detail::win32::WaitForSingleObject( unlock_sem,detail::win32::infinite));399 BOOST_VERIFY(!detail::win32::WaitForSingleObject(semaphores[unlock_sem],detail::win32::infinite)); 398 400 } 399 401 } 400 402