-static void breakPointCommand(HpcRixOp rixOp, StgThreadID rixTid);
-
-// Breakpointing
-static StgThreadID previousTid = 0;
-static StgWord64 rixBPCounter = 0; // The global event breakpoint counter
-static int *tixBoxBP;
-static HpcRixOp rixOpBack[WOP_SIZE]; // The actual op
-static HpcRixOp rixTidBack[WOP_SIZE]; // Tid's before the op
-
-void
-hs_hpc_raise_event(StgTSO *current_tso) {
- hs_hpc_tick(RixRaiseOp,current_tso);
-}
-
-void
-hs_hpc_thread_finished_event(StgTSO *current_tso) {
- hs_hpc_tick(RixThreadFinishedOp,current_tso);
-}
-
-/* Called on every tick, dynamically, sending to our
- * external record of program execution.
- */
-
-void
-hs_hpc_tick(int rixOp, StgTSO *current_tso) {
-
- debugTrace(DEBUG_hpc,"hs_hpc_tick(%x)",rixOp);
-
- if (rixFile == NULL) {
- return;
- }
- assert(rixCmdFile != NULL);
- StgThreadID tid = (current_tso == 0) ? 0 : current_tso->id;
-
- // now check to see if we have met a breakpoint condition
- if (rixCounter == rixBPCounter
- || tid != previousTid) {
- breakPointCommand(rixOp,tid);
- } else {
- if (rixOp >= 0) {
- // Tix op
- if (tixBoxBP[rixOp] == 1) { // reached a bp tixbox
- breakPointCommand(rixOp,tid);
- }
- } else {
- // record the special operation
- breakPointCommand(rixOp,tid);
- }
- }
- // update the history information.
- previousTid = tid;
- rixOpBack[rixCounter % WOP_SIZE] = rixOp;
- rixTidBack[rixCounter % WOP_SIZE] = tid;
- rixCounter++;
-
- debugTrace(DEBUG_hpc, "end: hs_hpc_tick");
-}
-
-static void
-printEvent(FILE *out,StgWord64 rixCounter,StgThreadID rixTid,HpcRixOp rixOp) {
- char prefixMsg[128];
- char suffixMsg[128];
-
- sprintf(prefixMsg,
- "Event %" PRIuWORD64 " %u ",
- rixCounter,
- (unsigned int)rixTid);
-
- switch(rixOp) {
- case RixThreadFinishedOp:
- sprintf(suffixMsg,"ThreadFinished");
- break;
- case RixRaiseOp:
- sprintf(suffixMsg,"Raise");
- break;
- case RixFinishedOp:
- sprintf(suffixMsg,"Finished");
- break;
- default:
- sprintf(suffixMsg,"%u",rixOp);
- }
-
- fprintf(out,"%s%s\n",prefixMsg,suffixMsg);
- debugTrace(DEBUG_hpc,"sending %s%s",prefixMsg,suffixMsg);
-}
-
-static void
-breakPointCommand(HpcRixOp rixOp, StgThreadID rixTid) {
- StgWord64 tmp64 = 0;
- unsigned int tmp = 0;
-
- if (getpid() != debuggee_pid) {
- // We are not the original process, to do not issue
- // any events, and do not try to talk to the debugger.
- return;
- }
-
- debugTrace(DEBUG_hpc,"breakPointCommand %d %x",rixOp,(unsigned int)rixTid);
-
- printEvent(rixFile,rixCounter,rixTid,rixOp);
- fflush(rixFile);
-
- /* From here, you can ask some basic questions.
- *
- * c<nat> set the (one) counter breakpoint
- * s<nat> set the (many) tickbox breakpoint
- * u<nat> unset the (many) tickbox breakpoint
- * h history
-
- * Note that you aways end up here on the first tick
- * because the rixBPCounter starts equal to 0.
- */
- int c = getc(rixCmdFile);
- while(c != 10 && c != -1) {
- switch(c) {
- case 'c': // c1234 -- set counter breakpoint at 1234
- c = getc(rixCmdFile);
- tmp64 = 0;
- while(isdigit(c)) {
- tmp64 = tmp64 * 10 + (c - '0');
- c = getc(rixCmdFile);
- }
- debugTrace(DEBUG_hpc,"setting countBP = %" PRIuWORD64,tmp64);
-
- rixBPCounter = tmp64;
- break;
- case 's': // s2323 -- set tick box breakpoint at 2323
- c = getc(rixCmdFile);
- tmp = 0;
- while(isdigit(c)) {
- tmp = tmp * 10 + (c - '0');
- c = getc(rixCmdFile);
- }
-
- debugTrace(DEBUG_hpc,"seting bp for tix %d",tmp);
-
- tixBoxBP[tmp] = 1;
- break;
- case 'u': // u2323 -- unset tick box breakpoint at 2323
- c = getc(rixCmdFile);
- tmp = 0;
- while(isdigit(c)) {
- tmp = tmp * 10 + (c - '0');
- c = getc(rixCmdFile);
- }
-
- debugTrace(DEBUG_hpc,"unseting bp for tix %d",tmp);
-
- tixBoxBP[tmp] = 0;
- break;
- case 'h': // h -- history of the last few (WOP_SIZE) steps
- if (rixCounter > WOP_SIZE) {
- tmp64 = rixCounter - WOP_SIZE;
- } else {
- tmp64 = 0;
- }
- for(;tmp64 < rixCounter;tmp64++) {
- printEvent(rixFile,
- tmp64,
- rixTidBack[tmp64 % WOP_SIZE],
- rixOpBack[tmp64 % WOP_SIZE]);
- }
- fflush(rixFile);
- c = getc(rixCmdFile);
- break;
- default:
-
- debugTrace(DEBUG_hpc,"strange command from HPCRIX (%d)",c);
-
- c = getc(rixCmdFile);
- }
- while (c != 10) { // the end of the line
- c = getc(rixCmdFile); // to the end of the line
- }
- c = getc(rixCmdFile); // the first char on the next command
- }
-
- debugTrace(DEBUG_hpc,"leaving breakPointCommand");
-
-}