Overview
Comment: | OFRunLoop: Remove timer before possible read.
A timer always needs to be removed before its fireDate is changed, |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
55e7d380e465f3336abfd404fe820faa |
User & Date: | js on 2012-09-12 06:11:06 |
Other Links: | manifest | tags |
Context
2012-09-12
| ||
06:11 | Run loops have a stream observer now. check-in: df53f06922 user: js tags: trunk | |
06:11 | OFRunLoop: Remove timer before possible read. check-in: 55e7d380e4 user: js tags: trunk | |
06:00 | Make OFSortedList sort stable. check-in: 4357c856cc user: js tags: trunk | |
Changes
Modified src/OFRunLoop.m from [b78dbdb727] to [30c14bee93].
︙ | ︙ | |||
85 86 87 88 89 90 91 | - (void)run { for (;;) { void *pool = objc_autoreleasePoolPush(); OFDate *now = [OFDate date]; @synchronized (timersQueue) { | | | > > | | > | | > | 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | - (void)run { for (;;) { void *pool = objc_autoreleasePoolPush(); OFDate *now = [OFDate date]; @synchronized (timersQueue) { of_list_object_t *iter; while ((iter = [timersQueue firstListObject]) != NULL) { void *pool2 = objc_autoreleasePoolPush(); OFTimer *timer; /* * If a timer is in the future, we can * stop now as it is sorted. */ if ([[iter->object fireDate] compare: now] == OF_ORDERED_DESCENDING) break; timer = [[iter->object retain] autorelease]; [timersQueue removeListObject: iter]; [timer fire]; objc_autoreleasePoolPop(pool2); } /* Sleep until we reach the next timer */ if (iter != NULL) [OFThread sleepUntilDate: [iter->object fireDate]]; else { |
︙ | ︙ |