/* -----------------------------------------------------------------------------
- * $Id: Updates.h,v 1.2 1998/12/02 13:21:47 simonm Exp $
+ * $Id: Updates.h,v 1.10 1999/05/11 16:47:42 keithw Exp $
+ *
+ * (c) The GHC Team, 1998-1999
*
* Definitions related to updates.
*
#ifndef UPDATES_H
#define UPDATES_H
-/*
- ticky-ticky wants to use permanent indirections when it's doing
- update entry counts.
- */
-
-#ifndef TICKY_TICKY
-# define Ind_info_TO_USE &IND_info
-#else
-# define Ind_info_TO_USE ((AllFlags.doUpdEntryCounts) ? &IND_PERM_info : &IND_info
-)
-#endif
-
/* -----------------------------------------------------------------------------
Update a closure with an indirection. This may also involve waking
up a queue of blocked threads waiting on the result of this
* (I think the fancy version of the GC is supposed to do this too.)
*/
-#define UPD_IND(updclosure, heapptr) \
- TICK_UPDATED_SET_UPDATED(updclosure); \
- AWAKEN_BQ(updclosure); \
- SET_INFO((StgInd*)updclosure,Ind_info_TO_USE); \
- ((StgInd *)updclosure)->indirectee = (StgClosure *)(heapptr)
+/* This expands to a fair chunk of code, what with waking up threads
+ * and checking whether we're updating something in a old generation.
+ * preferably don't use this macro inline in compiled code.
+ */
-/* -----------------------------------------------------------------------------
- Update a closure inplace with an infotable that expects 1 (closure)
- argument.
- Also may wake up BQs.
- -------------------------------------------------------------------------- */
+#ifdef TICKY_TICKY
+# define UPD_IND(updclosure, heapptr) UPD_PERM_IND(updclosure,heapptr)
+#else
+# define UPD_IND(updclosure, heapptr) UPD_REAL_IND(updclosure,heapptr)
+#endif
-#define UPD_INPLACE1(updclosure,info,c0) \
- TICK_UPDATED_SET_UPDATED(updclosure); \
+/* UPD_IND actually does a PERM_IND if TICKY_TICKY is on;
+ if you *really* need an IND use UPD_REAL_IND
+ */
+#define UPD_REAL_IND(updclosure, heapptr) \
AWAKEN_BQ(updclosure); \
- SET_INFO(updclosure,info); \
- payloadCPtr(updclosure,0) = (c0)
+ updateWithIndirection((StgClosure *)updclosure, \
+ (StgClosure *)heapptr);
+
+#if defined(PROFILING) || defined(TICKY_TICKY)
+#define UPD_PERM_IND(updclosure, heapptr) \
+ AWAKEN_BQ(updclosure); \
+ updateWithPermIndirection((StgClosure *)updclosure, \
+ (StgClosure *)heapptr);
+#endif
/* -----------------------------------------------------------------------------
Awaken any threads waiting on this computation
extern void awaken_blocked_queue(StgTSO *q);
#define AWAKEN_BQ(closure) \
- if (closure->header.info == &BLACKHOLE_info) { \
- StgTSO *bq = ((StgBlackHole *)closure)->blocking_queue; \
+ if (closure->header.info == &BLACKHOLE_BQ_info) { \
+ StgTSO *bq = ((StgBlockingQueue *)closure)->blocking_queue;\
if (bq != (StgTSO *)&END_TSO_QUEUE_closure) { \
STGCALL1(awaken_blocked_queue, bq); \
} \
#define PUSH_STD_CCCS(frame)
#endif
-extern const StgPolyInfoTable Upd_frame_info;
+extern DLL_IMPORT_DATA const StgPolyInfoTable Upd_frame_info;
#define PUSH_UPD_FRAME(target, Sp_offset) \
{ \
StgUpdateFrame *__frame; \
- TICK_UPDF_PUSHED(); \
+ TICK_UPDF_PUSHED(target, GET_INFO((StgClosure*)target)); \
__frame = stgCast(StgUpdateFrame*,Sp + (Sp_offset)) - 1; \
SET_INFO(__frame,stgCast(StgInfoTable*,&Upd_frame_info)); \
__frame->link = Su; \
- for the parallel system, which can implement updates more
easily if the updatee is always in the heap. (allegedly).
+
+ When debugging, we maintain a separate CAF list so we can tell when
+ a CAF has been garbage collected.
-------------------------------------------------------------------------- */
-EI_(Caf_info);
-EF_(Caf_entry);
-
/* ToDo: only call newCAF when debugging. */
extern void newCAF(StgClosure*);
#define UPD_CAF(cafptr, bhptr) \
{ \
- SET_INFO((StgInd *)cafptr,&IND_STATIC_info); \
+ SET_INFO((StgInd *)cafptr,(const StgInfoTable*)&IND_STATIC_info); \
((StgInd *)cafptr)->indirectee = (StgClosure *)(bhptr); \
- ((StgBlackHole *)(bhptr))->blocking_queue = \
- (StgTSO *)&END_TSO_QUEUE_closure; \
STGCALL1(newCAF,(StgClosure *)cafptr); \
}
Update-related prototypes
-------------------------------------------------------------------------- */
-extern STGFUN(Upd_frame_entry);
+DLL_IMPORT_RTS extern STGFUN(Upd_frame_entry);
-extern const StgInfoTable PAP_info;
-STGFUN(PAP_entry);
+extern DLL_IMPORT_DATA const StgInfoTable PAP_info;
+DLL_IMPORT_RTS STGFUN(PAP_entry);
-EXTFUN(stg_update_PAP);
+EXTFUN_RTS(stg_update_PAP);
-extern const StgInfoTable AP_UPD_info;
-STGFUN(AP_UPD_entry);
+extern DLL_IMPORT_DATA const StgInfoTable AP_UPD_info;
+DLL_IMPORT_RTS STGFUN(AP_UPD_entry);
-extern const StgInfoTable raise_info;
+extern DLL_IMPORT_DATA const StgInfoTable raise_info;
#endif /* UPDATES_H */