[vlc-devel] [PATCH 1/6] cxx helpers: Add wrappers for mutex/cond/sem
Steve Lhomme
robux4 at ycbcr.xyz
Tue Aug 21 07:08:51 CEST 2018
:+1: it makes the C++ code some much more readable.
On 20/08/2018 17:07, Romain Vimont wrote:
> LGTM for the whole patchset (once indentation is fixed in new blocks).
>
> On Mon, Aug 20, 2018 at 02:38:15PM +0200, Hugo Beauzée-Luyssen wrote:
>> I'm not sure if this belongs more into cxx_helpers.hpp or in
>> vlc_threads.h
>> vlc_threads.h would prevent checking for VLC_THREADS_H_, which is a bit
>> strange, however we don't want to force vlc_threads.h to be included to
>> allow vlc_cxx_helpers to be used
>> vlc_cxx_helpers.hpp on the other hand feels like the correct place to
>> add C++ helpers.
>> ---
>> include/vlc_cxx_helpers.hpp | 140 ++++++++++++++++++++++++++++++++++++
>> 1 file changed, 140 insertions(+)
>>
>> diff --git a/include/vlc_cxx_helpers.hpp b/include/vlc_cxx_helpers.hpp
>> index 425ae878b3..6b6381eed0 100644
>> --- a/include/vlc_cxx_helpers.hpp
>> +++ b/include/vlc_cxx_helpers.hpp
>> @@ -115,6 +115,146 @@ inline std::unique_ptr<T[], void (*)(void*)> wrap_carray( T* ptr ) noexcept
>>
>> } // anonymous namespace
>>
>> +// Don't require pre-inclusion of vlc_threads.h:
>> +#if defined(VLC_THREADS_H_)
>> +
>> +namespace threads
>> +{
>> +
>> +class mutex
>> +{
>> +public:
>> + mutex() noexcept
>> + {
>> + vlc_mutex_init( &m_mutex );
>> + }
>> + ~mutex()
>> + {
>> + vlc_mutex_destroy( &m_mutex );
>> + }
>> +
>> + mutex( const mutex& ) = delete;
>> + mutex& operator=( const mutex& ) = delete;
>> + mutex( mutex&& ) = delete;
>> + mutex& operator=( mutex&& ) = delete;
>> +
>> + void lock() noexcept
>> + {
>> + vlc_mutex_lock( &m_mutex );
>> + }
>> + void unlock() noexcept
>> + {
>> + vlc_mutex_unlock( &m_mutex );
>> + }
>> +
>> +private:
>> + vlc_mutex_t m_mutex;
>> + friend class condition_variable;
>> + friend class mutex_locker;
>> +};
>> +
>> +class condition_variable
>> +{
>> +public:
>> + condition_variable() noexcept
>> + {
>> + vlc_cond_init( &m_cond );
>> + }
>> + ~condition_variable()
>> + {
>> + vlc_cond_destroy( &m_cond );
>> + }
>> + void signal() noexcept
>> + {
>> + vlc_cond_signal( &m_cond );
>> + }
>> + void broadcast() noexcept
>> + {
>> + vlc_cond_broadcast( &m_cond );
>> + }
>> + void wait( mutex& mutex ) noexcept
>> + {
>> + vlc_cond_wait( &m_cond, &mutex.m_mutex );
>> + }
>> + int timedwait( mutex& mutex, vlc_tick_t deadline ) noexcept
>> + {
>> + return vlc_cond_timedwait( &m_cond, &mutex.m_mutex, deadline );
>> + }
>> +
>> +private:
>> + vlc_cond_t m_cond;
>> +};
>> +
>> +class mutex_locker
>> +{
>> +public:
>> + mutex_locker( vlc_mutex_t* m ) noexcept
>> + : m_mutex( m )
>> + {
>> + vlc_mutex_lock( m_mutex );
>> + }
>> + mutex_locker( mutex& m ) noexcept
>> + : mutex_locker( &m.m_mutex )
>> + {
>> + }
>> + ~mutex_locker()
>> + {
>> + vlc_mutex_unlock( m_mutex );
>> + }
>> + mutex_locker( const mutex_locker& ) = delete;
>> + mutex_locker& operator=( const mutex_locker& ) = delete;
>> + mutex_locker( mutex_locker&& ) = delete;
>> + mutex_locker& operator=( mutex_locker&& ) = delete;
>> +
>> +private:
>> + vlc_mutex_t* m_mutex;
>> +};
>> +
>> +class semaphore
>> +{
>> +public:
>> + semaphore() noexcept
>> + {
>> + vlc_sem_init( &m_sem, 0 );
>> + }
>> + semaphore( unsigned int count ) noexcept
>> + {
>> + vlc_sem_init( &m_sem, count );
>> + }
>> + ~semaphore()
>> + {
>> + vlc_sem_destroy( &m_sem );
>> + }
>> +
>> + semaphore( const semaphore& ) = delete;
>> + semaphore& operator=( const semaphore& ) = delete;
>> + semaphore( semaphore&& ) = delete;
>> + semaphore& operator=( semaphore&& ) = delete;
>> +
>> + int post() noexcept
>> + {
>> + return vlc_sem_post( &m_sem );
>> + }
>> + void wait() noexcept
>> + {
>> + vlc_sem_wait( &m_sem );
>> + }
>> +
>> +#ifdef VLC_INTERRUPT_H
>> + int wait_i11e() noexcept
>> + {
>> + return vlc_sem_wait_i11e( &m_sem );
>> + }
>> +#endif
>> +
>> +private:
>> + vlc_sem_t m_sem;
>> +};
>> +
>> +}
>> +
>> +#endif
>> +
>> } // namespace vlc
>>
>> #endif
>> --
>> 2.18.0
>>
>> _______________________________________________
>> vlc-devel mailing list
>> To unsubscribe or modify your subscription options:
>> https://mailman.videolan.org/listinfo/vlc-devel
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list