__CFRunLoopSourceComparator 函数详解

4 阅读1分钟

源码苹果开源库: swift-corelibs-foundation/blob/main/Sources/CoreFoundation/CFRunLoop.c

__CFRunLoopSourceComparator函数

static CFComparisonResult __CFRunLoopSourceComparator(const void *val1, const void *val2, void *context) {
    CFRunLoopSourceRef o1 = (CFRunLoopSourceRef)val1;
    CFRunLoopSourceRef o2 = (CFRunLoopSourceRef)val2;
    
    // 第一优先级:按 _order 排序
    if (o1->_order < o2->_order) return kCFCompareLessThan;
    if (o2->_order < o1->_order) return kCFCompareGreaterThan;
    
    const CFAbsoluteTime time1 = __CFRunLoopSourceGetSignaledTime(o1);
    const CFAbsoluteTime time2 = __CFRunLoopSourceGetSignaledTime(o2);
    
    // 第二优先级:按信号时间排序(先被 signal 的先处理)
    if (time1 < time2) return kCFCompareLessThan;
    if (time1 > time2) return kCFCompareGreaterThan;
    
    return kCFCompareEqualTo;
}

该函数用于对Source0数组进行排序。

排序会用到source的_order属性和_signaledTime属性。

  • _order:Source 的优先级顺序(创建时指定)
  • _signaledTime:被信号标记的时间

排序逻辑

  1. 先比较 _order 值

    • _order 小的排前面(优先级高)
    • 如果 _order 相等,继续比较
  2. 再比较 _signaledTime(信号时间)

    • 时间早的排前面(先被 signal 的先处理)
    • 这实现了 FIFO(先进先出)的公平性

设计意图

  1. _order 优先:允许开发者控制 Source 的处理优先级。例如:重要的事件源可以设置较小的 order 值,确保优先处理

  2. _signaledTime 次之:相同优先级时,保证公平性。先被 Signal 的 Source 先被处理,防止后来的 Source "插队"。