X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FPrimOps.cmm;h=cfdaca604cf500c1352796dd3fdde94c77d98edd;hb=03d63424f3034c34d61fe0f654e05d20c9eded89;hp=42ae582a406b3487b5667196b1470f7ece63322d;hpb=ec0984a97cec59d0403ae1f23e23f100666e8148;p=ghc-hetmet.git diff --git a/ghc/rts/PrimOps.cmm b/ghc/rts/PrimOps.cmm index 42ae582..cfdaca6 100644 --- a/ghc/rts/PrimOps.cmm +++ b/ghc/rts/PrimOps.cmm @@ -166,10 +166,6 @@ atomicModifyMutVarzh_fast W_ mv, z, x, y, r; /* Args: R1 :: MutVar#, R2 :: a -> (a,b) */ -#if defined(SMP) - foreign "C" ACQUIRE_LOCK(sm_mutex "ptr"); -#endif - /* If x is the current contents of the MutVar#, then We want to make the new contents point to @@ -206,6 +202,10 @@ atomicModifyMutVarzh_fast HP_CHK_GEN_TICKY(SIZE, R1_PTR & R2_PTR, atomicModifyMutVarzh_fast); +#if defined(SMP) + foreign "C" ACQUIRE_LOCK(sm_mutex "ptr"); +#endif + x = StgMutVar_var(R1); TICK_ALLOC_THUNK_2(); @@ -289,7 +289,7 @@ mkWeakzh_fast StgWeak_link(w) = W_[weak_ptr_list]; W_[weak_ptr_list] = w; - IF_DEBUG(weak, foreign "C" fprintf(stderr,stg_weak_msg,w)); + IF_DEBUG(weak, foreign "C" debugBelch(stg_weak_msg,w)); RET_P(w); } @@ -1429,6 +1429,10 @@ takeMVarzh_fast { W_ mvar, val, info, tso; +#if defined(SMP) + foreign "C" ACQUIRE_LOCK(sm_mutex "ptr"); +#endif + /* args: R1 = MVar closure */ mvar = R1; @@ -1448,6 +1452,10 @@ takeMVarzh_fast StgTSO_block_info(CurrentTSO) = mvar; StgMVar_tail(mvar) = CurrentTSO; +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif + jump stg_block_takemvar; } @@ -1476,6 +1484,11 @@ takeMVarzh_fast if (StgMVar_head(mvar) == stg_END_TSO_QUEUE_closure) { StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure; } + +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif + RET_P(val); } else @@ -1487,6 +1500,11 @@ takeMVarzh_fast */ SET_INFO(mvar,stg_EMPTY_MVAR_info); StgMVar_value(mvar) = stg_END_TSO_QUEUE_closure; + +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif + RET_P(val); } } @@ -1496,6 +1514,10 @@ tryTakeMVarzh_fast { W_ mvar, val, info, tso; +#if defined(SMP) + foreign "C" ACQUIRE_LOCK(sm_mutex "ptr"); +#endif + /* args: R1 = MVar closure */ mvar = R1; @@ -1506,6 +1528,9 @@ tryTakeMVarzh_fast /* HACK: we need a pointer to pass back, * so we abuse NO_FINALIZER_closure */ +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif RET_NP(0, stg_NO_FINALIZER_closure); } @@ -1539,13 +1564,13 @@ tryTakeMVarzh_fast { /* No further putMVars, MVar is now empty */ StgMVar_value(mvar) = stg_END_TSO_QUEUE_closure; - - /* do this last... we might have locked the MVar in the SMP case, - * and writing the info pointer will unlock it. - */ SET_INFO(mvar,stg_EMPTY_MVAR_info); } +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif + RET_NP(1, val); } @@ -1554,6 +1579,10 @@ putMVarzh_fast { W_ mvar, info, tso; +#if defined(SMP) + foreign "C" ACQUIRE_LOCK(sm_mutex "ptr"); +#endif + /* args: R1 = MVar, R2 = value */ mvar = R1; @@ -1570,6 +1599,9 @@ putMVarzh_fast StgTSO_block_info(CurrentTSO) = mvar; StgMVar_tail(mvar) = CurrentTSO; +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif jump stg_block_putmvar; } @@ -1595,6 +1627,9 @@ putMVarzh_fast StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure; } +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif jump %ENTRY_CODE(Sp(0)); } else @@ -1603,6 +1638,10 @@ putMVarzh_fast StgMVar_value(mvar) = R2; /* unlocks the MVar in the SMP case */ SET_INFO(mvar,stg_FULL_MVAR_info); + +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif jump %ENTRY_CODE(Sp(0)); } @@ -1614,12 +1653,19 @@ tryPutMVarzh_fast { W_ mvar, info, tso; +#if defined(SMP) + foreign "C" ACQUIRE_LOCK(sm_mutex "ptr"); +#endif + /* args: R1 = MVar, R2 = value */ mvar = R1; info = GET_INFO(mvar); if (info == stg_FULL_MVAR_info) { +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif RET_N(0); } @@ -1645,6 +1691,9 @@ tryPutMVarzh_fast StgMVar_tail(mvar) = stg_END_TSO_QUEUE_closure; } +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif jump %ENTRY_CODE(Sp(0)); } else @@ -1653,6 +1702,9 @@ tryPutMVarzh_fast StgMVar_value(mvar) = R2; /* unlocks the MVar in the SMP case */ SET_INFO(mvar,stg_FULL_MVAR_info); +#if defined(SMP) + foreign "C" RELEASE_LOCK(sm_mutex "ptr"); +#endif jump %ENTRY_CODE(Sp(0)); } @@ -1673,15 +1725,15 @@ makeStableNamezh_fast index = foreign "C" lookupStableName(R1 "ptr"); /* Is there already a StableName for this heap object? - * stable_ptr_table is an array of snEntry structs. + * stable_ptr_table is a pointer to an array of snEntry structs. */ - if ( snEntry_sn_obj(stable_ptr_table + index*SIZEOF_snEntry) == NULL ) { + if ( snEntry_sn_obj(W_[stable_ptr_table] + index*SIZEOF_snEntry) == NULL ) { sn_obj = Hp - SIZEOF_StgStableName + WDS(1); SET_HDR(sn_obj, stg_STABLE_NAME_info, W_[CCCS]); StgStableName_sn(sn_obj) = index; - snEntry_sn_obj(stable_ptr_table + index*SIZEOF_snEntry) = sn_obj; + snEntry_sn_obj(W_[stable_ptr_table] + index*SIZEOF_snEntry) = sn_obj; } else { - sn_obj = snEntry_sn_obj(stable_ptr_table + index*SIZEOF_snEntry); + sn_obj = snEntry_sn_obj(W_[stable_ptr_table] + index*SIZEOF_snEntry); } RET_P(sn_obj); @@ -1702,7 +1754,7 @@ deRefStablePtrzh_fast /* Args: R1 = the stable ptr */ W_ r, sp; sp = R1; - r = snEntry_addr(stable_ptr_table + sp*SIZEOF_snEntry); + r = snEntry_addr(W_[stable_ptr_table] + sp*SIZEOF_snEntry); RET_P(r); }