- if (doit) {
- IOTimeStampConstant(IODBG_TIMES(IOTIMES_ACTION),
- (unsigned int) doit, (unsigned int) me->owner);
- me->closeGate();
- (*doit)(me->owner, me);
- me->openGate();
+void IOTimerEventSource::timeoutAndRelease(void * self, void * c)
+{
+ IOTimerEventSource *me = (IOTimerEventSource *) self;
+ /* The second parameter (a pointer) gets abused to carry an SInt32, so on LP64, "count"
+ must be cast to "long" before, in order to tell GCC we're not truncating a pointer. */
+ SInt32 count = (SInt32) (long) c;
+
+ if (me->enabled && me->action)
+ {
+ IOWorkLoop *
+ wl = me->reserved->workLoop;
+ if (wl)
+ {
+ Action doit;
+ wl->closeGate();
+ doit = (Action) me->action;
+ if (doit && (me->reserved->calloutGeneration == count))
+ {
+ IOTimeStampConstant(IODBG_TIMES(IOTIMES_ACTION),
+ (uintptr_t) doit, (uintptr_t) me->owner);
+ (*doit)(me->owner, me);
+ }
+ wl->openGate();