src/corelib/arch/symbian/qatomic_symbian.cpp
changeset 19 fcece45ef507
parent 18 2f34d5167611
equal deleted inserted replaced
18:2f34d5167611 19:fcece45ef507
    39 **
    39 **
    40 ****************************************************************************/
    40 ****************************************************************************/
    41 
    41 
    42 #include <QtCore/qglobal.h>
    42 #include <QtCore/qglobal.h>
    43 #include <QtCore/qatomic.h>
    43 #include <QtCore/qatomic.h>
       
    44 
       
    45 #ifdef SYMBIAN_E32_ATOMIC_API
       
    46 #include <e32atomics.h>
       
    47 #endif
    44 
    48 
    45 #include <e32debug.h>
    49 #include <e32debug.h>
    46 
    50 
    47 QT_BEGIN_NAMESPACE
    51 QT_BEGIN_NAMESPACE
    48 
    52 
    77     TInt initThreadHandleCount;
    81     TInt initThreadHandleCount;
    78 } symbian_printExitInfo;
    82 } symbian_printExitInfo;
    79 
    83 
    80 Q_CORE_EXPORT bool QBasicAtomicInt::isReferenceCountingNative()
    84 Q_CORE_EXPORT bool QBasicAtomicInt::isReferenceCountingNative()
    81 {
    85 {
    82 #ifdef QT_HAVE_ARMV6
    86 #if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6)
    83     return true;
    87     return true;
    84 #else
    88 #else
    85     return false;
    89     return false;
    86 #endif
    90 #endif
    87 }
    91 }
    88 
    92 
    89 Q_CORE_EXPORT bool QBasicAtomicInt::isTestAndSetNative()
    93 Q_CORE_EXPORT bool QBasicAtomicInt::isTestAndSetNative()
    90 {
    94 {
    91 #ifdef QT_HAVE_ARMV6
    95 #if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6)
    92     return true;
    96     return true;
    93 #else
    97 #else
    94     return false;
    98     return false;
    95 #endif
    99 #endif
    96 }
   100 }
    97 
   101 
    98 Q_CORE_EXPORT bool QBasicAtomicInt::isFetchAndStoreNative()
   102 Q_CORE_EXPORT bool QBasicAtomicInt::isFetchAndStoreNative()
    99 {
   103 {
   100 #ifdef QT_HAVE_ARMV6
   104 #if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6)
   101     return true;
   105     return true;
   102 #else
   106 #else
   103     return false;
   107     return false;
   104 #endif
   108 #endif
   105 }
   109 }
   106 
   110 
   107 Q_CORE_EXPORT bool QBasicAtomicInt::isFetchAndAddNative()
   111 Q_CORE_EXPORT bool QBasicAtomicInt::isFetchAndAddNative()
   108 {
   112 {
   109 #ifdef QT_HAVE_ARMV6
   113 #if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6)
   110     return true;
   114     return true;
   111 #else
   115 #else
   112     return false;
   116     return false;
   113 #endif
   117 #endif
   114 }
   118 }
   115 
   119 
   116 Q_CORE_EXPORT bool QBasicAtomicPointer_isTestAndSetNative()
   120 Q_CORE_EXPORT bool QBasicAtomicPointer_isTestAndSetNative()
   117 {
   121 {
   118 #ifdef QT_HAVE_ARMV6
   122 #if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6)
   119     return true;
   123     return true;
   120 #else
   124 #else
   121     return false;
   125     return false;
   122 #endif
   126 #endif
   123 }
   127 }
   124 
   128 
   125 Q_CORE_EXPORT bool QBasicAtomicPointer_isFetchAndStoreNative()
   129 Q_CORE_EXPORT bool QBasicAtomicPointer_isFetchAndStoreNative()
   126 {
   130 {
   127 #ifdef QT_HAVE_ARMV6
   131 #if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6)
   128     return true;
   132     return true;
   129 #else
   133 #else
   130     return false;
   134     return false;
   131 #endif
   135 #endif
   132 }
   136 }
   133 
   137 
   134 Q_CORE_EXPORT bool QBasicAtomicPointer_isFetchAndAddNative()
   138 Q_CORE_EXPORT bool QBasicAtomicPointer_isFetchAndAddNative()
   135 {
   139 {
   136 #ifdef QT_HAVE_ARMV6
   140 #if !defined(SYMBIAN_E32_ATOMIC_API) && defined(QT_HAVE_ARMV6)
   137     return true;
   141     return true;
   138 #else
   142 #else
   139     return false;
   143     return false;
   140 #endif
   144 #endif
   141 }
   145 }
       
   146 
       
   147 #ifdef SYMBIAN_E32_ATOMIC_API
       
   148 //Symbian's API is SMP-safe when using SMP kernel, and cheap when using uniprocessor kernel
       
   149 
       
   150 //generate compiler error if casting assumptions are wrong (symbian64?)
       
   151 __ASSERT_COMPILE(sizeof(int) == sizeof(TUint32));
       
   152 __ASSERT_COMPILE(sizeof(void *) == sizeof(TUint32));
       
   153 
       
   154 Q_CORE_EXPORT
       
   155 bool QBasicAtomicInt_testAndSetOrdered(volatile int *_q_value, int expectedValue, int newValue)
       
   156 {
       
   157     return static_cast<bool>(__e32_atomic_cas_ord32(_q_value,
       
   158         reinterpret_cast<TUint32*>(&expectedValue), newValue));
       
   159 }
       
   160 
       
   161 Q_CORE_EXPORT
       
   162 bool QBasicAtomicInt_testAndSetRelaxed(volatile int *_q_value, int expectedValue, int newValue)
       
   163 {
       
   164     return static_cast<bool>(__e32_atomic_cas_rlx32(_q_value,
       
   165         reinterpret_cast<TUint32*>(&expectedValue), newValue));
       
   166 }
       
   167 
       
   168 Q_CORE_EXPORT
       
   169 bool QBasicAtomicInt_testAndSetAcquire(volatile int *_q_value, int expectedValue, int newValue)
       
   170 {
       
   171     return static_cast<bool>(__e32_atomic_cas_acq32(_q_value,
       
   172         reinterpret_cast<TUint32*>(&expectedValue), newValue));
       
   173 }
       
   174 
       
   175 Q_CORE_EXPORT
       
   176 bool QBasicAtomicInt_testAndSetRelease(volatile int *_q_value, int expectedValue, int newValue)
       
   177 {
       
   178     return static_cast<bool>(__e32_atomic_cas_rel32(_q_value,
       
   179         reinterpret_cast<TUint32*>(&expectedValue), newValue));
       
   180 }
       
   181 
       
   182 Q_CORE_EXPORT
       
   183 int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *_q_value, int newValue)
       
   184 {
       
   185     return static_cast<int>(__e32_atomic_swp_ord32(_q_value, newValue));
       
   186 }
       
   187 
       
   188 Q_CORE_EXPORT
       
   189 int QBasicAtomicInt_fetchAndStoreRelaxed(volatile int *_q_value, int newValue)
       
   190 {
       
   191     return static_cast<int>(__e32_atomic_swp_rlx32(_q_value, newValue));
       
   192 }
       
   193 
       
   194 Q_CORE_EXPORT
       
   195 int QBasicAtomicInt_fetchAndStoreAcquire(volatile int *_q_value, int newValue)
       
   196 {
       
   197     return static_cast<int>(__e32_atomic_swp_acq32(_q_value, newValue));
       
   198 }
       
   199 
       
   200 Q_CORE_EXPORT
       
   201 int QBasicAtomicInt_fetchAndStoreRelease(volatile int *_q_value, int newValue)
       
   202 {
       
   203     return static_cast<int>(__e32_atomic_swp_rel32(_q_value, newValue));
       
   204 }
       
   205 
       
   206 Q_CORE_EXPORT
       
   207 int QBasicAtomicInt_fetchAndAddOrdered(volatile int *_q_value, int valueToAdd)
       
   208 {
       
   209     return static_cast<int>(__e32_atomic_add_ord32(_q_value, valueToAdd));
       
   210 }
       
   211 
       
   212 Q_CORE_EXPORT
       
   213 int QBasicAtomicInt_fetchAndAddRelaxed(volatile int *_q_value, int valueToAdd)
       
   214 {
       
   215     return static_cast<int>(__e32_atomic_add_rlx32(_q_value, valueToAdd));
       
   216 }
       
   217 
       
   218 Q_CORE_EXPORT
       
   219 int QBasicAtomicInt_fetchAndAddAcquire(volatile int *_q_value, int valueToAdd)
       
   220 {
       
   221     return static_cast<int>(__e32_atomic_add_acq32(_q_value, valueToAdd));
       
   222 }
       
   223 
       
   224 Q_CORE_EXPORT
       
   225 int QBasicAtomicInt_fetchAndAddRelease(volatile int *_q_value, int valueToAdd)
       
   226 {
       
   227     return static_cast<int>(__e32_atomic_add_rel32(_q_value, valueToAdd));
       
   228 }
       
   229 
       
   230 Q_CORE_EXPORT
       
   231 bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value,
       
   232                                            void *expectedValue,
       
   233                                            void *newValue)
       
   234 {
       
   235     return static_cast<bool>(__e32_atomic_cas_ord_ptr(_q_value,
       
   236         &expectedValue,
       
   237         newValue));
       
   238 }
       
   239 
       
   240 Q_CORE_EXPORT
       
   241 bool QBasicAtomicPointer_testAndSetRelaxed(void * volatile *_q_value,
       
   242                                            void *expectedValue,
       
   243                                            void *newValue)
       
   244 {
       
   245     return static_cast<bool>(__e32_atomic_cas_rlx_ptr(_q_value,
       
   246         &expectedValue,
       
   247         newValue));
       
   248 }
       
   249 
       
   250 Q_CORE_EXPORT
       
   251 bool QBasicAtomicPointer_testAndSetAcquire(void * volatile *_q_value,
       
   252                                            void *expectedValue,
       
   253                                            void *newValue)
       
   254 {
       
   255     return static_cast<bool>(__e32_atomic_cas_acq_ptr(_q_value,
       
   256         &expectedValue,
       
   257         newValue));
       
   258 }
       
   259 
       
   260 Q_CORE_EXPORT
       
   261 bool QBasicAtomicPointer_testAndSetRelease(void * volatile *_q_value,
       
   262                                            void *expectedValue,
       
   263                                            void *newValue)
       
   264 {
       
   265     return static_cast<bool>(__e32_atomic_cas_rel_ptr(_q_value,
       
   266         &expectedValue,
       
   267         newValue));
       
   268 }
       
   269 
       
   270 Q_CORE_EXPORT
       
   271 void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, void *newValue)
       
   272 {
       
   273     return __e32_atomic_swp_ord_ptr(_q_value, newValue);
       
   274 }
       
   275 
       
   276 Q_CORE_EXPORT
       
   277 void *QBasicAtomicPointer_fetchAndStoreRelaxed(void * volatile *_q_value, void *newValue)
       
   278 {
       
   279     return __e32_atomic_swp_rlx_ptr(_q_value, newValue);
       
   280 }
       
   281 
       
   282 Q_CORE_EXPORT
       
   283 void *QBasicAtomicPointer_fetchAndStoreAcquire(void * volatile *_q_value, void *newValue)
       
   284 {
       
   285     return __e32_atomic_swp_acq_ptr(_q_value, newValue);
       
   286 }
       
   287 
       
   288 Q_CORE_EXPORT
       
   289 void *QBasicAtomicPointer_fetchAndStoreRelease(void * volatile *_q_value, void *newValue)
       
   290 {
       
   291     return __e32_atomic_swp_rel_ptr(_q_value, newValue);
       
   292 }
       
   293 
       
   294 Q_CORE_EXPORT
       
   295 void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *_q_value, qptrdiff valueToAdd)
       
   296 {
       
   297     return __e32_atomic_add_ord_ptr(_q_value, valueToAdd);
       
   298 }
       
   299 
       
   300 Q_CORE_EXPORT
       
   301 void *QBasicAtomicPointer_fetchAndAddRelaxed(void * volatile *_q_value, qptrdiff valueToAdd)
       
   302 {
       
   303     return __e32_atomic_add_rlx_ptr(_q_value, valueToAdd);
       
   304 }
       
   305 
       
   306 Q_CORE_EXPORT
       
   307 void *QBasicAtomicPointer_fetchAndAddAcquire(void * volatile *_q_value, qptrdiff valueToAdd)
       
   308 {
       
   309     return __e32_atomic_add_acq_ptr(_q_value, valueToAdd);
       
   310 }
       
   311 
       
   312 Q_CORE_EXPORT
       
   313 void *QBasicAtomicPointer_fetchAndAddRelease(void * volatile *_q_value, qptrdiff valueToAdd)
       
   314 {
       
   315     return __e32_atomic_add_rel_ptr(_q_value, valueToAdd);
       
   316 }
       
   317 
       
   318 #else
       
   319 //Symbian kernels 9.4 and earlier don't expose a suitable API
   142 
   320 
   143 //For ARMv6, the generic atomics are machine coded
   321 //For ARMv6, the generic atomics are machine coded
   144 #ifndef QT_HAVE_ARMV6
   322 #ifndef QT_HAVE_ARMV6
   145 
   323 
   146 class QCriticalSection
   324 class QCriticalSection
   227     *_q_value = reinterpret_cast<char *>(returnValue) + valueToAdd;
   405     *_q_value = reinterpret_cast<char *>(returnValue) + valueToAdd;
   228         qAtomicCriticalSection.unlock();
   406         qAtomicCriticalSection.unlock();
   229     return returnValue;
   407     return returnValue;
   230 }
   408 }
   231 
   409 
       
   410 Q_CORE_EXPORT
       
   411 bool QBasicAtomicInt_testAndSetRelaxed(volatile int *_q_value, int expectedValue, int newValue)
       
   412 {
       
   413     return QBasicAtomicInt_testAndSetOrdered(_q_value, expectedValue, newValue);
       
   414 }
       
   415 
       
   416 Q_CORE_EXPORT
       
   417 bool QBasicAtomicInt_testAndSetAcquire(volatile int *_q_value, int expectedValue, int newValue)
       
   418 {
       
   419     return QBasicAtomicInt_testAndSetOrdered(_q_value, expectedValue, newValue);
       
   420 }
       
   421 
       
   422 Q_CORE_EXPORT
       
   423 bool QBasicAtomicInt_testAndSetRelease(volatile int *_q_value, int expectedValue, int newValue)
       
   424 {
       
   425     return QBasicAtomicInt_testAndSetOrdered(_q_value, expectedValue, newValue);
       
   426 }
       
   427 
       
   428 Q_CORE_EXPORT
       
   429 int QBasicAtomicInt_fetchAndStoreRelaxed(volatile int *_q_value, int newValue)
       
   430 {
       
   431     return QBasicAtomicInt_fetchAndStoreOrdered(_q_value, newValue);
       
   432 }
       
   433 
       
   434 Q_CORE_EXPORT
       
   435 int QBasicAtomicInt_fetchAndStoreAcquire(volatile int *_q_value, int newValue)
       
   436 {
       
   437     return QBasicAtomicInt_fetchAndStoreOrdered(_q_value, newValue);
       
   438 }
       
   439 
       
   440 Q_CORE_EXPORT
       
   441 int QBasicAtomicInt_fetchAndStoreRelease(volatile int *_q_value, int newValue)
       
   442 {
       
   443     return QBasicAtomicInt_fetchAndStoreOrdered(_q_value, newValue);
       
   444 }
       
   445 
       
   446 Q_CORE_EXPORT
       
   447 int QBasicAtomicInt_fetchAndAddRelaxed(volatile int *_q_value, int valueToAdd)
       
   448 {
       
   449     return QBasicAtomicInt_fetchAndAddOrdered(_q_value, valueToAdd);
       
   450 }
       
   451 
       
   452 Q_CORE_EXPORT
       
   453 int QBasicAtomicInt_fetchAndAddAcquire(volatile int *_q_value, int valueToAdd)
       
   454 {
       
   455     return QBasicAtomicInt_fetchAndAddOrdered(_q_value, valueToAdd);
       
   456 }
       
   457 
       
   458 Q_CORE_EXPORT
       
   459 int QBasicAtomicInt_fetchAndAddRelease(volatile int *_q_value, int valueToAdd)
       
   460 {
       
   461     return QBasicAtomicInt_fetchAndAddOrdered(_q_value, valueToAdd);
       
   462 }
       
   463 
       
   464 Q_CORE_EXPORT
       
   465 bool QBasicAtomicPointer_testAndSetRelaxed(void * volatile *_q_value,
       
   466                                            void *expectedValue,
       
   467                                            void *newValue)
       
   468 {
       
   469     return QBasicAtomicPointer_testAndSetOrdered(_q_value, expectedValue, newValue);
       
   470 }
       
   471 
       
   472 Q_CORE_EXPORT
       
   473 bool QBasicAtomicPointer_testAndSetAcquire(void * volatile *_q_value,
       
   474                                            void *expectedValue,
       
   475                                            void *newValue)
       
   476 {
       
   477     return QBasicAtomicPointer_testAndSetOrdered(_q_value, expectedValue, newValue);
       
   478 }
       
   479 
       
   480 Q_CORE_EXPORT
       
   481 bool QBasicAtomicPointer_testAndSetRelease(void * volatile *_q_value,
       
   482                                            void *expectedValue,
       
   483                                            void *newValue)
       
   484 {
       
   485     return QBasicAtomicPointer_testAndSetOrdered(_q_value, expectedValue, newValue);
       
   486 }
       
   487 
       
   488 Q_CORE_EXPORT
       
   489 void *QBasicAtomicPointer_fetchAndStoreRelaxed(void * volatile *_q_value, void *newValue)
       
   490 {
       
   491     return QBasicAtomicPointer_fetchAndStoreOrdered(_q_value, newValue);
       
   492 }
       
   493 
       
   494 Q_CORE_EXPORT
       
   495 void *QBasicAtomicPointer_fetchAndStoreAcquire(void * volatile *_q_value, void *newValue)
       
   496 {
       
   497     return QBasicAtomicPointer_fetchAndStoreOrdered(_q_value, newValue);
       
   498 }
       
   499 
       
   500 Q_CORE_EXPORT
       
   501 void *QBasicAtomicPointer_fetchAndStoreRelease(void * volatile *_q_value, void *newValue)
       
   502 {
       
   503     return QBasicAtomicPointer_fetchAndStoreOrdered(_q_value, newValue);
       
   504 }
       
   505 
       
   506 Q_CORE_EXPORT
       
   507 void *QBasicAtomicPointer_fetchAndAddRelaxed(void * volatile *_q_value, qptrdiff valueToAdd)
       
   508 {
       
   509     return QBasicAtomicPointer_fetchAndAddOrdered(_q_value, valueToAdd);
       
   510 }
       
   511 
       
   512 Q_CORE_EXPORT
       
   513 void *QBasicAtomicPointer_fetchAndAddAcquire(void * volatile *_q_value, qptrdiff valueToAdd)
       
   514 {
       
   515     return QBasicAtomicPointer_fetchAndAddOrdered(_q_value, valueToAdd);
       
   516 }
       
   517 
       
   518 Q_CORE_EXPORT
       
   519 void *QBasicAtomicPointer_fetchAndAddRelease(void * volatile *_q_value, qptrdiff valueToAdd)
       
   520 {
       
   521     return QBasicAtomicPointer_fetchAndAddOrdered(_q_value, valueToAdd);
       
   522 }
       
   523 
   232 #endif // QT_HAVE_ARMV6
   524 #endif // QT_HAVE_ARMV6
       
   525 #endif // SYMBIAN_E32_ATOMIC_API
   233 
   526 
   234 QT_END_NAMESPACE
   527 QT_END_NAMESPACE