From 48ccb4bc93ed8d99f5ece09d1a4ff6c7605cbc95 Mon Sep 17 00:00:00 2001 From: Todd White Date: Wed, 22 Jul 2026 12:00:42 -0400 Subject: [PATCH 1/2] CFRunLoop: mark a new observer valid CFRunLoopObserverCreate never set the valid flag, so CFRunLoopObserverIsValid returned false for a newly created observer. --- Source/CFRunLoop.c | 1 + Tests/CFRunLoop/observer_valid.m | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 Tests/CFRunLoop/observer_valid.m diff --git a/Source/CFRunLoop.c b/Source/CFRunLoop.c index 88a4ad2..392b2e6 100644 --- a/Source/CFRunLoop.c +++ b/Source/CFRunLoop.c @@ -1587,6 +1587,7 @@ CFRunLoopObserverCreate (CFAllocatorRef alloc, CFOptionFlags activities, if (new) { GSMutexInitialize (&(new->_lock)); + new->_isValid = true; new->_activities = activities; new->_repeats = repeats; new->_order = order; diff --git a/Tests/CFRunLoop/observer_valid.m b/Tests/CFRunLoop/observer_valid.m new file mode 100644 index 0000000..6052c6c --- /dev/null +++ b/Tests/CFRunLoop/observer_valid.m @@ -0,0 +1,21 @@ +#include "CoreFoundation/CFRunLoop.h" +#include "../CFTesting.h" + +static void +observe (CFRunLoopObserverRef o, CFRunLoopActivity a, void *info) +{ +} + +int main (void) +{ + CFRunLoopObserverRef obs = CFRunLoopObserverCreate (NULL, + kCFRunLoopBeforeWaiting, false, 0, observe, NULL); + + PASS_CF (CFRunLoopObserverIsValid (obs) == true, "A new observer is valid."); + + CFRunLoopObserverInvalidate (obs); + PASS_CF (CFRunLoopObserverIsValid (obs) == false, + "An invalidated observer is no longer valid."); + + return 0; +} From 706f282b08c4e5ca192ab1b963cc7bf030f9d79e Mon Sep 17 00:00:00 2001 From: Todd White Date: Thu, 23 Jul 2026 08:40:20 -0400 Subject: [PATCH 2/2] Tests: release the observer in the CFRunLoop validity test --- Tests/CFRunLoop/observer_valid.m | 1 + 1 file changed, 1 insertion(+) diff --git a/Tests/CFRunLoop/observer_valid.m b/Tests/CFRunLoop/observer_valid.m index 6052c6c..e545995 100644 --- a/Tests/CFRunLoop/observer_valid.m +++ b/Tests/CFRunLoop/observer_valid.m @@ -17,5 +17,6 @@ int main (void) PASS_CF (CFRunLoopObserverIsValid (obs) == false, "An invalidated observer is no longer valid."); + CFRelease (obs); return 0; }