Ticket #2918: shared_mutex.hpp.patch

File shared_mutex.hpp.patch, 3.1 KB (added by Andrey Semashev, 14 years ago)

The shared_mutex size optimization

  • shared_mutex.hpp

     
    4949            return *reinterpret_cast<T const*>(&res);
    5050        }
    5151
     52        enum
     53        {
     54            unlock_sem = 0,
     55            exclusive_sem = 1
     56        };
     57
    5258        state_data state;
    5359        detail::win32::handle semaphores[2];
    54         detail::win32::handle &unlock_sem;
    55         detail::win32::handle &exclusive_sem;
    5660        detail::win32::handle upgrade_sem;
    5761
    5862        void release_waiters(state_data old_state)
    5963        {
    6064            if(old_state.exclusive_waiting)
    6165            {
    62                 BOOST_VERIFY(detail::win32::ReleaseSemaphore(exclusive_sem,1,0)!=0);
     66                BOOST_VERIFY(detail::win32::ReleaseSemaphore(semaphores[exclusive_sem],1,0)!=0);
    6367            }
    6468                       
    6569            if(old_state.shared_waiting || old_state.exclusive_waiting)
    6670            {
    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);
    6872            }
    6973        }
    7074       
    7175
    7276    public:
    73         shared_mutex():
    74             unlock_sem(semaphores[0]),
    75             exclusive_sem(semaphores[1])
     77        shared_mutex()
    7678        {
    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);
    7981            upgrade_sem=detail::win32::create_anonymous_semaphore(0,LONG_MAX);
    8082            state_data state_={0};
    8183            state=state_;
     
    8486        ~shared_mutex()
    8587        {
    8688            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]);
    8991        }
    9092
    9193        bool try_lock_shared()
     
    150152                    return true;
    151153                }
    152154                   
    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));
    154156                if(res==detail::win32::timeout)
    155157                {
    156158                    for(;;)
     
    394396                    return;
    395397                }
    396398                   
    397                 BOOST_VERIFY(!detail::win32::WaitForSingleObject(unlock_sem,detail::win32::infinite));
     399                BOOST_VERIFY(!detail::win32::WaitForSingleObject(semaphores[unlock_sem],detail::win32::infinite));
    398400            }
    399401        }
    400402