1 | /* |
1 | /* |
2 | * static char *rcsid_time_c = |
2 | * static char *rcsid_time_c = |
3 | * "$Id: time.C,v 1.1 2006/08/13 17:16:01 elmex Exp $"; |
3 | * "$Id: time.C,v 1.2 2006/08/15 18:07:24 root Exp $"; |
4 | */ |
4 | */ |
5 | |
5 | |
6 | /* |
6 | /* |
7 | CrossFire, A Multiplayer game for X-windows |
7 | CrossFire, A Multiplayer game for X-windows |
8 | |
8 | |
… | |
… | |
146 | return 1; |
146 | return 1; |
147 | } |
147 | } |
148 | return 0; |
148 | return 0; |
149 | } |
149 | } |
150 | |
150 | |
151 | /* |
|
|
152 | * sleep_delta checks how much time has elapsed since last tick. |
|
|
153 | * If it is less than max_time, the remaining time is slept with select(). |
|
|
154 | */ |
|
|
155 | |
|
|
156 | void |
|
|
157 | sleep_delta(void) |
|
|
158 | { |
|
|
159 | static struct timeval new_time; |
|
|
160 | long sleep_sec, sleep_usec; |
|
|
161 | |
|
|
162 | (void) GETTIMEOFDAY(&new_time); |
|
|
163 | |
|
|
164 | sleep_sec = last_time.tv_sec - new_time.tv_sec; |
|
|
165 | sleep_usec = max_time - (new_time.tv_usec - last_time.tv_usec); |
|
|
166 | |
|
|
167 | /* This is very ugly, but probably the fastest for our use: */ |
|
|
168 | while (sleep_usec < 0) { |
|
|
169 | sleep_usec += 1000000; |
|
|
170 | sleep_sec -= 1; |
|
|
171 | } |
|
|
172 | while (sleep_usec > 1000000) { |
|
|
173 | sleep_usec -= 1000000; |
|
|
174 | sleep_sec +=1; |
|
|
175 | } |
|
|
176 | |
|
|
177 | log_time((new_time.tv_sec - last_time.tv_sec)*1000000 |
|
|
178 | + new_time.tv_usec - last_time.tv_usec); |
|
|
179 | |
|
|
180 | if (sleep_sec >= 0 && sleep_usec > 0) { |
|
|
181 | static struct timeval sleep_time; |
|
|
182 | sleep_time.tv_sec = sleep_sec; |
|
|
183 | sleep_time.tv_usec = sleep_usec; |
|
|
184 | |
|
|
185 | #ifndef WIN32 /* 'select' doesn't work on Windows, 'Sleep' is used instead */ |
|
|
186 | select(0, NULL, NULL, NULL, &sleep_time); |
|
|
187 | #else |
|
|
188 | if (sleep_time.tv_sec) Sleep(sleep_time.tv_sec*1000); |
|
|
189 | Sleep((int)(sleep_time.tv_usec/1000.)); |
|
|
190 | #endif |
|
|
191 | } |
|
|
192 | else |
|
|
193 | process_utime_long_count++; |
|
|
194 | /* |
|
|
195 | * Set last_time to when we're expected to wake up: |
|
|
196 | */ |
|
|
197 | last_time.tv_usec += max_time; |
|
|
198 | while (last_time.tv_usec > 1000000) { |
|
|
199 | last_time.tv_usec -= 1000000; |
|
|
200 | last_time.tv_sec++; |
|
|
201 | } |
|
|
202 | /* |
|
|
203 | * Don't do too much catching up: |
|
|
204 | * (Things can still get jerky on a slow/loaded computer) |
|
|
205 | */ |
|
|
206 | if (last_time.tv_sec * 1000000 + last_time.tv_usec < |
|
|
207 | new_time.tv_sec * 1000000 + new_time.tv_usec) |
|
|
208 | { |
|
|
209 | last_time.tv_sec = new_time.tv_sec; |
|
|
210 | last_time.tv_usec = new_time.tv_usec; |
|
|
211 | } |
|
|
212 | } |
|
|
213 | |
|
|
214 | void |
151 | void |
215 | set_max_time(long t) { |
152 | set_max_time(long t) { |
216 | max_time = t; |
153 | max_time = t; |
217 | } |
154 | } |
218 | |
155 | |