qatomic_parisc.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_PARISC_H
  38. #define QATOMIC_PARISC_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. extern "C" {
  83.     Q_CORE_EXPORT void q_atomic_lock(int *lock);
  84.     Q_CORE_EXPORT void q_atomic_unlock(int *lock);
  85. }
  86. // Reference counting
  87. inline bool QBasicAtomicInt::ref()
  88. {
  89.     q_atomic_lock(_q_lock);
  90.     bool ret = (++_q_value != 0);
  91.     q_atomic_unlock(_q_lock);
  92.     return ret;
  93. }
  94. inline bool QBasicAtomicInt::deref()
  95. {
  96.     q_atomic_lock(_q_lock);
  97.     bool ret = (--_q_value != 0);
  98.     q_atomic_unlock(_q_lock);
  99.     return ret;
  100. }
  101. // Test-and-set for integers
  102. inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
  103. {
  104.     q_atomic_lock(_q_lock);
  105.     if (_q_value == expectedValue) {
  106.         _q_value = newValue;
  107.         q_atomic_unlock(_q_lock);
  108.         return true;
  109.     }
  110.     q_atomic_unlock(_q_lock);
  111.     return false;
  112. }
  113. inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
  114. {
  115.     return testAndSetOrdered(expectedValue, newValue);
  116. }
  117. inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
  118. {
  119.     return testAndSetOrdered(expectedValue, newValue);
  120. }
  121. inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
  122. {
  123.     return testAndSetOrdered(expectedValue, newValue);
  124. }
  125. // Fetch-and-store for integers
  126. inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
  127. {
  128.     q_atomic_lock(_q_lock);
  129.     int returnValue = _q_value;
  130.     _q_value = newValue;
  131.     q_atomic_unlock(_q_lock);
  132.     return returnValue;
  133. }
  134. inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
  135. {
  136.     return fetchAndStoreOrdered(newValue);
  137. }
  138. inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
  139. {
  140.     return fetchAndStoreOrdered(newValue);
  141. }
  142. inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
  143. {
  144.     return fetchAndStoreOrdered(newValue);
  145. }
  146. // Fetch-and-add for integers
  147. inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
  148. {
  149.     q_atomic_lock(_q_lock);
  150.     int originalValue = _q_value;
  151.     _q_value += valueToAdd;
  152.     q_atomic_unlock(_q_lock);
  153.     return originalValue;
  154. }
  155. inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
  156. {
  157.     return fetchAndAddOrdered(valueToAdd);
  158. }
  159. inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
  160. {
  161.     return fetchAndAddOrdered(valueToAdd);
  162. }
  163. inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
  164. {
  165.     return fetchAndAddOrdered(valueToAdd);
  166. }
  167. // Test and set for pointers
  168. template <typename T>
  169. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
  170. {
  171.     q_atomic_lock(_q_lock);
  172.     if (_q_value == expectedValue) {
  173.         _q_value = newValue;
  174.         q_atomic_unlock(_q_lock);
  175.         return true;
  176.     }
  177.     q_atomic_unlock(_q_lock);
  178.     return false;
  179. }
  180. template <typename T>
  181. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
  182. {
  183.     return testAndSetOrdered(expectedValue, newValue);
  184. }
  185. template <typename T>
  186. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
  187. {
  188.     return testAndSetOrdered(expectedValue, newValue);
  189. }
  190. template <typename T>
  191. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
  192. {
  193.     return testAndSetOrdered(expectedValue, newValue);
  194. }
  195. // Fetch and store for pointers
  196. template <typename T>
  197. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
  198. {
  199.     q_atomic_lock(_q_lock);
  200.     T *returnValue = (_q_value);
  201.     _q_value = newValue;
  202.     q_atomic_unlock(_q_lock);
  203.     return returnValue;
  204. }
  205. template <typename T>
  206. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
  207. {
  208.     return fetchAndStoreOrdered(newValue);
  209. }
  210. template <typename T>
  211. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
  212. {
  213.     return fetchAndStoreOrdered(newValue);
  214. }
  215. template <typename T>
  216. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
  217. {
  218.     return fetchAndStoreOrdered(newValue);
  219. }
  220. // Fetch and add for pointers
  221. template <typename T>
  222. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
  223. {
  224.     q_atomic_lock(_q_lock);
  225.     T *returnValue = (_q_value);
  226.     _q_value += valueToAdd;
  227.     q_atomic_unlock(_q_lock);
  228.     return returnValue;
  229. }
  230. template <typename T>
  231. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
  232. {
  233.     return fetchAndAddOrdered(valueToAdd);
  234. }
  235. template <typename T>
  236. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
  237. {
  238.     return fetchAndAddOrdered(valueToAdd);
  239. }
  240. template <typename T>
  241. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
  242. {
  243.     return fetchAndAddOrdered(valueToAdd);
  244. }
  245. QT_END_NAMESPACE
  246. QT_END_HEADER
  247. #endif // QATOMIC_PARISC_H