% (c) The GRASP/AQUA Project, Glasgow University, 1995 - 1996
% Hans Wolfgang Loidl
%
-% Time-stamp: <Wed Jun 19 1996 16:38:25 Stardate: [-31]7683.25 hwloidl>
+% Time-stamp: <Sun Oct 19 1997 23:39:59 Stardate: [-30]0119.72 hwloidl>
%
%************************************************************************
%* *
\begin{code}
#if defined(GRAN) || defined(PAR)
+#ifndef _AIX
#define NON_POSIX_SOURCE /* gettimeofday */
+#endif
#include "rtsdefs.h"
unsigned CurrentProc = 0;
rtsBool IgnoreEvents = rtsFalse; /* HACK only for testing */
+#if 0 && (defined(GCap) || defined(GCgn))
+closq ex_RBH_q = NULL;
+#endif
#endif /* GRAN */
\end{code}
if(EventHd == NULL)
{
- fprintf(stderr,"No next event\n");
+ fprintf(stderr,"No next event. This may be caused by a circular data dependency in the program.\n");
EXIT(EXIT_FAILURE);
}
eventq event = EventHd;
if(EventHd == NULL) {
- fprintf(stderr,"No next event (in grab_event)\n");
+ fprintf(stderr,"No next event (in grab_event). This may be caused by a circular data dependency in the program.\n");
EXIT(EXIT_FAILURE);
}
return (event);
}
+void
+traverse_eventq_for_gc()
+{
+ eventq event = EventHd;
+ W_ bufsize;
+ P_ closure, tso, buffer, bufptr;
+ PROC proc, creator;
+
+ /* Traverse eventq and replace every FETCHREPLY by a FETCHNODE for the
+ orig closure (root of packed graph). This means that a graph, which is
+ between processors at the time of GC is fetched again at the time when
+ it would have arrived, had there been no GC. Slightly inaccurate but
+ safe for GC.
+ This is only needed for GUM style fetchng. */
+ if (!RTSflags.GranFlags.DoGUMMFetching)
+ return;
+
+ for(event = EventHd; event!=NULL; event=EVENT_NEXT(event)) {
+ if (EVENT_TYPE(event)==FETCHREPLY) {
+ buffer = EVENT_NODE(event);
+ ASSERT(buffer[PACK_FLAG_LOCN]==MAGIC_PACK_FLAG); /* It's a pack buffer */
+ bufsize = buffer[PACK_SIZE_LOCN];
+ closure= (P_)buffer[PACK_HDR_SIZE];
+ tso = (P_)buffer[PACK_TSO_LOCN];
+ proc = EVENT_PROC(event);
+ creator = EVENT_CREATOR(event); /* similar to unpacking */
+ for (bufptr=buffer+PACK_HDR_SIZE; bufptr<(buffer+bufsize);
+ bufptr++) {
+ if ( (INFO_TYPE(INFO_PTR(*bufptr)) == INFO_SPEC_RBH_TYPE) ||
+ (INFO_TYPE(INFO_PTR(*bufptr)) == INFO_GEN_RBH_TYPE) ) {
+ convertFromRBH((P_)*bufptr);
+ }
+ }
+ free(buffer);
+ EVENT_TYPE(event) = FETCHNODE;
+ EVENT_PROC(event) = creator;
+ EVENT_CREATOR(event) = proc;
+ EVENT_NODE(event) = closure;
+ EVENT_TSO(event) = tso;
+ EVENT_GC_INFO(event) = 0;
+ }
+ }
+}
+
void
print_event(event)
eventq event;
char str_tso[16], str_node[16];
- sprintf(str_tso,((EVENT_TSO(event)==Prelude_Z91Z93_closure) ? "______" : "%#6lx"),
+ sprintf(str_tso,((EVENT_TSO(event)==PrelBase_Z91Z93_closure) ? "______" : "%#6lx"),
EVENT_TSO(event));
- sprintf(str_node,((EVENT_NODE(event)==Prelude_Z91Z93_closure) ? "______" : "%#6lx"),
+ sprintf(str_node,((EVENT_NODE(event)==PrelBase_Z91Z93_closure) ? "______" : "%#6lx"),
EVENT_NODE(event));
if (event==NULL)
{
char str[16];
- sprintf(str,((SPARK_NODE(spark)==Prelude_Z91Z93_closure) ? "______" : "%#6lx"),
+ sprintf(str,((SPARK_NODE(spark)==PrelBase_Z91Z93_closure) ? "______" : "%#6lx"),
(W_) SPARK_NODE(spark));
if (spark==NULL)
void
ActivateNextThread (PROC proc)
{
- ASSERT(RunnableThreadsHd[proc]!=Prelude_Z91Z93_closure);
+ ASSERT(RunnableThreadsHd[proc]!=PrelBase_Z91Z93_closure);
RunnableThreadsHd[proc] = TSO_LINK(RunnableThreadsHd[proc]);
- if(RunnableThreadsHd[proc]==Prelude_Z91Z93_closure) {
+ if(RunnableThreadsHd[proc]==PrelBase_Z91Z93_closure) {
MAKE_IDLE(proc);
- RunnableThreadsTl[proc] = Prelude_Z91Z93_closure;
+ RunnableThreadsTl[proc] = PrelBase_Z91Z93_closure;
} else {
CurrentTime[proc] += RTSflags.GranFlags.gran_threadcontextswitchtime;
if (RTSflags.GranFlags.granSimStats &&
(!RTSflags.GranFlags.Light || (RTSflags.GranFlags.debug & 0x20000)))
DumpRawGranEvent(proc,0,GR_SCHEDULE,RunnableThreadsHd[proc],
- Prelude_Z91Z93_closure,0);
+ PrelBase_Z91Z93_closure,0);
}
}
\end{code}
if (RTSflags.GranFlags.granSimStats_Heap) {
DumpRawGranEvent(CurrentProc,0,GR_ALLOC,CurrentTSO,
- Prelude_Z91Z93_closure,n);
+ PrelBase_Z91Z93_closure,n);
}
TSO_EXECTIME(CurrentTSO) += RTSflags.GranFlags.gran_heapalloc_cost;
}
}
# endif
- TSO_LINK(CurrentTSO) = Prelude_Z91Z93_closure;
- /* CurrentTSO = Prelude_Z91Z93_closure; */
+ TSO_LINK(CurrentTSO) = PrelBase_Z91Z93_closure;
+ /* CurrentTSO = PrelBase_Z91Z93_closure; */
/* ThreadQueueHd is now the next TSO to schedule or NULL */
/* CurrentTSO is pointed to by the FETCHNODE event */
} else {
TSO_TYPE(CurrentTSO) |= FETCH_MASK_TSO;
}
- CurrentTSO = Prelude_Z91Z93_closure;
+ CurrentTSO = PrelBase_Z91Z93_closure;
}
# endif
}
{
/* ++SparksAvail; Nope; do that in add_to_spark_queue */
if(RTSflags.GranFlags.granSimStats_Sparks)
- DumpRawGranEvent(CurrentProc,(PROC)0,SP_SPARK,Prelude_Z91Z93_closure,node,
+ DumpRawGranEvent(CurrentProc,(PROC)0,SP_SPARK,PrelBase_Z91Z93_closure,node,
spark_queue_len(CurrentProc,ADVISORY_POOL)-1);
/* Force the PE to take notice of the spark */
if(RTSflags.GranFlags.DoAlwaysCreateThreads) {
new_event(CurrentProc,CurrentProc,CurrentTime[CurrentProc],
- FINDWORK,Prelude_Z91Z93_closure,Prelude_Z91Z93_closure,NULL);
+ FINDWORK,PrelBase_Z91Z93_closure,PrelBase_Z91Z93_closure,NULL);
if (CurrentTime[CurrentProc]<TimeOfNextEvent)
TimeOfNextEvent = CurrentTime[CurrentProc];
}
/* ++SparksAvail; Nope; do that in add_to_spark_queue */
if(RTSflags.GranFlags.granSimStats_Sparks)
- DumpRawGranEvent(proc,0,SP_SPARKAT,Prelude_Z91Z93_closure,SPARK_NODE(spark),
+ DumpRawGranEvent(proc,0,SP_SPARKAT,PrelBase_Z91Z93_closure,SPARK_NODE(spark),
spark_queue_len(proc,ADVISORY_POOL));
if (proc!=CurrentProc) {
/* Need CurrentTSO in event field to associate costs with creating
spark even in a GrAnSim Light setup */
new_event(proc,CurrentProc,exporttime,
- MOVESPARK,CurrentTSO,Prelude_Z91Z93_closure,spark);
+ MOVESPARK,CurrentTSO,PrelBase_Z91Z93_closure,spark);
else
new_event(proc,CurrentProc,exporttime,
- MOVESPARK,Prelude_Z91Z93_closure,Prelude_Z91Z93_closure,spark);
+ MOVESPARK,PrelBase_Z91Z93_closure,PrelBase_Z91Z93_closure,spark);
/* Bit of a hack to treat placed sparks the same as stolen sparks */
++OutstandingFishes[proc];
MOVESPARK into the sparkq!) */
if(RTSflags.GranFlags.DoAlwaysCreateThreads) {
new_event(CurrentProc,CurrentProc,exporttime+1,
- FINDWORK,Prelude_Z91Z93_closure,Prelude_Z91Z93_closure,NULL);
+ FINDWORK,PrelBase_Z91Z93_closure,PrelBase_Z91Z93_closure,NULL);
}
if (exporttime<TimeOfNextEvent)
CurrentTime[proc] += RTSflags.GranFlags.gran_threadqueuetime;
ActivateNextThread(proc);
- TSO_LINK(tso) = Prelude_Z91Z93_closure; /* not really necessary; only for testing */
+ TSO_LINK(tso) = PrelBase_Z91Z93_closure; /* not really necessary; only for testing */
}
#endif /* GRAN */
enum gran_event_types name;
P_ tso;
{
- DumpRawGranEvent(CURRENT_PROC, (PROC)0, name, tso, Prelude_Z91Z93_closure, 0);
+ DumpRawGranEvent(CURRENT_PROC, (PROC)0, name, tso, PrelBase_Z91Z93_closure, 0);
}
void
#endif
id = tso == NULL ? -1 : TSO_ID(tso);
- if (node==Prelude_Z91Z93_closure)
- strcpy(node_str,"________"); /* "Prelude_Z91Z93_closure"); */
+ if (node==PrelBase_Z91Z93_closure)
+ strcpy(node_str,"________"); /* "PrelBase_Z91Z93_closure"); */
else
sprintf(node_str,"0x%-6lx",node);
fprintf(gr_file,"PE %2u [%s]: %-9s\t%lx\t%s\t[SN %u]\n",
/* using spark name as optional argument ^^^^^^ */
proc,time_string,gran_event_names[name],
- id,node_str,(len & NEW_SPARKNAME_MASK));
+ id,node_str,len);
break;
case GR_FETCH:
case GR_REPLY:
return;
id = tso == NULL ? -1 : TSO_ID(tso);
- if (node==Nil_closure)
- strcpy(node_str,"________"); /* "Nil_closure"); */
+ if (node==PrelBase_Z91Z93_closure)
+ strcpy(node_str,"________"); /* "Z91Z93_closure"); */
else
sprintf(node_str,"0x%-6lx",node);
fprintf(gr_file,"PE %2u [%s]: %-9s\t%lx\t%s\t[SN %u]\n",
/* using spark name as optional argument ^^^^^^ */
proc,time_string,gran_event_names[name],
- id,node_str,(len & NEW_SPARKNAME_MASK));
+ id,node_str,len);
break;
default:
fprintf(stderr,"Error in DumpStartEventAt: event %s is not a START event\n",
return;
#endif
- DumpGranEvent(GR_TERMINATE, Prelude_Z91Z93_closure);
+ DumpGranEvent(GR_TERMINATE, PrelBase_Z91Z93_closure);
if (sizeof(TIME) == 4) {
putc('\0', gr_file);