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
- (void)run
{
	for (;;) {
		void *pool = objc_autoreleasePoolPush();
		OFDate *now = [OFDate date];

		@synchronized (timersQueue) {
			of_list_object_t *iter, *next;

			for (iter = [timersQueue firstListObject];


			    iter != NULL; iter = next) {
				/*
				 * 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];


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

			}

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







|

|
>
>
|








|
>

|
|
>







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 {