dlib C++ Library - auto_mutex_extension.h

    // Copyright (C) 2005  Davis E. King (davisking@users.sourceforge.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #ifndef DLIB_AUTO_MUTEX_EXTENSIOn_
    #define DLIB_AUTO_MUTEX_EXTENSIOn_

    #include "threads_kernel.h"
    #include "rmutex_extension.h"
    #include "auto_mutex_extension_abstract.h"

    namespace dlib
    {

    // ----------------------------------------------------------------------------------------

        class auto_mutex
        {
            /*!
                INITIAL VALUE
                    - if (m != 0) then
                        - the mutex pointed to by m is locked
                    - if (r != 0) then
                        - the mutex pointed to by r is locked
                    - exactly one of r or m is not 0.

                CONVENTION
                    - if (m != 0) then
                        - the mutex pointed to by m is locked
                    - if (r != 0) then
                        - the mutex pointed to by r is locked
                    - exactly one of r or m is not 0.
            !*/
        public:

            auto_mutex (
                const mutex& m_
            ) : m(&m_),
                r(0)
            {
                m->lock();
            }

            auto_mutex (
                const rmutex& r_
            ) : m(0),
                r(&r_)
            {
                r->lock();
            }

            ~auto_mutex (
            )
            {
                if (m != 0)
                    m->unlock();
                else
                    r->unlock();
            }

        private:

            const mutex* m;
            const rmutex* r;

            // restricted functions
            auto_mutex(auto_mutex&);        // copy constructor
            auto_mutex& operator=(auto_mutex&);    // assignment operator
        };

    // ----------------------------------------------------------------------------------------

    }

    #endif // DLIB_AUTO_MUTEX_EXTENSIOn_