summaryrefslogtreecommitdiff
path: root/includes/rts
diff options
context:
space:
mode:
authorIan Lynagh <ian@well-typed.com>2013-06-15 19:07:58 +0100
committerIan Lynagh <ian@well-typed.com>2013-06-15 19:07:58 +0100
commit75947bb63794cae5950f679c8df86441b736b3fa (patch)
treed99b4deb0596840c40fac73ef22344e676102d7e /includes/rts
parent9a8c20d0d7956843cc7fbbd24f5592ea39c81be9 (diff)
downloadhaskell-75947bb63794cae5950f679c8df86441b736b3fa.tar.gz
Optimise lockClosure when n_capabilities == 1; fixes #693
Based on a patch from Yuras Shumovich.
Diffstat (limited to 'includes/rts')
-rw-r--r--includes/rts/storage/SMPClosureOps.h28
1 files changed, 22 insertions, 6 deletions
diff --git a/includes/rts/storage/SMPClosureOps.h b/includes/rts/storage/SMPClosureOps.h
index e2b01d76be..ffa2fe8fb3 100644
--- a/includes/rts/storage/SMPClosureOps.h
+++ b/includes/rts/storage/SMPClosureOps.h
@@ -18,6 +18,7 @@
#else
EXTERN_INLINE StgInfoTable *lockClosure(StgClosure *p);
+EXTERN_INLINE StgInfoTable *reallyLockClosure(StgClosure *p);
EXTERN_INLINE StgInfoTable *tryLockClosure(StgClosure *p);
EXTERN_INLINE void unlockClosure(StgClosure *p, const StgInfoTable *info);
@@ -31,7 +32,7 @@ EXTERN_INLINE void unlockClosure(StgClosure *p, const StgInfoTable *info);
// We want a callable copy of lockClosure() so that we can refer to it
// from .cmm files compiled using the native codegen.
-EXTERN_INLINE StgInfoTable *lockClosure(StgClosure *p)
+EXTERN_INLINE StgInfoTable *reallyLockClosure(StgClosure *p)
{
StgWord info;
do {
@@ -44,14 +45,29 @@ EXTERN_INLINE StgInfoTable *lockClosure(StgClosure *p)
} while (1);
}
+EXTERN_INLINE StgInfoTable *lockClosure(StgClosure *p)
+{
+ if (n_capabilities == 1) {
+ return (StgInfoTable *)p->header.info;
+ }
+ else {
+ return reallyLockClosure(p);
+ }
+}
+
EXTERN_INLINE StgInfoTable *tryLockClosure(StgClosure *p)
{
StgWord info;
- info = xchg((P_)(void *)&p->header.info, (W_)&stg_WHITEHOLE_info);
- if (info != (W_)&stg_WHITEHOLE_info) {
- return (StgInfoTable *)info;
- } else {
- return NULL;
+ if (n_capabilities == 1) {
+ return (StgInfoTable *)p->header.info;
+ }
+ else {
+ info = xchg((P_)(void *)&p->header.info, (W_)&stg_WHITEHOLE_info);
+ if (info != (W_)&stg_WHITEHOLE_info) {
+ return (StgInfoTable *)info;
+ } else {
+ return NULL;
+ }
}
}