ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/time.C
Revision: 1.2
Committed: Tue Aug 15 18:07:24 2006 UTC (17 years, 9 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.1: +1 -64 lines
Log Message:
use perl's event loop as mainloop

File Contents

# User Rev Content
1 elmex 1.1 /*
2     * static char *rcsid_time_c =
3 root 1.2 * "$Id: time.C,v 1.1 2006-08-13 17:16:01 elmex Exp $";
4 elmex 1.1 */
5    
6     /*
7     CrossFire, A Multiplayer game for X-windows
8    
9     Copyright (C) 2002 Mark Wedel & Crossfire Development Team
10     Copyright (C) 1992 Frank Tore Johansen
11    
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation; either version 2 of the License, or
15     (at your option) any later version.
16    
17     This program is distributed in the hope that it will be useful,
18     but WITHOUT ANY WARRANTY; without even the implied warranty of
19     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20     GNU General Public License for more details.
21    
22     You should have received a copy of the GNU General Public License
23     along with this program; if not, write to the Free Software
24     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25    
26     The authors can be reached via e-mail at crossfire-devel@real-time.com
27     */
28    
29     #include <global.h>
30     #include <funcpoint.h>
31     #include <tod.h>
32    
33     #ifndef WIN32 /* ---win32 exclude header */
34     #include <stdio.h>
35     #include <sys/types.h>
36     #include <sys/time.h>
37     #endif /* win32 */
38    
39     /*
40     * Gloabal variables:
41     */
42     long max_time = MAX_TIME;
43     struct timeval last_time;
44    
45     #define PBUFLEN 100
46     long process_utime_save[PBUFLEN];
47     long psaveind;
48     long process_max_utime = 0;
49     long process_min_utime = 999999999;
50     long process_tot_mtime;
51     long pticks;
52     long process_utime_long_count;
53    
54     const char *season_name[] =
55     {
56     "The Season of New Year",
57     "The Season of Growth",
58     "The Season of Harvest",
59     "The Season of Decay",
60     "The Season of the Blizzard",
61     "\n"
62     };
63    
64     const char *weekdays[DAYS_PER_WEEK] = {
65     "the Day of the Moon",
66     "the Day of the Bull",
67     "the Day of the Deception",
68     "the Day of Thunder",
69     "the Day of Freedom",
70     "the Day of the Great Gods",
71     "the Day of the Sun"
72     };
73    
74     const char *month_name[MONTHS_PER_YEAR] = {
75     "Month of Winter", /* 0 */
76     "Month of the Ice Dragon",
77     "Month of the Frost Giant",
78     "Month of Valriel",
79     "Month of Lythander",
80     "Month of the Harvest",
81     "Month of Gaea",
82     "Month of Futility",
83     "Month of the Dragon",
84     "Month of the Sun",
85     "Month of the Great Infernus",
86     "Month of Ruggilli",
87     "Month of the Dark Shades",
88     "Month of the Devourers",
89     "Month of Sorig",
90     "Month of the Ancient Darkness",
91     "Month of Gorokh"
92     };
93    
94     /*
95     * Initialise all variables used in the timing routines.
96     */
97    
98     void
99     reset_sleep(void)
100     {
101     int i;
102     for(i = 0; i < PBUFLEN; i++)
103     process_utime_save[i] = 0;
104     psaveind = 0;
105     process_max_utime = 0;
106     process_min_utime = 999999999;
107     process_tot_mtime = 0;
108     pticks = 0;
109    
110     (void) GETTIMEOFDAY(&last_time);
111     }
112    
113     void
114     log_time(long process_utime)
115     {
116     pticks++;
117     if (++psaveind >= PBUFLEN)
118     psaveind = 0;
119     process_utime_save[psaveind] = process_utime;
120     if (process_utime > process_max_utime)
121     process_max_utime = process_utime;
122     if (process_utime < process_min_utime)
123     process_min_utime = process_utime;
124     process_tot_mtime += process_utime/1000;
125     }
126    
127     /*
128     * enough_elapsed_time will return true if the time passed since
129     * last tick is more than max-time.
130     */
131    
132     int
133     enough_elapsed_time(void)
134     {
135     static struct timeval new_time;
136     long elapsed_utime;
137    
138     (void) GETTIMEOFDAY(&new_time);
139    
140     elapsed_utime = (new_time.tv_sec - last_time.tv_sec) * 1000000 +
141     new_time.tv_usec - last_time.tv_usec;
142     if (elapsed_utime > max_time) {
143     log_time(elapsed_utime);
144     last_time.tv_sec = new_time.tv_sec;
145     last_time.tv_usec = new_time.tv_usec;
146     return 1;
147     }
148     return 0;
149     }
150    
151     void
152     set_max_time(long t) {
153     max_time = t;
154     }
155    
156     extern unsigned long todtick;
157    
158     void
159     get_tod(timeofday_t *tod)
160     {
161     tod->year = todtick/HOURS_PER_YEAR;
162     tod->month = (todtick/HOURS_PER_MONTH)%MONTHS_PER_YEAR;
163     tod->day = (todtick%HOURS_PER_MONTH)/DAYS_PER_MONTH;
164     tod->dayofweek = tod->day%DAYS_PER_WEEK;
165     tod->hour = todtick%HOURS_PER_DAY;
166     tod->minute = (pticks%PTICKS_PER_CLOCK)/(PTICKS_PER_CLOCK/58);
167     if (tod->minute > 58)
168     tod->minute = 58; /* it's imprecise at best anyhow */
169     tod->weekofmonth = tod->day/WEEKS_PER_MONTH;
170     if (tod->month < 3)
171     tod->season = 0;
172     else if (tod->month < 6)
173     tod->season = 1;
174     else if (tod->month < 9)
175     tod->season = 2;
176     else if (tod->month < 12)
177     tod->season = 3;
178     else
179     tod->season = 4;
180     }
181    
182     void
183     print_tod(object *op)
184     {
185     timeofday_t tod;
186     const char *suf;
187     int day;
188    
189     get_tod(&tod);
190     sprintf(errmsg, "It is %d minute%s past %d o'clock %s, on %s",
191     tod.minute+1, ((tod.minute+1 < 2) ? "" : "s"),
192     ((tod.hour % 14 == 0) ? 14 : ((tod.hour)%14)),
193     ((tod.hour >= 14) ? "pm" : "am"),
194     weekdays[tod.dayofweek]);
195     new_draw_info(NDI_UNIQUE, 0,op,errmsg);
196    
197     day = tod.day + 1;
198     if (day == 1 || ((day % 10) == 1 && day > 20))
199     suf = "st";
200     else if (day == 2 || ((day % 10) == 2 && day > 20))
201     suf = "nd";
202     else if (day == 3 || ((day % 10) == 3 && day > 20))
203     suf = "rd";
204     else
205     suf = "th";
206     sprintf(errmsg, "The %d%s Day of the %s, Year %d", day, suf,
207     month_name[tod.month], tod.year+1);
208     new_draw_info(NDI_UNIQUE, 0,op,errmsg);
209    
210     sprintf(errmsg, "Time of Year: %s", season_name[tod.season]);
211     new_draw_info(NDI_UNIQUE, 0,op,errmsg);
212     }
213    
214     void
215     time_info(object *op)
216     {
217     int tot = 0, maxt = 0, mint = 99999999, long_count = 0, i;
218    
219     print_tod(op);
220     if (!QUERY_FLAG(op,FLAG_WIZ))
221     return;
222    
223     new_draw_info (NDI_UNIQUE, 0,op,"Total time:");
224     sprintf(errmsg,"ticks=%ld time=%ld.%2ld",
225     pticks, process_tot_mtime/1000, process_tot_mtime%1000);
226     new_draw_info (NDI_UNIQUE, 0,op,errmsg);
227     sprintf(errmsg,"avg time=%ldms max time=%ldms min time=%ldms",
228     process_tot_mtime/pticks, process_max_utime/1000,
229     process_min_utime/1000);
230     new_draw_info (NDI_UNIQUE, 0,op,errmsg);
231     sprintf(errmsg,"ticks longer than max time (%ldms) = %ld (%ld%%)",
232     max_time/1000,
233     process_utime_long_count, 100*process_utime_long_count/pticks);
234     new_draw_info (NDI_UNIQUE, 0,op,errmsg);
235    
236     sprintf(errmsg,"Time last %ld ticks:", pticks > PBUFLEN ? PBUFLEN : pticks);
237     new_draw_info (NDI_UNIQUE, 0,op,errmsg);
238    
239     for (i = 0; i < (pticks > PBUFLEN ? PBUFLEN : pticks); i++) {
240     tot += process_utime_save[i];
241     if (process_utime_save[i] > maxt) maxt = process_utime_save[i];
242     if (process_utime_save[i] < mint) mint = process_utime_save[i];
243     if (process_utime_save[i] > max_time) long_count++;
244     }
245    
246     sprintf(errmsg,"avg time=%ldms max time=%dms min time=%dms",
247     tot/(pticks > PBUFLEN ? PBUFLEN : pticks)/1000, maxt/1000,
248     mint/1000);
249     new_draw_info (NDI_UNIQUE, 0,op,errmsg);
250     sprintf(errmsg,"ticks longer than max time (%ldms) = %d (%ld%%)",
251     max_time/1000, long_count,
252     100*long_count/(pticks > PBUFLEN ? PBUFLEN : pticks));
253     new_draw_info (NDI_UNIQUE, 0,op,errmsg);
254     }
255    
256     long
257     seconds(void)
258     {
259     struct timeval now;
260    
261     (void) GETTIMEOFDAY(&now);
262     return now.tv_sec;
263     }