ObjFW  Diff

Differences From Artifact [af64aebbb7]:

To Artifact [e04d2c2152]:


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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
}

- (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);
			}

			/* Watch for stream events till the next timer is due */
			if (iter != NULL) {
				double timeout = [[iter->object fireDate]
				    timeIntervalSinceNow];
				[streamObserver observeWithTimeout: timeout];
			} else {
				/*
				 * No more timers: Just watch for streams until
				 * we get an event. If a timer is added by
				 * another thread, it cancels the observe.
				 */
				[streamObserver observe];
			}
		}

		objc_autoreleasePoolPop(pool);
	}
}
@end







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


<
|
<
<
<
|
<
<
<
<
<
<
<

<
<
|
|
|
<
|
|
<
<
<
<

|
|
|
|
|
|
|
|
|
<




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


119
120
121

122
123




124
125
126
127
128
129
130
131
132
133

134
135
136
137
}

- (void)run
{
	for (;;) {
		void *pool = objc_autoreleasePoolPush();
		OFDate *now = [OFDate date];
		OFTimer *timer;
		OFDate *nextTimer;

		@synchronized (timersQueue) {
			of_list_object_t *listObject =
			    [timersQueue firstListObject];

			if (listObject != NULL &&
			    [[listObject->object fireDate] compare: now] !=
			    OF_ORDERED_DESCENDING) {
				timer =
				    [[listObject->object retain] autorelease];

				[timersQueue removeListObject: listObject];
			} else
				timer = nil;
		}

		[timer fire];

		@synchronized (timersQueue) {

			nextTimer = [[timersQueue firstObject] fireDate];



		}










		/* Watch for stream events until the next timer is due */
		if (nextTimer != nil) {
			double timeout = [nextTimer timeIntervalSinceNow];


			if (timeout > 0)




				[streamObserver observeWithTimeout: timeout];
		} else {
			/*
			 * No more timers: Just watch for streams until we get
			 * an event. If a timer is added by another thread, it
			 * cancels the observe.
			 */
			[streamObserver observe];
		}


		objc_autoreleasePoolPop(pool);
	}
}
@end