void VAuditF(const char *f, va_list args) { char *prefix; char buf[1024]; int len; static char oldbuf[1024]; prefix = AuditPrefix(); len = vsnprintf(buf, sizeof(buf), f, args); if (len == oldlen && strcmp(buf, oldbuf) == 0) { /* Message already seen */ nrepeat++; } else { /* new message */ if (auditTimer != NULL) TimerForce(auditTimer); ErrorF("%s%s", prefix != NULL ? prefix : "", buf); strlcpy(oldbuf, buf, sizeof(oldbuf)); oldlen = len; nrepeat = 0; auditTimer = TimerSet(auditTimer, 0, AUDIT_TIMEOUT, AuditFlush, NULL); } free(prefix); }
void FreeAuditTimer(void) { if (auditTimer != NULL) { /* Force output of pending messages */ TimerForce(auditTimer); TimerFree(auditTimer); auditTimer = NULL; } }
static void CheckAllTimers(void) { TimerPtr timer; unsigned int now; start: now = GetTimeInMillis(); for (timer = timers; timer; timer = timer->next) { if (timer->expires - now > timer->delta + 250) { TimerForce(timer); goto start; } } }
/** Request an XSync() to the display used by \a dmxScreen. If \a now * is TRUE, call XSync() immediately instead of waiting for the next * XSync() batching point. Note that if XSync() batching was deselected * with #dmxSyncActivate() before #dmxSyncInit() was called, then no * XSync() batching is performed and this function always calles XSync() * immediately. * * (Note that this function uses TimerSet but works correctly in the * face of a server generation. See the source for details.) * * If \a dmxScreen is \a NULL, then all pending syncs will be flushed * immediately. */ void dmxSync(DMXScreenInfo *dmxScreen, Bool now) { static unsigned long dmxGeneration = 0; if (dmxSyncInterval) { if (dmxGeneration != serverGeneration) { /* Server generation does a TimerInit, which frees all * timers. So, at this point dmxSyncTimer is either: * 1) NULL, iff dmxGeneration == 0, * 2) freed, if it was on a queue (dmxSyncPending != 0), or * 3) allocated, if it wasn't on a queue (dmxSyncPending == 0) */ if (dmxSyncTimer && !dmxSyncPending) xfree(dmxSyncTimer); dmxSyncTimer = NULL; now = TRUE; dmxGeneration = serverGeneration; } /* Queue sync */ if (dmxScreen) { dmxScreen->needsSync = TRUE; ++dmxSyncPending; } /* Do sync or set time for later */ if (now || !dmxScreen) { if (!TimerForce(dmxSyncTimer)) dmxSyncCallback(NULL, 0, NULL); /* At this point, dmxSyncPending == 0 because * dmxSyncCallback must have been called. */ if (dmxSyncPending) dmxLog(dmxFatal, "dmxSync(%s,%d): dmxSyncPending = %d\n", dmxScreen ? dmxScreen->name : "", now, dmxSyncPending); } else { dmxScreen->needsSync = TRUE; if (dmxSyncPending == 1) dmxSyncTimer = TimerSet(dmxSyncTimer, 0, dmxSyncInterval, dmxSyncCallback, NULL); } } else { /* If dmxSyncInterval is not being used, * then all the backends are already * up-to-date. */ if (dmxScreen) dmxDoSync(dmxScreen); } }
void VAuditF(const char *f, va_list args) { char *prefix; char buf[1024]; int len; static char oldbuf[1024]; prefix = AuditPrefix(); len = vsnprintf(buf, sizeof(buf), f, args); #if 1 /* XXX Compressing duplicated messages is temporarily disabled to * work around bugzilla 964: * https://freedesktop.org/bugzilla/show_bug.cgi?id=964 */ ErrorF("%s%s", prefix != NULL ? prefix : "", buf); oldlen = -1; nrepeat = 0; #else if (len == oldlen && strcmp(buf, oldbuf) == 0) { /* Message already seen */ nrepeat++; } else { /* new message */ if (auditTimer != NULL) TimerForce(auditTimer); ErrorF("%s%s", prefix != NULL ? prefix : "", buf); strlcpy(oldbuf, buf, sizeof(oldbuf)); oldlen = len; nrepeat = 0; auditTimer = TimerSet(auditTimer, 0, AUDIT_TIMEOUT, AuditFlush, NULL); } #endif if (prefix != NULL) free(prefix); }
static void dmxSyncBlockHandler(pointer blockData, OSTimePtr pTimeout, pointer pReadMask) { TimerForce(dmxSyncTimer); }