qmutex.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:5k
源码类别:

系统编程

开发平台:

Unix_Linux

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the QtCore module of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef QMUTEX_H
  38. #define QMUTEX_H
  39. #include <QtCore/qglobal.h>
  40. #include <new>
  41. QT_BEGIN_HEADER
  42. QT_BEGIN_NAMESPACE
  43. QT_MODULE(Core)
  44. #ifndef QT_NO_THREAD
  45. class QMutexPrivate;
  46. class Q_CORE_EXPORT QMutex
  47. {
  48.     friend class QWaitCondition;
  49.     friend class QWaitConditionPrivate;
  50. public:
  51.     enum RecursionMode { NonRecursive, Recursive };
  52.     explicit QMutex(RecursionMode mode = NonRecursive);
  53.     ~QMutex();
  54.     void lock();
  55.     bool tryLock();
  56.     bool tryLock(int timeout);
  57.     void unlock();
  58. #if defined(QT3_SUPPORT)
  59.     inline QT3_SUPPORT bool locked()
  60.     {
  61.         if (!tryLock())
  62.             return true;
  63.         unlock();
  64.         return false;
  65.     }
  66.     inline QT3_SUPPORT_CONSTRUCTOR QMutex(bool recursive)
  67.     {
  68.         new (this) QMutex(recursive ? Recursive : NonRecursive);
  69.     }
  70. #endif
  71. private:
  72.     Q_DISABLE_COPY(QMutex)
  73.     QMutexPrivate *d;
  74. };
  75. class Q_CORE_EXPORT QMutexLocker
  76. {
  77. public:
  78.     inline explicit QMutexLocker(QMutex *m)
  79.         : mtx(m)
  80.     {
  81.         Q_ASSERT_X((val & quintptr(1u)) == quintptr(0),
  82.                    "QMutexLocker", "QMutex pointer is misaligned");
  83.         relock();
  84.     }
  85.     inline ~QMutexLocker() { unlock(); }
  86.     inline void unlock()
  87.     {
  88.         if (mtx) {
  89.             if ((val & quintptr(1u)) == quintptr(1u)) {
  90.                 val &= ~quintptr(1u);
  91.                 mtx->unlock();
  92.             }
  93.         }
  94.     }
  95.     inline void relock()
  96.     {
  97.         if (mtx) {
  98.             if ((val & quintptr(1u)) == quintptr(0u)) {
  99.                 mtx->lock();
  100.                 val |= quintptr(1u);
  101.             }
  102.         }
  103.     }
  104. #if defined(Q_CC_MSVC)
  105. #pragma warning( push )
  106. #pragma warning( disable : 4312 ) // ignoring the warning from /Wp64
  107. #endif
  108.     inline QMutex *mutex() const
  109.     {
  110.         return reinterpret_cast<QMutex *>(val & ~quintptr(1u));
  111.     }
  112. #if defined(Q_CC_MSVC)
  113. #pragma warning( pop )
  114. #endif
  115. private:
  116.     Q_DISABLE_COPY(QMutexLocker)
  117.     union {
  118.         QMutex *mtx;
  119.         quintptr val;
  120.     };
  121. };
  122. #else // QT_NO_THREAD
  123. class Q_CORE_EXPORT QMutex
  124. {
  125. public:
  126.     enum RecursionMode { NonRecursive, Recursive };
  127.     inline explicit QMutex(RecursionMode mode = NonRecursive) { Q_UNUSED(mode); }
  128.     inline ~QMutex() {}
  129.     static inline void lock() {}
  130.     static inline bool tryLock() { return true; }
  131.     static inline bool tryLock(int timeout) { Q_UNUSED(timeout); return true; }
  132.     static void unlock() {}
  133. #if defined(QT3_SUPPORT)
  134.     static inline QT3_SUPPORT bool locked() { return false; }
  135. #endif
  136. private:
  137.     Q_DISABLE_COPY(QMutex)
  138. };
  139. class Q_CORE_EXPORT QMutexLocker
  140. {
  141. public:
  142.     inline explicit QMutexLocker(QMutex *) {}
  143.     inline ~QMutexLocker() {}
  144.     static inline void unlock() {}
  145.     static void relock() {}
  146.     static inline QMutex *mutex() { return 0; }
  147. private:
  148.     Q_DISABLE_COPY(QMutexLocker)
  149. };
  150. #endif // QT_NO_THREAD
  151. QT_END_NAMESPACE
  152. QT_END_HEADER
  153. #endif // QMUTEX_H