ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/time.C
(Generate patch)

Comparing deliantra/server/common/time.C (file contents):
Revision 1.1 by elmex, Sun Aug 13 17:16:01 2006 UTC vs.
Revision 1.2 by root, Tue Aug 15 18:07:24 2006 UTC

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
156void
157sleep_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
214void 151void
215set_max_time(long t) { 152set_max_time(long t) {
216 max_time = t; 153 max_time = t;
217} 154}
218 155

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines