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 |