// Copyright (c) 2004 David Muse
// See the COPYING file for more information.

#ifndef RUDIMENTS_MUTEX_H
#define RUDIMENTS_MUTEX_H

#include <rudiments/private/mutexincludes.h>

// The mutex class provides an interface to pthreads mutual exclusion locks.

#ifdef RUDIMENTS_NAMESPACE
namespace rudiments {
#endif

class mutex {
        public:
                        mutex();
                        // Initialize a mutex.
                        mutex(pthread_mutex_t *mut);
                        // Attach already initialized "mut" to this instance.
                        ~mutex();
                        // Destroy the mutex.

                bool    lock();
                        // Lock the mutex.  Will wait until the lock succeds.
                        // Returns true on success and false if an error occurs.
                bool    tryLock();
                        // Try to lock the mutex.  Will return immediately
                        // if the mutex could not be locked, returning false
                        // and setting errno to EBUSY.
                        // Returns true on success and false if an error occurs.
                bool    unlock();
                        // Unlock the mutex.
                        // Returns true on success and false if an error occurs.

                pthread_mutex_t *getMutex();
                                // Returns the mutex used by
                                // the class internally.

        #include <rudiments/private/mutex.h>
};

#ifdef RUDIMENTS_NAMESPACE
}
#endif

#endif