[GHC] #693: dynamic locking
GHC
ghc-devs at haskell.org
Fri Jul 19 19:05:20 CEST 2013
#693: dynamic locking
----------------------------+----------------------------------------------
Reporter: | Owner: simonmar
simonmar | Status: closed
Type: task | Milestone: 7.8.1
Priority: low | Version: 6.4.1
Component: Runtime | Keywords:
System | Architecture: Unknown/Multiple
Resolution: fixed | Difficulty: Moderate (less than a day)
Operating System: | Blocked By:
Unknown/Multiple | Related Tickets:
Type of failure: |
None/Unknown |
Test Case: N/A |
Blocking: |
----------------------------+----------------------------------------------
Comment (by parcs):
I think `atomicModifyMutVar#` and `noDuplicate#` could be optimized in a
similar fashion.
When `n_capabilities == 1`, `atomicModifyMutVar#` could update the
`MutVar` in a faster (1.8x), non-atomic fashion instead of using a
compare-and-swap. Similarly, `noDuplicate#` could elide the call to
`threadPaused` since there is no possibility of work being duplicated. Are
these safe assumptions?
How does this patch look? `./validate` seems content with it, at least.
{{{
diff --git a/rts/PrimOps.cmm b/rts/PrimOps.cmm
index ced15ee..863c352 100644
--- a/rts/PrimOps.cmm
+++ b/rts/PrimOps.cmm
@@ -340,6 +340,15 @@ stg_atomicModifyMutVarzh ( gcptr mv, gcptr f )
LDV_RECORD_CREATE(r);
StgThunk_payload(r,0) = z;
+#ifdef THREADED_RTS
+ if (CInt[n_capabilities] == 1 :: CInt) {
+ x = StgMutVar_var(mv);
+ StgThunk_payload(z,1) = x;
+ StgMutVar_var(mv) = y;
+ goto out;
+ }
+#endif
+
retry:
x = StgMutVar_var(mv);
StgThunk_payload(z,1) = x;
@@ -350,6 +359,7 @@ stg_atomicModifyMutVarzh ( gcptr mv, gcptr f )
StgMutVar_var(mv) = y;
#endif
+out:
if (GET_INFO(mv) == stg_MUT_VAR_CLEAN_info) {
ccall dirty_MUT_VAR(BaseReg "ptr", mv "ptr");
}
@@ -2008,6 +2018,10 @@ INFO_TABLE_RET(stg_noDuplicate, RET_SMALL, W_
info_ptr)
stg_noDuplicatezh /* no arg list: explicit stack layout */
{
+ if (CInt[n_capabilities] == 1 :: CInt) {
+ jump %ENTRY_CODE(Sp(0)) [];
+ }
+
STK_CHK(WDS(1), stg_noDuplicatezh);
// leave noDuplicate frame in case the current
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/693#comment:16>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list