patch for eventlog tracing in forkProcess

Duncan Coutts duncan at well-typed.com
Tue Feb 18 16:39:20 UTC 2014


Hi folks,

This is a bit of code I've had lying around for ages but that I never
properly tested or applied. This snippet is in danger of getting lost so
I'm sending it in and perhaps someone can try it.

There's this TODO in rts/Schedule.c forkProcess():

       // TODO: need to trace various other things in the child
       // like startup event, capabilities, process info etc

The context is that the RTS is doing a fork() and we have the eventlog
turned on. The child process makes is own new eventlog file. So events
we do during the startup of the RTS need to be duplicated here.

      // Trace various things in the child like startup event, capabilities,
      // process info etc. This is all so that the eventlog for the new
      // child process will have same stuff as if it were started standalone.
      traceEventStartup();
      traceCapsetCreate(CAPSET_OSPROCESS_DEFAULT, CapsetTypeOsProcess);
      traceCapsetCreate(CAPSET_CLOCKDOMAIN_DEFAULT, CapsetTypeClockdomain);
      for (i=0; i < n_capabilities; i++) {
          traceCapCreate(cap);
          traceCapsetAssignCap(CAPSET_OSPROCESS_DEFAULT, i);
          traceCapsetAssignCap(CAPSET_CLOCKDOMAIN_DEFAULT, i);
      #if defined(THREADED_RTS)
          traceSparkCounters(cap);
      #endif
      }
      traceWallClockTime();
      traceOSProcessInfo();

To test this you'd want to compare the eventlog in the child with one
you get from a normal startup and see if there's anything odd / missing
etc.

See also ghc-event merge which can merge eventlogs from multiple
processes by aligning to a common wall clock time.

-- 
Duncan Coutts, Haskell Consultant
Well-Typed LLP, http://www.well-typed.com/



More information about the ghc-devs mailing list