diff options
author | Ian Lynagh <ian@well-typed.com> | 2013-06-15 19:07:58 +0100 |
---|---|---|
committer | Ian Lynagh <ian@well-typed.com> | 2013-06-15 19:07:58 +0100 |
commit | 75947bb63794cae5950f679c8df86441b736b3fa (patch) | |
tree | d99b4deb0596840c40fac73ef22344e676102d7e /includes/rts | |
parent | 9a8c20d0d7956843cc7fbbd24f5592ea39c81be9 (diff) | |
download | haskell-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.h | 28 |
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; + } } } |