X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FUpdates.h;h=3b9b5c02f37f5d8de64cdbc8b65955ff8fda538b;hb=59940493f000b3542a93d71e925d37a3f61b2f1a;hp=3b2461b39b37f38e4a4389b56afc49bfd1a83a14;hpb=db61851c5472bf565cd1da900b33d6e033fd743d;p=ghc-hetmet.git diff --git a/ghc/includes/Updates.h b/ghc/includes/Updates.h index 3b2461b..3b9b5c0 100644 --- a/ghc/includes/Updates.h +++ b/ghc/includes/Updates.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Updates.h,v 1.26 2001/11/22 14:25:12 simonmar Exp $ + * $Id: Updates.h,v 1.33 2003/07/28 16:05:38 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -27,37 +27,45 @@ */ #ifdef TICKY_TICKY -# define UPD_IND(updclosure, heapptr) UPD_PERM_IND(updclosure,heapptr) +# define UPD_IND(updclosure, heapptr) \ + UPD_PERM_IND(updclosure,heapptr) +# define UPD_SPEC_IND(updclosure, ind_info, heapptr, and_then) \ + UPD_PERM_IND(updclosure,heapptr); and_then #else -# define UPD_IND(updclosure, heapptr) UPD_REAL_IND(updclosure,heapptr) +# define UPD_IND(updclosure, heapptr) \ + UPD_REAL_IND(updclosure,&stg_IND_info,heapptr,) +# define UPD_SPEC_IND(updclosure, ind_info, heapptr, and_then) \ + UPD_REAL_IND(updclosure,ind_info,heapptr,and_then) #endif /* UPD_IND actually does a PERM_IND if TICKY_TICKY is on; if you *really* need an IND use UPD_REAL_IND */ #ifdef SMP -#define UPD_REAL_IND(updclosure, heapptr) \ +#define UPD_REAL_IND(updclosure, ind_info, heapptr, and_then) \ { \ const StgInfoTable *info; \ - if (Bdescr((P_)updclosure)->back != (bdescr *)BaseReg) { \ + if (Bdescr((P_)updclosure)->u.back != (bdescr *)BaseReg) { \ info = LOCK_CLOSURE(updclosure); \ } else { \ info = updclosure->header.info; \ } \ AWAKEN_BQ(info,updclosure); \ - updateWithIndirection(info, \ + updateWithIndirection(info, ind_info, \ (StgClosure *)updclosure, \ - (StgClosure *)heapptr); \ + (StgClosure *)heapptr, \ + and_then); \ } #else -#define UPD_REAL_IND(updclosure, heapptr) \ +#define UPD_REAL_IND(updclosure, ind_info, heapptr, and_then) \ { \ const StgInfoTable *info; \ info = ((StgClosure *)updclosure)->header.info; \ AWAKEN_BQ(info,updclosure); \ - updateWithIndirection(info, \ + updateWithIndirection(((StgClosure *)updclosure)->header.info, ind_info, \ (StgClosure *)updclosure, \ - (StgClosure *)heapptr); \ + (StgClosure *)heapptr, \ + and_then); \ } #endif @@ -89,10 +97,34 @@ const StgInfoTable *info; \ info = updclosure->header.info; \ AWAKEN_BQ(info,updclosure); \ - updateWithIndirection(info, \ + updateWithIndirection(info,&stg_IND_info, \ (StgClosure *)updclosure, \ - (StgClosure *)heapptr); \ + (StgClosure *)heapptr,); \ } +#elif defined(RTS_SUPPORTS_THREADS) + +# ifdef TICKY_TICKY +# define UPD_IND_NOLOCK(updclosure, heapptr) \ + { \ + const StgInfoTable *info; \ + info = ((StgClosure *)updclosure)->header.info; \ + AWAKEN_BQ_NOLOCK(info,updclosure); \ + updateWithPermIndirection(info, \ + (StgClosure *)updclosure, \ + (StgClosure *)heapptr); \ + } +# else +# define UPD_IND_NOLOCK(updclosure, heapptr) \ + { \ + const StgInfoTable *info; \ + info = ((StgClosure *)updclosure)->header.info; \ + AWAKEN_BQ_NOLOCK(info,updclosure); \ + updateWithIndirection(info,&stg_IND_info, \ + (StgClosure *)updclosure, \ + (StgClosure *)heapptr,); \ + } +# endif + #else #define UPD_IND_NOLOCK(updclosure,heapptr) UPD_IND(updclosure,heapptr) #endif @@ -171,6 +203,17 @@ extern void awakenBlockedQueue(StgTSO *q); DO_AWAKEN_BQ(closure); \ } +#ifdef RTS_SUPPORTS_THREADS +extern void awakenBlockedQueueNoLock(StgTSO *q); +#define DO_AWAKEN_BQ_NOLOCK(closure) \ + STGCALL1(awakenBlockedQueueNoLock, \ + ((StgBlockingQueue *)closure)->blocking_queue); + +#define AWAKEN_BQ_NOLOCK(info,closure) \ + if (info == &stg_BLACKHOLE_BQ_info) { \ + DO_AWAKEN_BQ_NOLOCK(closure); \ + } +#endif #endif /* GRAN || PAR */ /* ------------------------------------------------------------------------- @@ -186,6 +229,7 @@ extern void awakenBlockedQueue(StgTSO *q); #endif extern DLL_IMPORT_RTS const StgPolyInfoTable stg_upd_frame_info; +extern DLL_IMPORT_RTS const StgPolyInfoTable stg_noupd_frame_info; #define PUSH_UPD_FRAME(target, Sp_offset) \ { \ @@ -193,10 +237,8 @@ extern DLL_IMPORT_RTS const StgPolyInfoTable stg_upd_frame_info; TICK_UPDF_PUSHED(target, GET_INFO((StgClosure*)target)); \ __frame = (StgUpdateFrame *)(Sp + (Sp_offset)) - 1; \ SET_INFO(__frame, (StgInfoTable *)&stg_upd_frame_info); \ - __frame->link = Su; \ __frame->updatee = (StgClosure *)(target); \ PUSH_STD_CCCS(__frame); \ - Su = __frame; \ } /* ----------------------------------------------------------------------------- @@ -241,16 +283,4 @@ extern void newCAF(StgClosure*); Update-related prototypes -------------------------------------------------------------------------- */ -EXTFUN_RTS(__stg_update_PAP); - -DLL_IMPORT_RTS extern STGFUN(stg_upd_frame_entry); - -extern DLL_IMPORT_RTS const StgInfoTable stg_PAP_info; -DLL_IMPORT_RTS STGFUN(stg_PAP_entry); - -extern DLL_IMPORT_RTS const StgInfoTable stg_AP_UPD_info; -DLL_IMPORT_RTS STGFUN(stg_AP_UPD_entry); - -extern DLL_IMPORT_RTS const StgInfoTable stg_raise_info; - #endif /* UPDATES_H */