[project @ 1999-05-11 16:47:39 by keithw]
[ghc-hetmet.git] / ghc / includes / Updates.h
index 9209739..1cad7b2 100644 (file)
@@ -1,5 +1,7 @@
 /* -----------------------------------------------------------------------------
- * $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.
  *
@@ -8,18 +10,6 @@
 #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
@@ -56,8 +54,8 @@
 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);             \
                }                                                       \
@@ -74,12 +72,12 @@ extern void awaken_blocked_queue(StgTSO *q);
 #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;                             \
@@ -105,21 +103,19 @@ extern const StgPolyInfoTable Upd_frame_info;
 
        - 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);                     \
   }
 
@@ -127,16 +123,16 @@ extern void newCAF(StgClosure*);
    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 */