ObjFW  Check-in [55e7d380e4]

Overview
Comment:OFRunLoop: Remove timer before possible read.

A timer always needs to be removed before its fireDate is changed,
otherwise, this will break the ordering in the OFSortedList.

Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 55e7d380e465f3336abfd404fe820faa2053201a1fe555f796af5bd9cc033a70
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
92

93
94
95




96
97
98
99
100
101
102
103
104


105
106
107



108
109
110
111
112
113
114
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, *next;
			of_list_object_t *iter;

			for (iter = [timersQueue firstListObject];
			    iter != NULL; iter = next) {
			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;

				[iter->object fire];
				timer = [[iter->object retain] autorelease];
				[timersQueue removeListObject: iter];

				next = iter->next;
				[timersQueue removeListObject: iter];
				[timer fire];

				objc_autoreleasePoolPop(pool2);
			}

			/* Sleep until we reach the next timer */
			if (iter != NULL)
				[OFThread sleepUntilDate:
				    [iter->object fireDate]];
			else {