projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Warning clean, and fix compilation with GHC 6.2.x
[ghc-hetmet.git]
/
includes
/
SMP.h
diff --git
a/includes/SMP.h
b/includes/SMP.h
index
04e4d13
..
f574ec8
100644
(file)
--- a/
includes/SMP.h
+++ b/
includes/SMP.h
@@
-16,6
+16,14
@@
* Unregisterised builds are ok, but only 1 CPU supported.
*/
* Unregisterised builds are ok, but only 1 CPU supported.
*/
+#ifdef CMINUSMINUS
+
+#define unlockClosure(ptr,info) \
+ prim %write_barrier() []; \
+ StgHeader_info(ptr) = info;
+
+#else
+
#if defined(THREADED_RTS)
#if defined(TICKY_TICKY)
#if defined(THREADED_RTS)
#if defined(TICKY_TICKY)
@@
-75,7
+83,7
@@
xchg(StgPtr p, StgWord w)
"1: lwarx %0, 0, %2\n"
" stwcx. %1, 0, %2\n"
" bne- 1b"
"1: lwarx %0, 0, %2\n"
" stwcx. %1, 0, %2\n"
" bne- 1b"
- :"=r" (result)
+ :"=&r" (result)
:"r" (w), "r" (p)
);
#elif sparc_HOST_ARCH
:"r" (w), "r" (p)
);
#elif sparc_HOST_ARCH
@@
-103,7
+111,7
@@
cas(StgVolatilePtr p, StgWord o, StgWord n)
{
#if i386_HOST_ARCH || x86_64_HOST_ARCH
__asm__ __volatile__ (
{
#if i386_HOST_ARCH || x86_64_HOST_ARCH
__asm__ __volatile__ (
- "lock/cmpxchg %3,%1"
+ "lock\ncmpxchg %3,%1"
:"=a"(o), "=m" (*(volatile unsigned int *)p)
:"0" (o), "r" (n));
return o;
:"=a"(o), "=m" (*(volatile unsigned int *)p)
:"0" (o), "r" (n));
return o;
@@
-175,7
+183,15
@@
write_barrier(void) {
#define SPIN_COUNT 4000
#define SPIN_COUNT 4000
-INLINE_HEADER StgInfoTable *
+#ifdef KEEP_LOCKCLOSURE
+// We want a callable copy of lockClosure() so that we can refer to it
+// from .cmm files compiled using the native codegen.
+extern StgInfoTable *lockClosure(StgClosure *p);
+INLINE_ME
+#else
+INLINE_HEADER
+#endif
+StgInfoTable *
lockClosure(StgClosure *p)
{
StgWord info;
lockClosure(StgClosure *p)
{
StgWord info;
@@
-233,7
+249,7
@@
typedef lnat StgSyncCount;
// spin locks to check for contention.
// acquire spin lock
// spin locks to check for contention.
// acquire spin lock
-INLINE_HEADER void acquireSpinLock(StgSync * p)
+INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p)
{
StgWord32 r = 0;
do {
{
StgWord32 r = 0;
do {
@@
-244,7
+260,7
@@
INLINE_HEADER void acquireSpinLock(StgSync * p)
}
// release spin lock
}
// release spin lock
-INLINE_HEADER void releaseSpinLock(StgSync * p)
+INLINE_HEADER void RELEASE_SPIN_LOCK(StgSync * p)
{
write_barrier();
p->lock = 1;
{
write_barrier();
p->lock = 1;
@@
-261,7
+277,7
@@
INLINE_HEADER void initSpinLock(StgSync * p)
#else
// acquire spin lock
#else
// acquire spin lock
-INLINE_HEADER void acquireSpinLock(StgSync * p)
+INLINE_HEADER void ACQUIRE_SPIN_LOCK(StgSync * p)
{
StgWord32 r = 0;
do {
{
StgWord32 r = 0;
do {
@@
-270,7
+286,7
@@
INLINE_HEADER void acquireSpinLock(StgSync * p)
}
// release spin lock
}
// release spin lock
-INLINE_HEADER void releaseSpinLock(StgSync * p)
+INLINE_HEADER void RELEASE_SPIN_LOCK(StgSync * p)
{
write_barrier();
(*p) = 1;
{
write_barrier();
(*p) = 1;
@@
-306,11
+322,9
@@
INLINE_HEADER void
unlockClosure(StgClosure *p STG_UNUSED, StgInfoTable *info STG_UNUSED)
{ /* nothing */ }
unlockClosure(StgClosure *p STG_UNUSED, StgInfoTable *info STG_UNUSED)
{ /* nothing */ }
-INLINE_HEADER void acquireSpinLock(void * p STG_UNUSED)
-{ /* nothing */ }
-
-INLINE_HEADER void releaseSpinLock(void * p STG_UNUSED)
-{ /* nothing */ }
+// Using macros here means we don't have to ensure the argument is in scope
+#define ACQUIRE_SPIN_LOCK(p) /* nothing */
+#define RELEASE_SPIN_LOCK(p) /* nothing */
INLINE_HEADER void initSpinLock(void * p STG_UNUSED)
{ /* nothing */ }
INLINE_HEADER void initSpinLock(void * p STG_UNUSED)
{ /* nothing */ }
@@
-325,3
+339,5
@@
INLINE_HEADER void unlockTSO(StgTSO *tso)
{ unlockClosure((StgClosure*)tso, (StgInfoTable*)&stg_TSO_info); }
#endif /* SMP_H */
{ unlockClosure((StgClosure*)tso, (StgInfoTable*)&stg_TSO_info); }
#endif /* SMP_H */
+
+#endif /* CMINUSMINUS */