+void postCapMsg(Capability *cap, char *msg, va_list ap)
+{
+ postLogMsg(&capEventBuf[cap->no], msg, ap);
+}
+
+void closeBlockMarker (EventsBuf *ebuf)
+{
+ StgInt8* save_pos;
+
+ if (ebuf->marker)
+ {
+ // (type:16, time:64, size:32, end_time:64)
+
+ save_pos = ebuf->pos;
+ ebuf->pos = ebuf->marker + sizeof(EventTypeNum) +
+ sizeof(EventTimestamp);
+ postWord32(ebuf, save_pos - ebuf->marker);
+ postTimestamp(ebuf);
+ ebuf->pos = save_pos;
+ ebuf->marker = NULL;
+ }
+}
+
+
+void postBlockMarker (EventsBuf *eb)
+{
+ if (!hasRoomForEvent(eb, EVENT_BLOCK_MARKER)) {
+ printAndClearEventBuf(eb);
+ }
+
+ closeBlockMarker(eb);
+
+ eb->marker = eb->pos;
+ postEventHeader(eb, EVENT_BLOCK_MARKER);
+ postWord32(eb,0); // these get filled in later by closeBlockMarker();
+ postWord64(eb,0);
+ postCapNo(eb, eb->capno);
+}
+
+void printAndClearEventBuf (EventsBuf *ebuf)