AutoLock.h revision 16f69245c1929bf94eb7e61017b1de96c1f8ffcf
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/** @file
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Automatic locks, implementation
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Copyright (C) 2006-2009 Sun Microsystems, Inc.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * This file is part of VirtualBox Open Source Edition (OSE), as
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * available from http://www.virtualbox.org. This file is free software;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * you can redistribute it and/or modify it under the terms of the GNU
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * General Public License (GPL) as published by the Free Software
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Foundation, in version 2 as it comes in the "COPYING" file of the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Clara, CA 95054 USA or visit http://www.sun.com if you need
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * additional information or have any questions.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#ifndef ____H_AUTOLOCK
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram#define ____H_AUTOLOCK
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#include <iprt/types.h>
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// macros for automatic lock validation; these will amount to nothing
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// unless lock validation is enabled for the runtime
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#if defined(RT_LOCK_STRICT) && defined (DEBUG)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#define VBOX_WITH_MAIN_LOCK_VALIDATION
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define COMMA_LOCKVAL_SRC_POS , RT_SRC_POS
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define LOCKVAL_SRC_POS_DECL RT_SRC_POS_DECL
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define COMMA_LOCKVAL_SRC_POS_DECL , RT_SRC_POS_DECL
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define LOCKVAL_SRC_POS_ARGS RT_SRC_POS_ARGS
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define COMMA_LOCKVAL_SRC_POS_ARGS , RT_SRC_POS_ARGS
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#else
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define COMMA_LOCKVAL_SRC_POS
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define LOCKVAL_SRC_POS_DECL
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define COMMA_LOCKVAL_SRC_POS_DECL
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define LOCKVAL_SRC_POS_ARGS
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail# define COMMA_LOCKVAL_SRC_POS_ARGS
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#endif
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailnamespace util
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// Order classes for lock validation
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * IPRT now has a sophisticated system of run-time locking classes to validate
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * locking order. Since the Main code is handled by simpler minds, we want
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * compile-time constants for simplicity, and we'll look up the run-time classes
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * in AutoLock.cpp transparently. These are passed to the constructors of the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * LockHandle classes.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailenum VBoxLockingClass
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_NONE = 0,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_VIRTUALBOXOBJECT = 1, // highest order: VirtualBox object lock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_VIRTUALBOXLIST = 2, // lock protecting a list in VirtualBox object
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail // (machines list, hard disk tree, shared folders list, ...)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_USBPROXYSERVICE = 3, // USB proxy service object lock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_HOSTOBJECT = 4, // Host object lock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_MACHINEOBJECT = 5, // Machine object lock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_MACHINELIST = 6, // lock protecting a list in a Machine object
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_SNAPSHOTOBJECT = 7, // snapshot object locks (need to have lower order
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail // than both MACHINEOBJECT and LOCKCLASS_MACHINELIST since
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail // the list of snapshots in Machine is LOCKCLASS_MACHINELIST)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_OTHEROBJECT = 8, // any regular object member variable lock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_USBLIST = 9, // temporary hack to avoid having to clean up the USB filters
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail // too much @todo r=dj get rid of this!
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LOCKCLASS_PROGRESSLIST = 10, // list of progress objects in VirtualBox; no other object lock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail // may be held after this!
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram LOCKCLASS_OBJECTSTATE = 11 // object state lock (handled by AutoCaller classes)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailvoid InitAutoLockSystem();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// LockHandle and friends
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Abstract base class for semaphore handles (RWLockHandle and WriteLockHandle).
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Don't use this directly, but this implements lock validation for them.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailclass LockHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LockHandle()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~LockHandle()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {}
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Returns @c true if the current thread holds a write lock on this
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * read/write semaphore. Intended for debugging only.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual bool isWriteLockOnCurrentThread() const = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Returns the current write lock level of this semaphore. The lock level
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * determines the number of nested #lock() calls on the given semaphore
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * handle.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Note that this call is valid only when the current thread owns a write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * lock on the given semaphore handle and will assert otherwise.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual uint32_t writeLockLevel() const = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void lockWrite(LOCKVAL_SRC_POS_DECL) = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void unlockWrite() = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void lockRead(LOCKVAL_SRC_POS_DECL) = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void unlockRead() = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#ifdef VBOX_WITH_MAIN_LOCK_VALIDATION
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual const char* describe() const = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#endif
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprivate:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail // prohibit copy + assignment
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LockHandle(const LockHandle&);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LockHandle& operator=(const LockHandle&);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Full-featured read/write semaphore handle implementation.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * This is an auxiliary base class for classes that need full-featured
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * read/write locking as described in the AutoWriteLock class documentation.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Instances of classes inherited from this class can be passed as arguments to
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * the AutoWriteLock and AutoReadLock constructors.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailclass RWLockHandle : public LockHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail RWLockHandle(VBoxLockingClass lockClass);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~RWLockHandle();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual bool isWriteLockOnCurrentThread() const;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void lockWrite(LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void unlockWrite();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void lockRead(LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void unlockRead();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual uint32_t writeLockLevel() const;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#ifdef VBOX_WITH_MAIN_LOCK_VALIDATION
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual const char* describe() const;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#endif
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprivate:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct Data;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail Data *m;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Write-only semaphore handle implementation.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * This is an auxiliary base class for classes that need write-only (exclusive)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * locking and do not need read (shared) locking. This implementation uses a
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * cheap and fast critical section for both lockWrite() and lockRead() methods
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * which makes a lockRead() call fully equivalent to the lockWrite() call and
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * therefore makes it pointless to use instahces of this class with
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * AutoReadLock instances -- shared locking will not be possible anyway and
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * any call to lock() will block if there are lock owners on other threads.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Use with care only when absolutely sure that shared locks are not necessary.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailclass WriteLockHandle : public LockHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail WriteLockHandle(VBoxLockingClass lockClass);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~WriteLockHandle();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual bool isWriteLockOnCurrentThread() const;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void lockWrite(LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void unlockWrite();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void lockRead(LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void unlockRead();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual uint32_t writeLockLevel() const;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#ifdef VBOX_WITH_MAIN_LOCK_VALIDATION
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual const char* describe() const;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#endif
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprivate:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct Data;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail Data *m;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// Lockable
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Lockable interface.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * This is an abstract base for classes that need read/write locking. Unlike
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * RWLockHandle and other classes that makes the read/write semaphore a part of
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * class data, this class allows subclasses to decide which semaphore handle to
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * use.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailclass Lockable
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Returns a pointer to a LockHandle used by AutoWriteLock/AutoReadLock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * for locking. Subclasses are allowed to return @c NULL -- in this case,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * the AutoWriteLock/AutoReadLock object constructed using an instance of
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * such subclass will simply turn into no-op.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual LockHandle *lockHandle() const = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Equivalent to <tt>#lockHandle()->isWriteLockOnCurrentThread()</tt>.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Returns @c false if lockHandle() returns @c NULL.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bool isWriteLockOnCurrentThread()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LockHandle *h = lockHandle();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail return h ? h->isWriteLockOnCurrentThread() : false;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// AutoLockBase
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Abstract base class for all autolocks.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * This cannot be used directly. Use AutoReadLock or AutoWriteLock or AutoMultiWriteLock2/3
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * which directly and indirectly derive from this.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * In the implementation, the instance data contains a list of lock handles.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * The class provides some utility functions to help locking and unlocking
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * them.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailclass AutoLockBase
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprotected:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoLockBase(uint32_t cHandles
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoLockBase(uint32_t cHandles,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LockHandle *pHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~AutoLockBase();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail struct Data;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail Data *m;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void callLockImpl(LockHandle &l) = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void callUnlockImpl(LockHandle &l) = 0;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void callLockOnAllHandles();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void callUnlockOnAllHandles();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void cleanup();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void release();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailprivate:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail // prohibit copy + assignment
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoLockBase(const AutoLockBase&);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoLockBase& operator=(const AutoLockBase&);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// AutoReadLock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Automatic read lock. Use this with a RWLockHandle to request a read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore in read mode. You can also use this with a WriteLockHandle but
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * that makes little sense since they treat read mode like write mode.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * If constructed with a RWLockHandle or an instance of Lockable (which in
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * practice means any VirtualBoxBase derivative), it autoamtically requests
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * the lock in read mode and releases the read lock in the destructor.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailclass AutoReadLock : public AutoLockBase
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a null instance that does not manage any read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Note that all method calls on a null instance are no-ops. This allows to
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * have the code where lock protection can be selected (or omitted) at
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * runtime.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoReadLock(LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a new instance that will start managing the given read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore by requesting a read lock.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoReadLock(LockHandle *aHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a new instance that will start managing the given read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore by requesting a read lock.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoReadLock(LockHandle &aHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail &aHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a new instance that will start managing the given read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore by requesting a read lock.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoReadLock(const Lockable &aLockable
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aLockable.lockHandle()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a new instance that will start managing the given read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore by requesting a read lock.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoReadLock(const Lockable *aLockable
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aLockable ? aLockable->lockHandle() : NULL
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~AutoReadLock();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void callLockImpl(LockHandle &l);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void callUnlockImpl(LockHandle &l);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// AutoWriteLockBase
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Base class for all auto write locks.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * This cannot be used directly. Use AutoWriteLock or AutoMultiWriteLock2/3
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * which derive from this.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * In addition to utility methods for subclasses, this implements the public
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * leave/enter/maybeLeave/maybeEnter methods, which are common to all
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * write locks.
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram */
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaramclass AutoWriteLockBase : public AutoLockBase
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram{
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaramprotected:
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram AutoWriteLockBase(uint32_t cHandles
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram COMMA_LOCKVAL_SRC_POS_DECL)
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram : AutoLockBase(cHandles
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram COMMA_LOCKVAL_SRC_POS_ARGS)
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram { }
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram AutoWriteLockBase(uint32_t cHandles,
ec3706caae60369bd59b4a7a2de365fc74637504Vasumathi Sundaram LockHandle *pHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoLockBase(cHandles,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail pHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~AutoWriteLockBase()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void callLockImpl(LockHandle &l);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual void callUnlockImpl(LockHandle &l);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void leave();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void enter();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void maybeLeave();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void maybeEnter();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// AutoWriteLock
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Automatic write lock. Use this with a RWLockHandle to request a read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore in write mode. There can only ever be one writer of a read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore: while the lock is held in write mode, no other writer or reader
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * can request the semaphore and will block.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * If constructed with a RWLockHandle or an instance of Lockable (which in
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * practice means any VirtualBoxBase derivative), it autoamtically requests
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * the lock in write mode and releases the write lock in the destructor.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * When used with a WriteLockHandle, it requests the semaphore contained therein
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * exclusively.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailclass AutoWriteLock : public AutoWriteLockBase
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a null instance that does not manage any read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Note that all method calls on a null instance are no-ops. This allows to
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * have the code where lock protection can be selected (or omitted) at
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * runtime.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoWriteLock(LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoWriteLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail NULL
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail { }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a new instance that will start managing the given read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore by requesting a write lock.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoWriteLock(LockHandle *aHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoWriteLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a new instance that will start managing the given read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore by requesting a write lock.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoWriteLock(LockHandle &aHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoWriteLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail &aHandle
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a new instance that will start managing the given read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore by requesting a write lock.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoWriteLock(const Lockable &aLockable
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoWriteLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aLockable.lockHandle()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Constructs a new instance that will start managing the given read/write
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * semaphore by requesting a write lock.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoWriteLock(const Lockable *aLockable
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail : AutoWriteLockBase(1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail aLockable ? aLockable->lockHandle() : NULL
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_ARGS)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail acquire();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Release all write locks acquired by this instance through the #lock()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * call and destroys the instance.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * Note that if there there are nested #lock() calls without the
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * corresponding number of #unlock() calls when the destructor is called, it
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * will assert. This is because having an unbalanced number of nested locks
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * is a program logic error which must be fixed.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~AutoWriteLock()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cleanup();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void attach(LockHandle *aHandle);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /** @see attach (LockHandle *) */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void attach(LockHandle &aHandle)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail attach(&aHandle);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /** @see attach (LockHandle *) */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void attach(const Lockable &aLockable)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail attach(aLockable.lockHandle());
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail /** @see attach (LockHandle *) */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail void attach(const Lockable *aLockable)
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail attach(aLockable ? aLockable->lockHandle() : NULL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail bool isWriteLockOnCurrentThread() const;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail uint32_t writeLockLevel() const;
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail// AutoMultiWriteLock*
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail//
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail////////////////////////////////////////////////////////////////////////////////
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * A multi-write-lock containing two other write locks.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
550b6e4083768ca350e9e7c3a1ebbf720b23dcadSowmini Varadhanclass AutoMultiWriteLock2 : public AutoWriteLockBase
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoMultiWriteLock2(Lockable *pl1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail Lockable *pl2
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoMultiWriteLock2(LockHandle *pl1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LockHandle *pl2
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~AutoMultiWriteLock2()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cleanup();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/**
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail * A multi-write-lock containing three other write locks.
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail *
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailclass AutoMultiWriteLock3 : public AutoWriteLockBase
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail{
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbailpublic:
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoMultiWriteLock3(Lockable *pl1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail Lockable *pl2,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail Lockable *pl3
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail AutoMultiWriteLock3(LockHandle *pl1,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LockHandle *pl2,
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail LockHandle *pl3
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail COMMA_LOCKVAL_SRC_POS_DECL);
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail virtual ~AutoMultiWriteLock3()
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail {
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail cleanup();
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail }
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail};
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail} /* namespace util */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail#endif // ____H_AUTOLOCK
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail/* vi: set tabstop=4 shiftwidth=4 expandtab: */
6e91bba0d6c6bdabbba62cefae583715a4a58e2aGirish Moodalbail