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

系统编程

开发平台:

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 QATOMIC_GENERIC_H
  38. #define QATOMIC_GENERIC_H
  39. QT_BEGIN_HEADER
  40. QT_BEGIN_NAMESPACE
  41. #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE
  42. inline bool QBasicAtomicInt::isReferenceCountingNative()
  43. { return false; }
  44. inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
  45. { return false; }
  46. #define Q_ATOMIC_INT_TEST_AND_SET_IS_NOT_NATIVE
  47. inline bool QBasicAtomicInt::isTestAndSetNative()
  48. { return false; }
  49. inline bool QBasicAtomicInt::isTestAndSetWaitFree()
  50. { return false; }
  51. #define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NOT_NATIVE
  52. inline bool QBasicAtomicInt::isFetchAndStoreNative()
  53. { return false; }
  54. inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
  55. { return false; }
  56. #define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NOT_NATIVE
  57. inline bool QBasicAtomicInt::isFetchAndAddNative()
  58. { return false; }
  59. inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
  60. { return false; }
  61. #define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
  62. template <typename T>
  63. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
  64. { return false; }
  65. template <typename T>
  66. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
  67. { return false; }
  68. #define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
  69. template <typename T>
  70. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
  71. { return false; }
  72. template <typename T>
  73. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
  74. { return false; }
  75. #define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
  76. template <typename T>
  77. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
  78. { return false; }
  79. template <typename T>
  80. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
  81. { return false; }
  82. Q_CORE_EXPORT bool QBasicAtomicInt_testAndSetOrdered(volatile int *, int, int);
  83. Q_CORE_EXPORT int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *, int);
  84. Q_CORE_EXPORT int QBasicAtomicInt_fetchAndAddOrdered(volatile int *, int);
  85. Q_CORE_EXPORT bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *, void *, void *);
  86. Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *, void *);
  87. Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *, qptrdiff);
  88. // Reference counting
  89. inline bool QBasicAtomicInt::ref()
  90. {
  91.     return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, 1) != -1;
  92. }
  93. inline bool QBasicAtomicInt::deref()
  94. {
  95.     return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, -1) != 1;
  96. }
  97. // Test and set for integers
  98. inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
  99. {
  100.     return QBasicAtomicInt_testAndSetOrdered(&_q_value, expectedValue, newValue);
  101. }
  102. inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
  103. {
  104.     return testAndSetOrdered(expectedValue, newValue);
  105. }
  106. inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
  107. {
  108.     return testAndSetOrdered(expectedValue, newValue);
  109. }
  110. inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
  111. {
  112.     return testAndSetOrdered(expectedValue, newValue);
  113. }
  114. // Fetch and store for integers
  115. inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
  116. {
  117.     return QBasicAtomicInt_fetchAndStoreOrdered(&_q_value, newValue);
  118. }
  119. inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
  120. {
  121.     return fetchAndStoreOrdered(newValue);
  122. }
  123. inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
  124. {
  125.     return fetchAndStoreOrdered(newValue);
  126. }
  127. inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
  128. {
  129.     return fetchAndStoreOrdered(newValue);
  130. }
  131. // Fetch and add for integers
  132. inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
  133. {
  134.     return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, valueToAdd);
  135. }
  136. inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
  137. {
  138.     return fetchAndAddOrdered(valueToAdd);
  139. }
  140. inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
  141. {
  142.     return fetchAndAddOrdered(valueToAdd);
  143. }
  144. inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
  145. {
  146.     return fetchAndAddOrdered(valueToAdd);
  147. }
  148. // Test and set for pointers
  149. template <typename T>
  150. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
  151. {
  152.     union { T * volatile * typed; void * volatile * voidp; } pointer;
  153.     pointer.typed = &_q_value;
  154.     return QBasicAtomicPointer_testAndSetOrdered(pointer.voidp, expectedValue, newValue);
  155. }
  156. template <typename T>
  157. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
  158. {
  159.     return testAndSetOrdered(expectedValue, newValue);
  160. }
  161. template <typename T>
  162. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
  163. {
  164.     return testAndSetOrdered(expectedValue, newValue);
  165. }
  166. template <typename T>
  167. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
  168. {
  169.     return testAndSetOrdered(expectedValue, newValue);
  170. }
  171. // Fetch and store for pointers
  172. template <typename T>
  173. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
  174. {
  175.     union { T * volatile * typed; void * volatile * voidp; } pointer;
  176.     union { T *typed; void *voidp; } returnValue;
  177.     pointer.typed = &_q_value;
  178.     returnValue.voidp = QBasicAtomicPointer_fetchAndStoreOrdered(pointer.voidp, newValue);
  179.     return returnValue.typed;
  180. }
  181. template <typename T>
  182. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
  183. {
  184.     return fetchAndStoreOrdered(newValue);
  185. }
  186. template <typename T>
  187. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
  188. {
  189.     return fetchAndStoreOrdered(newValue);
  190. }
  191. template <typename T>
  192. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
  193. {
  194.     return fetchAndStoreOrdered(newValue);
  195. }
  196. // Fetch and add for pointers
  197. template <typename T>
  198. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
  199. {
  200.     union { T * volatile *typed; void * volatile *voidp; } pointer;
  201.     union { T *typed; void *voidp; } returnValue;
  202.     pointer.typed = &_q_value;
  203.     returnValue.voidp = QBasicAtomicPointer_fetchAndAddOrdered(pointer.voidp, valueToAdd * sizeof(T));
  204.     return returnValue.typed;
  205. }
  206. template <typename T>
  207. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
  208. {
  209.     return fetchAndAddOrdered(valueToAdd);
  210. }
  211. template <typename T>
  212. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
  213. {
  214.     return fetchAndAddOrdered(valueToAdd);
  215. }
  216. template <typename T>
  217. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
  218. {
  219.     return fetchAndAddOrdered(valueToAdd);
  220. }
  221. QT_END_NAMESPACE
  222. QT_END_HEADER
  223. #endif // QATOMIC_GENERIC_H