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

系统编程

开发平台:

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_MIPS_H
  38. #define QATOMIC_MIPS_H
  39. QT_BEGIN_HEADER
  40. QT_BEGIN_NAMESPACE
  41. #define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE
  42. inline bool QBasicAtomicInt::isReferenceCountingNative()
  43. { return true; }
  44. inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
  45. { return false; }
  46. #define Q_ATOMIC_INT_TEST_AND_SET_IS_ALWAYS_NATIVE
  47. inline bool QBasicAtomicInt::isTestAndSetNative()
  48. { return true; }
  49. inline bool QBasicAtomicInt::isTestAndSetWaitFree()
  50. { return false; }
  51. #define Q_ATOMIC_INT_FETCH_AND_STORE_IS_ALWAYS_NATIVE
  52. inline bool QBasicAtomicInt::isFetchAndStoreNative()
  53. { return true; }
  54. inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
  55. { return false; }
  56. #define Q_ATOMIC_INT_FETCH_AND_ADD_IS_ALWAYS_NATIVE
  57. inline bool QBasicAtomicInt::isFetchAndAddNative()
  58. { return true; }
  59. inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
  60. { return false; }
  61. #define Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
  62. template <typename T>
  63. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
  64. { return true; }
  65. template <typename T>
  66. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
  67. { return false; }
  68. #define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE
  69. template <typename T>
  70. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
  71. { return true; }
  72. template <typename T>
  73. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
  74. { return false; }
  75. #define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE
  76. template <typename T>
  77. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
  78. { return true; }
  79. template <typename T>
  80. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
  81. { return false; }
  82. extern "C" {
  83.     Q_CORE_EXPORT int q_atomic_test_and_set_int(volatile int *ptr, int expected, int newval);
  84.     Q_CORE_EXPORT int q_atomic_test_and_set_acquire_int(volatile int *ptr, int expected, int newval);
  85.     Q_CORE_EXPORT int q_atomic_test_and_set_release_int(volatile int *ptr, int expected, int newval);
  86.     Q_CORE_EXPORT int q_atomic_test_and_set_ptr(volatile void *ptr, void *expected, void *newval);
  87.     Q_CORE_EXPORT int q_atomic_test_and_set_acquire_ptr(volatile void *ptr, void *expected, void *newval);
  88.     Q_CORE_EXPORT int q_atomic_test_and_set_release_ptr(volatile void *ptr, void *expected, void *newval);
  89. } // extern "C"
  90. inline bool QBasicAtomicInt::ref()
  91. {
  92.     register int expected;
  93.     for (;;) {
  94.         expected = _q_value;
  95.         if (q_atomic_test_and_set_int(&_q_value, expected, expected + 1))
  96.             break;
  97.     }
  98.     return expected != -1;
  99. }
  100. inline bool QBasicAtomicInt::deref()
  101. {
  102.     register int expected;
  103.     for (;;) {
  104.         expected = _q_value;
  105.         if (q_atomic_test_and_set_int(&_q_value, expected, expected - 1))
  106.             break;
  107.     }
  108.     return expected != 1;
  109. }
  110. inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
  111. {
  112.     return q_atomic_test_and_set_int(&_q_value, expectedValue, newValue) != 0;
  113. }
  114. inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
  115. {
  116.     return q_atomic_test_and_set_acquire_int(&_q_value, expectedValue, newValue) != 0;
  117. }
  118. inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
  119. {
  120.     return q_atomic_test_and_set_release_int(&_q_value, expectedValue, newValue) != 0;
  121. }
  122. inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
  123. {
  124.     return q_atomic_test_and_set_acquire_int(&_q_value, expectedValue, newValue) != 0;
  125. }
  126. inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
  127. {
  128.     int returnValue;
  129.     for (;;) {
  130.         returnValue = _q_value;
  131.         if (testAndSetRelaxed(returnValue, newValue))
  132.             break;
  133.     }
  134.     return returnValue;
  135. }
  136. inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
  137. {
  138.     int returnValue;
  139.     for (;;) {
  140.         returnValue = _q_value;
  141.         if (testAndSetAcquire(returnValue, newValue))
  142.             break;
  143.     }
  144.     return returnValue;
  145. }
  146. inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
  147. {
  148.     int returnValue;
  149.     for (;;) {
  150.         returnValue = _q_value;
  151.         if (testAndSetRelease(returnValue, newValue))
  152.             break;
  153.     }
  154.     return returnValue;
  155. }
  156. inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
  157. {
  158.     int returnValue;
  159.     for (;;) {
  160.         returnValue = _q_value;
  161.         if (testAndSetOrdered(returnValue, newValue))
  162.             break;
  163.     }
  164.     return returnValue;
  165. }
  166. inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
  167. {
  168.     int returnValue;
  169.     for (;;) {
  170.         returnValue = _q_value;
  171.         if (testAndSetRelaxed(returnValue, returnValue + valueToAdd))
  172.             break;
  173.     }
  174.     return returnValue;
  175. }
  176. inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
  177. {
  178.     int returnValue;
  179.     for (;;) {
  180.         returnValue = _q_value;
  181.         if (testAndSetAcquire(returnValue, returnValue + valueToAdd))
  182.             break;
  183.     }
  184.     return returnValue;
  185. }
  186. inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
  187. {
  188.     int returnValue;
  189.     for (;;) {
  190.         returnValue = _q_value;
  191.         if (testAndSetRelease(returnValue, returnValue + valueToAdd))
  192.             break;
  193.     }
  194.     return returnValue;
  195. }
  196. inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
  197. {
  198.     int returnValue;
  199.     for (;;) {
  200.         returnValue = _q_value;
  201.         if (testAndSetOrdered(returnValue, returnValue + valueToAdd))
  202.             break;
  203.     }
  204.     return returnValue;
  205. }
  206. template <typename T>
  207. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
  208. {
  209.     return q_atomic_test_and_set_ptr(&_q_value, expectedValue, newValue) != 0;
  210. }
  211. template <typename T>
  212. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
  213. {
  214.     return q_atomic_test_and_set_acquire_ptr(&_q_value, expectedValue, newValue) != 0;
  215. }
  216. template <typename T>
  217. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
  218. {
  219.     return q_atomic_test_and_set_release_ptr(&_q_value, expectedValue, newValue) != 0;
  220. }
  221. template <typename T>
  222. Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
  223. {
  224.     return q_atomic_test_and_set_acquire_ptr(&_q_value, expectedValue, newValue) != 0;
  225. }
  226. template <typename T>
  227. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
  228. {
  229.     T *returnValue;
  230.     for (;;) {
  231.         returnValue = (_q_value);
  232.         if (testAndSetRelaxed(returnValue, newValue))
  233.             break;
  234.     }
  235.     return returnValue;
  236. }
  237. template <typename T>
  238. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
  239. {
  240.     T *returnValue;
  241.     for (;;) {
  242.         returnValue = (_q_value);
  243.         if (testAndSetAcquire(returnValue, newValue))
  244.             break;
  245.     }
  246.     return returnValue;
  247. }
  248. template <typename T>
  249. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
  250. {
  251.     T *returnValue;
  252.     for (;;) {
  253.         returnValue = (_q_value);
  254.         if (testAndSetRelease(returnValue, newValue))
  255.             break;
  256.     }
  257.     return returnValue;
  258. }
  259. template <typename T>
  260. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
  261. {
  262.     T *returnValue;
  263.     for (;;) {
  264.         returnValue = (_q_value);
  265.         if (testAndSetOrdered(returnValue, newValue))
  266.             break;
  267.     }
  268.     return returnValue;
  269. }
  270. template <typename T>
  271. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
  272. {
  273.     T *returnValue;
  274.     for (;;) {
  275.         returnValue = (_q_value);
  276.         if (testAndSetRelaxed(returnValue, returnValue + valueToAdd))
  277.             break;
  278.     }
  279.     return returnValue;
  280. }
  281. template <typename T>
  282. Q_INLINE_TEMPLATE
  283. T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
  284. {
  285.     T *returnValue;
  286.     for (;;) {
  287.         returnValue = (_q_value);
  288.         if (testAndSetAcquire(returnValue, returnValue + valueToAdd))
  289.             break;
  290.     }
  291.     return returnValue;
  292. }
  293. template <typename T>
  294. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
  295. {
  296.     T *returnValue;
  297.     for (;;) {
  298.         returnValue = (_q_value);
  299.         if (testAndSetRelease(returnValue, returnValue + valueToAdd))
  300.             break;
  301.     }
  302.     return returnValue;
  303. }
  304. template <typename T>
  305. Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
  306. {
  307.     T *returnValue;
  308.     for (;;) {
  309.         returnValue = (_q_value);
  310.         if (testAndSetOrdered(returnValue, returnValue + valueToAdd))
  311.             break;
  312.     }
  313.     return returnValue;
  314. }
  315. QT_END_NAMESPACE
  316. QT_END_HEADER
  317. #endif // QATOMIC_MIPS_H