diff --git a/Source/CFRunLoop.c b/Source/CFRunLoop.c index 2c5322da..88a4ad23 100644 --- a/Source/CFRunLoop.c +++ b/Source/CFRunLoop.c @@ -1521,7 +1521,7 @@ CFRunLoopSourceRemoveInvalidated(const void *key, const void *value, void *sourc { GSRunLoopContextRef ctxt = (GSRunLoopContextRef) value; CFIndex idx = CFArrayGetFirstIndexOfValue(ctxt->sources0, - CFRangeMake(0, CFArrayGetCount(ctxt->timers)), + CFRangeMake(0, CFArrayGetCount(ctxt->sources0)), (CFRunLoopSourceRef) source); if (idx != -1) diff --git a/Tests/CFRunLoop/source_invalidate.m b/Tests/CFRunLoop/source_invalidate.m new file mode 100644 index 00000000..bef10cdb --- /dev/null +++ b/Tests/CFRunLoop/source_invalidate.m @@ -0,0 +1,30 @@ +#include "CoreFoundation/CFRunLoop.h" +#include "../CFTesting.h" +#include + +static void perform (void *info) +{ +} + +int main (void) +{ + CFRunLoopRef rl; + CFRunLoopSourceContext ctx; + CFRunLoopSourceRef src; + + rl = CFRunLoopGetCurrent (); + memset (&ctx, 0, sizeof (ctx)); + ctx.perform = perform; + src = CFRunLoopSourceCreate (NULL, 0, &ctx); + CFRunLoopAddSource (rl, src, kCFRunLoopDefaultMode); + PASS_CF(CFRunLoopContainsSource (rl, src, kCFRunLoopDefaultMode) == true, + "Source is in the run loop after being added."); + + /* No timers are registered. */ + CFRunLoopSourceInvalidate (src); + PASS_CF(CFRunLoopContainsSource (rl, src, kCFRunLoopDefaultMode) == false, + "Invalidated source is removed from the run loop."); + + CFRelease (src); + return 0; +}