Changeset 1ab8539 in mainline
- Timestamp:
- 2014-11-14T19:16:23Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5042706
- Parents:
- 9696b01
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/sysinfo/stats.c
r9696b01 r1ab8539 80 80 static mutex_t load_lock; 81 81 82 /** Get system uptime83 *84 * @param item Sysinfo item (unused).85 * @param data Unused.86 *87 * @return System uptime (in secords).88 *89 */90 static sysarg_t get_stats_uptime(struct sysinfo_item *item, void *data)91 {92 /* This doesn't have to be very accurate */93 return uptime->seconds1;94 }95 96 82 /** Get statistics of all CPUs 97 83 * … … 818 804 mutex_initialize(&load_lock, MUTEX_PASSIVE); 819 805 820 sysinfo_set_item_gen_val("system.uptime", NULL, get_stats_uptime, NULL);821 806 sysinfo_set_item_gen_data("system.cpus", NULL, get_stats_cpus, NULL); 822 807 sysinfo_set_item_gen_data("system.physmem", NULL, get_stats_physmem, NULL); -
uspace/app/bnchmark/bnchmark.c
r9696b01 r1ab8539 62 62 { 63 63 struct timeval start_time; 64 int rc; 65 rc = gettimeofday(&start_time, NULL); 66 if (rc != EOK) { 67 fprintf(stderr, "gettimeofday failed\n"); 68 return rc; 69 } 70 71 rc = fn(data); 64 gettimeofday(&start_time, NULL); 65 66 int rc = fn(data); 72 67 if (rc != EOK) { 73 68 fprintf(stderr, "measured function failed\n"); 74 69 return rc; 75 70 } 76 71 77 72 struct timeval final_time; 78 rc = gettimeofday(&final_time, NULL); 79 if (rc != EOK) { 80 fprintf(stderr, "gettimeofday failed\n"); 81 return rc; 82 } 73 gettimeofday(&final_time, NULL); 83 74 84 75 /* Calculate time difference in milliseconds */ … … 92 83 char *path = (char *) data; 93 84 char *buf = malloc(BUFSIZE); 94 95 if (buf == NULL) {85 86 if (buf == NULL) 96 87 return ENOMEM; 97 }98 88 99 89 FILE *file = fopen(path, "r"); -
uspace/app/nettest1/nettest1.c
r9696b01 r1ab8539 402 402 403 403 struct timeval time_before; 404 rc = gettimeofday(&time_before, NULL); 405 if (rc != EOK) { 406 fprintf(stderr, "Get time of day error %d\n", rc); 407 return rc; 408 } 404 gettimeofday(&time_before, NULL); 409 405 410 406 nettest1_test(socket_ids, 1, 1); … … 414 410 415 411 struct timeval time_after; 416 rc = gettimeofday(&time_after, NULL); 417 if (rc != EOK) { 418 fprintf(stderr, "Get time of day error %d\n", rc); 419 return rc; 420 } 412 gettimeofday(&time_after, NULL); 421 413 422 414 printf("Tested in %ld microseconds\n", tv_sub(&time_after, -
uspace/app/nettest2/nettest2.c
r9696b01 r1ab8539 356 356 357 357 struct timeval time_before; 358 rc = gettimeofday(&time_before, NULL); 359 if (rc != EOK) { 360 fprintf(stderr, "Get time of day error %d\n", rc); 361 return rc; 362 } 358 gettimeofday(&time_before, NULL); 363 359 364 360 rc = sockets_sendto_recvfrom(verbose, socket_ids, sockets, address, … … 368 364 369 365 struct timeval time_after; 370 rc = gettimeofday(&time_after, NULL); 371 if (rc != EOK) { 372 fprintf(stderr, "Get time of day error %d\n", rc); 373 return rc; 374 } 366 gettimeofday(&time_after, NULL); 375 367 376 368 if (verbose) … … 380 372 tv_sub(&time_after, &time_before)); 381 373 382 rc = gettimeofday(&time_before, NULL); 383 if (rc != EOK) { 384 fprintf(stderr, "Get time of day error %d\n", rc); 385 return rc; 386 } 374 gettimeofday(&time_before, NULL); 387 375 388 376 rc = sockets_sendto(verbose, socket_ids, sockets, address, addrlen, … … 396 384 return rc; 397 385 398 rc = gettimeofday(&time_after, NULL); 399 if (rc != EOK) { 400 fprintf(stderr, "Get time of day error %d\n", rc); 401 return rc; 402 } 386 gettimeofday(&time_after, NULL); 403 387 404 388 if (verbose) -
uspace/app/stats/stats.c
r9696b01 r1ab8539 191 191 static void print_uptime(void) 192 192 { 193 sysarg_t uptime = stats_get_uptime(); 194 printf("%s: Up %" PRIun " days, %" PRIun " hours, " 195 "%" PRIun " minutes, %" PRIun " seconds\n", NAME, 196 uptime / DAY, (uptime % DAY) / HOUR, 197 (uptime % HOUR) / MINUTE, uptime % MINUTE); 193 struct timeval uptime; 194 getuptime(&uptime); 195 196 printf("%s: Up %ld days, %ld hours, %ld minutes, %ld seconds\n", 197 NAME, uptime.tv_sec / DAY, (uptime.tv_sec % DAY) / HOUR, 198 (uptime.tv_sec % HOUR) / MINUTE, uptime.tv_sec % MINUTE); 198 199 } 199 200 -
uspace/app/tester/ipc/ping_pong.c
r9696b01 r1ab8539 43 43 44 44 struct timeval start; 45 if (gettimeofday(&start, NULL) != 0) { 46 TPRINTF("\n"); 47 return "Failed getting the time"; 48 } 45 gettimeofday(&start, NULL); 49 46 50 47 uint64_t count = 0; 51 48 while (true) { 52 49 struct timeval now; 53 if (gettimeofday(&now, NULL) != 0) { 54 TPRINTF("\n"); 55 return "Failed getting the time"; 56 } 50 gettimeofday(&now, NULL); 57 51 58 52 if (tv_sub(&now, &start) >= DURATION_SECS * 1000000L) -
uspace/app/tester/ipc/starve.c
r9696b01 r1ab8539 40 40 const char *err = NULL; 41 41 console_ctrl_t *console = console_init(stdin, stdout); 42 if (console == NULL) {42 if (console == NULL) 43 43 return "Failed to init connection with console."; 44 }45 44 46 45 struct timeval start; 47 if (gettimeofday(&start, NULL) != 0) { 48 err = "Failed getting the time"; 49 goto leave; 50 } 46 gettimeofday(&start, NULL); 51 47 52 48 TPRINTF("Intensive computation shall be imagined (for %ds)...\n", DURATION_SECS); … … 54 50 while (true) { 55 51 struct timeval now; 56 if (gettimeofday(&now, NULL) != 0) { 57 err = "Failed getting the time"; 58 goto leave; 59 } 52 gettimeofday(&now, NULL); 60 53 61 54 if (tv_sub(&now, &start) >= DURATION_SECS * 1000000L) … … 70 63 } 71 64 } 72 65 73 66 // FIXME - unless a key was pressed, the answer leaked as no one 74 67 // will wait for it. 75 68 // We cannot use async_forget() directly, though. Something like 76 69 // console_forget_pending_kbd_event() shall come here. 77 70 78 71 TPRINTF("Terminating...\n"); 79 80 leave: 72 81 73 console_done(console); 82 74 83 75 return err; 84 76 } -
uspace/app/testread/testread.c
r9696b01 r1ab8539 123 123 struct timeval prev_time; 124 124 struct timeval start_time; 125 int rc; 126 rc = gettimeofday(&start_time, NULL); 127 if (rc != EOK) { 128 printf("gettimeofday failed\n"); 129 fclose(file); 130 free(buf); 131 return 1; 132 } 125 gettimeofday(&start_time, NULL); 133 126 prev_time = start_time; 134 127 … … 155 148 if (progress && offset >= next_mark) { 156 149 struct timeval cur_time; 157 rc = gettimeofday(&cur_time, NULL); 158 if (rc != EOK) { 159 printf("gettimeofday failed\n"); 160 fclose(file); 161 free(buf); 162 return 1; 163 } 150 gettimeofday(&cur_time, NULL); 151 164 152 uint32_t last_run = cur_time.tv_sec - prev_time.tv_sec; 165 153 uint32_t total_time = cur_time.tv_sec - start_time.tv_sec; … … 178 166 179 167 struct timeval final_time; 180 rc = gettimeofday(&final_time, NULL); 181 if (rc != EOK) { 182 printf("gettimeofday failed\n"); 183 fclose(file); 184 free(buf); 185 return 1; 186 } 168 gettimeofday(&final_time, NULL); 187 169 188 170 uint32_t total_run_time = final_time.tv_sec - start_time.tv_sec; -
uspace/app/top/top.c
r9696b01 r1ab8539 156 156 /* Get current time */ 157 157 struct timeval time; 158 if (gettimeofday(&time, NULL) != EOK) 159 return "Cannot get time of day"; 158 gettimeofday(&time, NULL); 160 159 161 160 target->hours = (time.tv_sec % DAY) / HOUR; … … 164 163 165 164 /* Get uptime */ 166 sysarg_t uptime = stats_get_uptime(); 167 target->udays = uptime / DAY; 168 target->uhours = (uptime % DAY) / HOUR; 169 target->uminutes = (uptime % HOUR) / MINUTE; 170 target->useconds = uptime % MINUTE; 165 struct timeval uptime; 166 getuptime(&uptime); 167 168 target->udays = uptime.tv_sec / DAY; 169 target->uhours = (uptime.tv_sec % DAY) / HOUR; 170 target->uminutes = (uptime.tv_sec % HOUR) / MINUTE; 171 target->useconds = uptime.tv_sec % MINUTE; 171 172 172 173 /* Get load */ -
uspace/lib/c/generic/stats.c
r9696b01 r1ab8539 291 291 } 292 292 293 /** Get system uptime294 *295 * @return System uptime (in seconds).296 *297 */298 sysarg_t stats_get_uptime(void)299 {300 sysarg_t uptime;301 if (sysinfo_get_value("system.uptime", &uptime) != EOK)302 uptime = 0;303 304 return uptime;305 }306 307 293 /** Print load fixed-point value 308 294 * -
uspace/lib/c/generic/time.c
r9696b01 r1ab8539 54 54 #include <malloc.h> 55 55 56 #define ASCTIME_BUF_LEN 26 56 #define ASCTIME_BUF_LEN 26 57 58 #define HOURS_PER_DAY 24 59 #define MINS_PER_HOUR 60 60 #define SECS_PER_MIN 60 61 #define MINS_PER_DAY (MINS_PER_HOUR * HOURS_PER_DAY) 62 #define SECS_PER_HOUR (SECS_PER_MIN * MINS_PER_HOUR) 63 #define SECS_PER_DAY (SECS_PER_HOUR * HOURS_PER_DAY) 57 64 58 65 /** Pointer to kernel shared variables with time */ … … 63 70 } *ktime = NULL; 64 71 65 /* Helper functions ***********************************************************/ 66 67 #define HOURS_PER_DAY (24) 68 #define MINS_PER_HOUR (60) 69 #define SECS_PER_MIN (60) 70 #define MINS_PER_DAY (MINS_PER_HOUR * HOURS_PER_DAY) 71 #define SECS_PER_HOUR (SECS_PER_MIN * MINS_PER_HOUR) 72 #define SECS_PER_DAY (SECS_PER_HOUR * HOURS_PER_DAY) 73 74 /** 75 * Checks whether the year is a leap year. 72 static async_sess_t *clock_conn = NULL; 73 74 /** Check whether the year is a leap year. 76 75 * 77 76 * @param year Year since 1900 (e.g. for 1970, the value is 70). 77 * 78 78 * @return true if year is a leap year, false otherwise 79 */ 80 static bool _is_leap_year(time_t year) 79 * 80 */ 81 static bool is_leap_year(time_t year) 81 82 { 82 83 year += 1900; 83 84 84 85 if (year % 400 == 0) 85 86 return true; 87 86 88 if (year % 100 == 0) 87 89 return false; 90 88 91 if (year % 4 == 0) 89 92 return true; 93 90 94 return false; 91 95 } 92 96 93 /** 94 * Returns how many days there are in the given month of the given year. 97 /** How many days there are in the given month 98 * 99 * Return how many days there are in the given month of the given year. 95 100 * Note that year is only taken into account if month is February. 96 101 * 97 102 * @param year Year since 1900 (can be negative). 98 * @param mon Month of the year. 0 for January, 11 for December. 103 * @param mon Month of the year. 0 for January, 11 for December. 104 * 99 105 * @return Number of days in the specified month. 100 */ 101 static int _days_in_month(time_t year, time_t mon) 102 { 103 assert(mon >= 0 && mon <= 11); 104 105 static int month_days[] = 106 { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 107 106 * 107 */ 108 static int days_in_month(time_t year, time_t mon) 109 { 110 assert(mon >= 0); 111 assert(mon <= 11); 112 113 static int month_days[] = { 114 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 115 }; 116 108 117 if (mon == 1) { 118 /* February */ 109 119 year += 1900; 110 /* february */111 return _is_leap_year(year) ? 29 : 28;112 } else {113 114 115 } 116 117 /**118 * For specified year, month and day of month, return swhich day of that year120 return is_leap_year(year) ? 29 : 28; 121 } 122 123 return month_days[mon]; 124 } 125 126 /** Which day of that year it is. 127 * 128 * For specified year, month and day of month, return which day of that year 119 129 * it is. 120 130 * 121 131 * For example, given date 2011-01-03, the corresponding expression is: 122 * _day_of_year(111, 0, 3) == 2132 * day_of_year(111, 0, 3) == 2 123 133 * 124 134 * @param year Year (year 1900 = 0, can be negative). 125 * @param mon Month (January = 0).135 * @param mon Month (January = 0). 126 136 * @param mday Day of month (First day is 1). 137 * 127 138 * @return Day of year (First day is 0). 128 */ 129 static int _day_of_year(time_t year, time_t mon, time_t mday) 130 { 131 static int mdays[] = 132 { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 }; 133 static int leap_mdays[] = 134 { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 }; 135 136 return (_is_leap_year(year) ? leap_mdays[mon] : mdays[mon]) + mday - 1; 137 } 138 139 /** 140 * Integer division that rounds to negative infinity. 141 * Used by some functions in this file. 139 * 140 */ 141 static int day_of_year(time_t year, time_t mon, time_t mday) 142 { 143 static int mdays[] = { 144 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 145 }; 146 147 static int leap_mdays[] = { 148 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 149 }; 150 151 return (is_leap_year(year) ? leap_mdays[mon] : mdays[mon]) + mday - 1; 152 } 153 154 /** Integer division that rounds to negative infinity. 155 * 156 * Used by some functions in this module. 142 157 * 143 158 * @param op1 Dividend. 144 159 * @param op2 Divisor. 160 * 145 161 * @return Rounded quotient. 146 */ 147 static time_t _floor_div(time_t op1, time_t op2) 148 { 149 if (op1 >= 0 || op1 % op2 == 0) { 162 * 163 */ 164 static time_t floor_div(time_t op1, time_t op2) 165 { 166 if ((op1 >= 0) || (op1 % op2 == 0)) 150 167 return op1 / op2; 151 } else { 152 return op1 / op2 - 1; 153 } 154 } 155 156 /** 157 * Modulo that rounds to negative infinity. 158 * Used by some functions in this file. 168 169 return op1 / op2 - 1; 170 } 171 172 /** Modulo that rounds to negative infinity. 173 * 174 * Used by some functions in this module. 159 175 * 160 176 * @param op1 Dividend. 161 177 * @param op2 Divisor. 178 * 162 179 * @return Remainder. 163 */ 164 static time_t _floor_mod(time_t op1, time_t op2) 165 { 166 int div = _floor_div(op1, op2); 167 168 /* (a / b) * b + a % b == a */ 169 /* thus, a % b == a - (a / b) * b */ 170 171 int result = op1 - div * op2; 172 173 /* Some paranoid checking to ensure I didn't make a mistake here. */ 180 * 181 */ 182 static time_t floor_mod(time_t op1, time_t op2) 183 { 184 time_t div = floor_div(op1, op2); 185 186 /* 187 * (a / b) * b + a % b == a 188 * Thus: a % b == a - (a / b) * b 189 */ 190 191 time_t result = op1 - div * op2; 192 193 /* Some paranoid checking to ensure there is mistake here. */ 174 194 assert(result >= 0); 175 195 assert(result < op2); … … 179 199 } 180 200 181 /** 182 * Number of days since the Epoch.201 /** Number of days since the Epoch. 202 * 183 203 * Epoch is 1970-01-01, which is also equal to day 0. 184 204 * 185 205 * @param year Year (year 1900 = 0, may be negative). 186 * @param mon Month (January = 0).206 * @param mon Month (January = 0). 187 207 * @param mday Day of month (first day = 1). 208 * 188 209 * @return Number of days since the Epoch. 189 */ 190 static time_t _days_since_epoch(time_t year, time_t mon, time_t mday) 191 { 192 return (year - 70) * 365 + _floor_div(year - 69, 4) - 193 _floor_div(year - 1, 100) + _floor_div(year + 299, 400) + 194 _day_of_year(year, mon, mday); 195 } 196 197 /** 198 * Seconds since the Epoch. see also _days_since_epoch(). 199 * 210 * 211 */ 212 static time_t days_since_epoch(time_t year, time_t mon, time_t mday) 213 { 214 return (year - 70) * 365 + floor_div(year - 69, 4) - 215 floor_div(year - 1, 100) + floor_div(year + 299, 400) + 216 day_of_year(year, mon, mday); 217 } 218 219 /** Seconds since the Epoch. 220 * 221 * See also days_since_epoch(). 222 * 200 223 * @param tm Normalized broken-down time. 224 * 201 225 * @return Number of seconds since the epoch, not counting leap seconds. 202 */ 203 static time_t _secs_since_epoch(const struct tm *tm) 204 { 205 return _days_since_epoch(tm->tm_year, tm->tm_mon, tm->tm_mday) * 226 * 227 */ 228 static time_t secs_since_epoch(const struct tm *tm) 229 { 230 return days_since_epoch(tm->tm_year, tm->tm_mon, tm->tm_mday) * 206 231 SECS_PER_DAY + tm->tm_hour * SECS_PER_HOUR + 207 232 tm->tm_min * SECS_PER_MIN + tm->tm_sec; 208 233 } 209 234 210 /** 211 * Which day of week the specified date is. 212 * 235 /** Which day of week the specified date is. 236 * 213 237 * @param year Year (year 1900 = 0). 214 * @param mon Month (January = 0).238 * @param mon Month (January = 0). 215 239 * @param mday Day of month (first = 1). 240 * 216 241 * @return Day of week (Sunday = 0). 217 */ 218 static int _day_of_week(time_t year, time_t mon, time_t mday) 242 * 243 */ 244 static time_t day_of_week(time_t year, time_t mon, time_t mday) 219 245 { 220 246 /* 1970-01-01 is Thursday */ 221 return _floor_mod((_days_since_epoch(year, mon, mday) + 4), 7);222 } 223 224 /** 225 * Normalizes the broken-down time and optionally adds specified amount of226 * seconds.227 * 228 * @param tm Broken-down time to normalize.247 return floor_mod(days_since_epoch(year, mon, mday) + 4, 7); 248 } 249 250 /** Normalize the broken-down time. 251 * 252 * Optionally add specified amount of seconds. 253 * 254 * @param tm Broken-down time to normalize. 229 255 * @param sec_add Seconds to add. 256 * 230 257 * @return 0 on success, -1 on overflow 231 */ 232 static int _normalize_time(struct tm *tm, time_t sec_add) 258 * 259 */ 260 static int normalize_time(struct tm *tm, time_t sec_add) 233 261 { 234 262 // TODO: DST correction 235 263 236 264 /* Set initial values. */ 237 265 time_t sec = tm->tm_sec + sec_add; … … 241 269 time_t mon = tm->tm_mon; 242 270 time_t year = tm->tm_year; 243 271 244 272 /* Adjust time. */ 245 min += _floor_div(sec, SECS_PER_MIN);246 sec = _floor_mod(sec, SECS_PER_MIN);247 hour += _floor_div(min, MINS_PER_HOUR);248 min = _floor_mod(min, MINS_PER_HOUR);249 day += _floor_div(hour, HOURS_PER_DAY);250 hour = _floor_mod(hour, HOURS_PER_DAY);251 273 min += floor_div(sec, SECS_PER_MIN); 274 sec = floor_mod(sec, SECS_PER_MIN); 275 hour += floor_div(min, MINS_PER_HOUR); 276 min = floor_mod(min, MINS_PER_HOUR); 277 day += floor_div(hour, HOURS_PER_DAY); 278 hour = floor_mod(hour, HOURS_PER_DAY); 279 252 280 /* Adjust month. */ 253 year += _floor_div(mon, 12);254 mon = _floor_mod(mon, 12);255 281 year += floor_div(mon, 12); 282 mon = floor_mod(mon, 12); 283 256 284 /* Now the difficult part - days of month. */ 257 285 258 286 /* First, deal with whole cycles of 400 years = 146097 days. */ 259 year += _floor_div(day, 146097) * 400;260 day = _floor_mod(day, 146097);287 year += floor_div(day, 146097) * 400; 288 day = floor_mod(day, 146097); 261 289 262 290 /* Then, go in one year steps. */ … … 264 292 /* January and February. */ 265 293 while (day > 365) { 266 day -= _is_leap_year(year) ? 366 : 365;294 day -= is_leap_year(year) ? 366 : 365; 267 295 year++; 268 296 } … … 270 298 /* Rest of the year. */ 271 299 while (day > 365) { 272 day -= _is_leap_year(year + 1) ? 366 : 365;300 day -= is_leap_year(year + 1) ? 366 : 365; 273 301 year++; 274 302 } … … 276 304 277 305 /* Finally, finish it off month per month. */ 278 while (day >= _days_in_month(year, mon)) {279 day -= _days_in_month(year, mon);306 while (day >= days_in_month(year, mon)) { 307 day -= days_in_month(year, mon); 280 308 mon++; 309 281 310 if (mon >= 12) { 282 311 mon -= 12; … … 286 315 287 316 /* Calculate the remaining two fields. */ 288 tm->tm_yday = _day_of_year(year, mon, day + 1);289 tm->tm_wday = _day_of_week(year, mon, day + 1);317 tm->tm_yday = day_of_year(year, mon, day + 1); 318 tm->tm_wday = day_of_week(year, mon, day + 1); 290 319 291 320 /* And put the values back to the struct. */ … … 296 325 tm->tm_mon = (int) mon; 297 326 298 /* Casts to work around libcbrain-damage. */299 if (year > ((int) INT_MAX) || year < ((int)INT_MIN)) {300 tm->tm_year = (year < 0) ? ((int) INT_MIN) : ((int)INT_MAX);327 /* Casts to work around POSIX brain-damage. */ 328 if (year > ((int) INT_MAX) || year < ((int) INT_MIN)) { 329 tm->tm_year = (year < 0) ? ((int) INT_MIN) : ((int) INT_MAX); 301 330 return -1; 302 331 } … … 306 335 } 307 336 308 /** 309 * Which day the week-based year starts on, relative to the first calendar day. 310 * E.g. if the year starts on December 31st, the return value is -1. 337 /** Which day the week-based year starts on. 338 * 339 * Relative to the first calendar day. E.g. if the year starts 340 * on December 31st, the return value is -1. 311 341 * 312 342 * @param Year since 1900. 343 * 313 344 * @return Offset of week-based year relative to calendar year. 314 */ 315 static int _wbyear_offset(int year) 316 { 317 int start_wday = _day_of_week(year, 0, 1); 318 return _floor_mod(4 - start_wday, 7) - 3; 319 } 320 321 /** 322 * Returns week-based year of the specified time. 345 * 346 */ 347 static int wbyear_offset(int year) 348 { 349 int start_wday = day_of_week(year, 0, 1); 350 351 return floor_mod(4 - start_wday, 7) - 3; 352 } 353 354 /** Week-based year of the specified time. 323 355 * 324 356 * @param tm Normalized broken-down time. 357 * 325 358 * @return Week-based year. 326 */ 327 static int _wbyear(const struct tm *tm) 328 { 329 int day = tm->tm_yday - _wbyear_offset(tm->tm_year); 359 * 360 */ 361 static int wbyear(const struct tm *tm) 362 { 363 int day = tm->tm_yday - wbyear_offset(tm->tm_year); 364 330 365 if (day < 0) { 331 366 /* Last week of previous year. */ 332 367 return tm->tm_year - 1; 333 368 } 334 if (day > 364 + _is_leap_year(tm->tm_year)) { 369 370 if (day > 364 + is_leap_year(tm->tm_year)) { 335 371 /* First week of next year. */ 336 372 return tm->tm_year + 1; 337 373 } 374 338 375 /* All the other days are in the calendar year. */ 339 376 return tm->tm_year; 340 377 } 341 378 342 /** 343 * Week number of the year, assuming weeks start on sunday.379 /** Week number of the year (assuming weeks start on Sunday). 380 * 344 381 * The first Sunday of January is the first day of week 1; 345 382 * days in the new year before this are in week 0. 346 383 * 347 384 * @param tm Normalized broken-down time. 385 * 348 386 * @return The week number (0 - 53). 349 */ 350 static int _sun_week_number(const struct tm *tm) 351 { 352 int first_day = (7 - _day_of_week(tm->tm_year, 0, 1)) % 7; 387 * 388 */ 389 static int sun_week_number(const struct tm *tm) 390 { 391 int first_day = (7 - day_of_week(tm->tm_year, 0, 1)) % 7; 392 353 393 return (tm->tm_yday - first_day + 7) / 7; 354 394 } 355 395 356 /** 357 * Week number of the year, assuming weeks start on monday. 358 * If the week containing January 1st has four or more days in the new year, 359 * then it is considered week 1. Otherwise, it is the last week of the previous 360 * year, and the next week is week 1. Both January 4th and the first Thursday 396 /** Week number of the year (assuming weeks start on Monday). 397 * 398 * If the week containing January 1st has four or more days 399 * in the new year, then it is considered week 1. Otherwise, 400 * it is the last week of the previous year, and the next week 401 * is week 1. Both January 4th and the first Thursday 361 402 * of January are always in week 1. 362 403 * 363 404 * @param tm Normalized broken-down time. 405 * 364 406 * @return The week number (1 - 53). 365 */ 366 static int _iso_week_number(const struct tm *tm) 367 { 368 int day = tm->tm_yday - _wbyear_offset(tm->tm_year); 407 * 408 */ 409 static int iso_week_number(const struct tm *tm) 410 { 411 int day = tm->tm_yday - wbyear_offset(tm->tm_year); 412 369 413 if (day < 0) { 370 414 /* Last week of previous year. */ 371 415 return 53; 372 416 } 373 if (day > 364 + _is_leap_year(tm->tm_year)) { 417 418 if (day > 364 + is_leap_year(tm->tm_year)) { 374 419 /* First week of next year. */ 375 420 return 1; 376 421 } 422 377 423 /* All the other days give correct answer. */ 378 424 return (day / 7 + 1); 379 425 } 380 426 381 /** 382 * Week number of the year, assuming weeks start on monday.427 /** Week number of the year (assuming weeks start on Monday). 428 * 383 429 * The first Monday of January is the first day of week 1; 384 * days in the new year before this are in week 0. 430 * days in the new year before this are in week 0. 385 431 * 386 432 * @param tm Normalized broken-down time. 433 * 387 434 * @return The week number (0 - 53). 388 */ 389 static int _mon_week_number(const struct tm *tm) 390 { 391 int first_day = (1 - _day_of_week(tm->tm_year, 0, 1)) % 7; 435 * 436 */ 437 static int mon_week_number(const struct tm *tm) 438 { 439 int first_day = (1 - day_of_week(tm->tm_year, 0, 1)) % 7; 440 392 441 return (tm->tm_yday - first_day + 7) / 7; 393 442 } 394 395 /******************************************************************************/396 397 443 398 444 /** Add microseconds to given timeval. … … 468 514 } 469 515 470 /** Get time of day 516 /** Get time of day. 471 517 * 472 518 * The time variables are memory mapped (read-only) from kernel which … … 482 528 * 483 529 */ 484 int gettimeofday(struct timeval *tv, struct timezone *tz) 485 { 486 int rc; 487 struct tm t; 488 category_id_t cat_id; 489 size_t svc_cnt; 490 service_id_t *svc_ids = NULL; 491 service_id_t svc_id; 492 char *svc_name = NULL; 493 494 static async_sess_t *clock_conn = NULL; 495 530 void gettimeofday(struct timeval *tv, struct timezone *tz) 531 { 496 532 if (tz) { 497 533 tz->tz_minuteswest = 0; 498 534 tz->tz_dsttime = DST_NONE; 499 535 } 500 536 501 537 if (clock_conn == NULL) { 502 rc = loc_category_get_id("clock", &cat_id, IPC_FLAG_BLOCKING); 538 category_id_t cat_id; 539 int rc = loc_category_get_id("clock", &cat_id, IPC_FLAG_BLOCKING); 503 540 if (rc != EOK) 504 goto ret_uptime; 505 541 goto fallback; 542 543 service_id_t *svc_ids; 544 size_t svc_cnt; 506 545 rc = loc_category_get_svcs(cat_id, &svc_ids, &svc_cnt); 507 546 if (rc != EOK) 508 goto ret_uptime;509 547 goto fallback; 548 510 549 if (svc_cnt == 0) 511 goto ret_uptime; 512 550 goto fallback; 551 552 char *svc_name; 513 553 rc = loc_service_get_name(svc_ids[0], &svc_name); 554 free(svc_ids); 514 555 if (rc != EOK) 515 goto ret_uptime; 516 556 goto fallback; 557 558 service_id_t svc_id; 517 559 rc = loc_service_get_id(svc_name, &svc_id, 0); 560 free(svc_name); 518 561 if (rc != EOK) 519 goto ret_uptime;520 562 goto fallback; 563 521 564 clock_conn = loc_service_connect(EXCHANGE_SERIALIZE, 522 565 svc_id, IPC_FLAG_BLOCKING); 523 566 if (!clock_conn) 524 goto ret_uptime; 525 } 526 527 rc = clock_dev_time_get(clock_conn, &t); 567 goto fallback; 568 } 569 570 struct tm time; 571 int rc = clock_dev_time_get(clock_conn, &time); 528 572 if (rc != EOK) 529 goto ret_uptime;530 573 goto fallback; 574 531 575 tv->tv_usec = 0; 532 tv->tv_sec = mktime(&t); 533 534 free(svc_name); 535 free(svc_ids); 536 537 return EOK; 538 539 ret_uptime: 540 541 free(svc_name); 542 free(svc_ids); 543 544 return getuptime(tv); 545 } 546 547 int getuptime(struct timeval *tv) 576 tv->tv_sec = mktime(&time); 577 578 return; 579 580 fallback: 581 getuptime(tv); 582 } 583 584 void getuptime(struct timeval *tv) 548 585 { 549 586 if (ktime == NULL) { … … 552 589 if (rc != EOK) { 553 590 errno = rc; 554 return -1;591 goto fallback; 555 592 } 556 593 … … 561 598 as_area_destroy(addr); 562 599 errno = rc; 563 return -1;600 goto fallback; 564 601 } 565 602 … … 580 617 } else 581 618 tv->tv_sec = s1; 582 583 return 0; 619 620 return; 621 622 fallback: 623 tv->tv_sec = 0; 624 tv->tv_usec = 0; 584 625 } 585 626 … … 587 628 { 588 629 struct timeval tv; 589 if (gettimeofday(&tv, NULL)) 590 return (time_t) -1; 630 gettimeofday(&tv, NULL); 591 631 592 632 if (tloc) … … 631 671 } 632 672 633 /** 634 * This function first normalizes the provided broken-down time 635 * (moves all values to their proper bounds) and then tries to 636 * calculate the appropriate time_t representation. 673 /** Get time from broken-down time. 674 * 675 * First normalize the provided broken-down time 676 * (moves all values to their proper bounds) and 677 * then try to calculate the appropriate time_t 678 * representation. 637 679 * 638 680 * @param tm Broken-down time. 639 * @return time_t representation of the time, undefined value on overflow. 681 * 682 * @return time_t representation of the time. 683 * @return Undefined value on overflow. 684 * 640 685 */ 641 686 time_t mktime(struct tm *tm) … … 643 688 // TODO: take DST flag into account 644 689 // TODO: detect overflow 645 646 _normalize_time(tm, 0); 647 return _secs_since_epoch(tm); 648 } 649 650 /** 651 * Convert time and date to a string, based on a specified format and 652 * current locale. 653 * 654 * @param s Buffer to write string to. 690 691 normalize_time(tm, 0); 692 return secs_since_epoch(tm); 693 } 694 695 /* 696 * FIXME: This requires POSIX-correct snprintf. 697 * Otherwise it won't work with non-ASCII chars. 698 */ 699 #define APPEND(...) \ 700 { \ 701 consumed = snprintf(ptr, remaining, __VA_ARGS__); \ 702 if (consumed >= remaining) \ 703 return 0; \ 704 \ 705 ptr += consumed; \ 706 remaining -= consumed; \ 707 } 708 709 #define RECURSE(fmt) \ 710 { \ 711 consumed = strftime(ptr, remaining, fmt, tm); \ 712 if (consumed == 0) \ 713 return 0; \ 714 \ 715 ptr += consumed; \ 716 remaining -= consumed; \ 717 } 718 719 #define TO_12H(hour) \ 720 (((hour) > 12) ? ((hour) - 12) : \ 721 (((hour) == 0) ? 12 : (hour))) 722 723 /** Convert time and date to a string. 724 * 725 * @param s Buffer to write string to. 655 726 * @param maxsize Size of the buffer. 656 * @param format Format of the output. 657 * @param tm Broken-down time to format. 727 * @param format Format of the output. 728 * @param tm Broken-down time to format. 729 * 658 730 * @return Number of bytes written. 731 * 659 732 */ 660 733 size_t strftime(char *restrict s, size_t maxsize, … … 664 737 assert(format != NULL); 665 738 assert(tm != NULL); 666 739 667 740 // TODO: use locale 741 668 742 static const char *wday_abbr[] = { 669 743 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 670 744 }; 745 671 746 static const char *wday[] = { 672 747 "Sunday", "Monday", "Tuesday", "Wednesday", 673 748 "Thursday", "Friday", "Saturday" 674 749 }; 750 675 751 static const char *mon_abbr[] = { 676 752 "Jan", "Feb", "Mar", "Apr", "May", "Jun", 677 753 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 678 754 }; 755 679 756 static const char *mon[] = { 680 757 "January", "February", "March", "April", "May", "June", "July", … … 682 759 }; 683 760 684 if (maxsize < 1) {761 if (maxsize < 1) 685 762 return 0; 686 }687 763 688 764 char *ptr = s; … … 690 766 size_t remaining = maxsize; 691 767 692 #define append(...) { \693 /* FIXME: this requires POSIX-correct snprintf */ \694 /* otherwise it won't work with non-ascii chars */ \695 consumed = snprintf(ptr, remaining, __VA_ARGS__); \696 if (consumed >= remaining) { \697 return 0; \698 } \699 ptr += consumed; \700 remaining -= consumed; \701 }702 703 #define recurse(fmt) { \704 consumed = strftime(ptr, remaining, fmt, tm); \705 if (consumed == 0) { \706 return 0; \707 } \708 ptr += consumed; \709 remaining -= consumed; \710 }711 712 #define TO_12H(hour) (((hour) > 12) ? ((hour) - 12) : \713 (((hour) == 0) ? 12 : (hour)))714 715 768 while (*format != '\0') { 716 769 if (*format != '%') { 717 append("%c", *format);770 APPEND("%c", *format); 718 771 format++; 719 772 continue; … … 721 774 722 775 format++; 723 if ( *format == '0' || *format == '+') {776 if ((*format == '0') || (*format == '+')) { 724 777 // TODO: padding 725 778 format++; 726 779 } 780 727 781 while (isdigit(*format)) { 728 782 // TODO: padding 729 783 format++; 730 784 } 731 if (*format == 'O' || *format == 'E') { 785 786 if ((*format == 'O') || (*format == 'E')) { 732 787 // TODO: locale's alternative format 733 788 format++; … … 736 791 switch (*format) { 737 792 case 'a': 738 append("%s", wday_abbr[tm->tm_wday]); break; 793 APPEND("%s", wday_abbr[tm->tm_wday]); 794 break; 739 795 case 'A': 740 append("%s", wday[tm->tm_wday]); break; 796 APPEND("%s", wday[tm->tm_wday]); 797 break; 741 798 case 'b': 742 append("%s", mon_abbr[tm->tm_mon]); break; 799 APPEND("%s", mon_abbr[tm->tm_mon]); 800 break; 743 801 case 'B': 744 append("%s", mon[tm->tm_mon]); break; 802 APPEND("%s", mon[tm->tm_mon]); 803 break; 745 804 case 'c': 746 805 // TODO: locale-specific datetime format 747 recurse("%Y-%m-%d %H:%M:%S"); break; 806 RECURSE("%Y-%m-%d %H:%M:%S"); 807 break; 748 808 case 'C': 749 append("%02d", (1900 + tm->tm_year) / 100); break; 809 APPEND("%02d", (1900 + tm->tm_year) / 100); 810 break; 750 811 case 'd': 751 append("%02d", tm->tm_mday); break; 812 APPEND("%02d", tm->tm_mday); 813 break; 752 814 case 'D': 753 recurse("%m/%d/%y"); break; 815 RECURSE("%m/%d/%y"); 816 break; 754 817 case 'e': 755 append("%2d", tm->tm_mday); break; 818 APPEND("%2d", tm->tm_mday); 819 break; 756 820 case 'F': 757 recurse("%+4Y-%m-%d"); break; 821 RECURSE("%+4Y-%m-%d"); 822 break; 758 823 case 'g': 759 append("%02d", _wbyear(tm) % 100); break; 824 APPEND("%02d", wbyear(tm) % 100); 825 break; 760 826 case 'G': 761 append("%d", _wbyear(tm)); break; 827 APPEND("%d", wbyear(tm)); 828 break; 762 829 case 'h': 763 recurse("%b"); break; 830 RECURSE("%b"); 831 break; 764 832 case 'H': 765 append("%02d", tm->tm_hour); break; 833 APPEND("%02d", tm->tm_hour); 834 break; 766 835 case 'I': 767 append("%02d", TO_12H(tm->tm_hour)); break; 836 APPEND("%02d", TO_12H(tm->tm_hour)); 837 break; 768 838 case 'j': 769 append("%03d", tm->tm_yday); break; 839 APPEND("%03d", tm->tm_yday); 840 break; 770 841 case 'k': 771 append("%2d", tm->tm_hour); break; 842 APPEND("%2d", tm->tm_hour); 843 break; 772 844 case 'l': 773 append("%2d", TO_12H(tm->tm_hour)); break; 845 APPEND("%2d", TO_12H(tm->tm_hour)); 846 break; 774 847 case 'm': 775 append("%02d", tm->tm_mon); break; 848 APPEND("%02d", tm->tm_mon); 849 break; 776 850 case 'M': 777 append("%02d", tm->tm_min); break; 851 APPEND("%02d", tm->tm_min); 852 break; 778 853 case 'n': 779 append("\n"); break; 854 APPEND("\n"); 855 break; 780 856 case 'p': 781 append("%s", tm->tm_hour < 12 ? "AM" : "PM"); break; 857 APPEND("%s", tm->tm_hour < 12 ? "AM" : "PM"); 858 break; 782 859 case 'P': 783 append("%s", tm->tm_hour < 12 ? "am" : "PM"); break; 860 APPEND("%s", tm->tm_hour < 12 ? "am" : "PM"); 861 break; 784 862 case 'r': 785 recurse("%I:%M:%S %p"); break; 863 RECURSE("%I:%M:%S %p"); 864 break; 786 865 case 'R': 787 recurse("%H:%M"); break; 866 RECURSE("%H:%M"); 867 break; 788 868 case 's': 789 append("%ld", _secs_since_epoch(tm)); break; 869 APPEND("%ld", secs_since_epoch(tm)); 870 break; 790 871 case 'S': 791 append("%02d", tm->tm_sec); break; 872 APPEND("%02d", tm->tm_sec); 873 break; 792 874 case 't': 793 append("\t"); break; 875 APPEND("\t"); 876 break; 794 877 case 'T': 795 recurse("%H:%M:%S"); break; 878 RECURSE("%H:%M:%S"); 879 break; 796 880 case 'u': 797 append("%d", (tm->tm_wday == 0) ? 7 : tm->tm_wday);881 APPEND("%d", (tm->tm_wday == 0) ? 7 : tm->tm_wday); 798 882 break; 799 883 case 'U': 800 append("%02d", _sun_week_number(tm)); break; 884 APPEND("%02d", sun_week_number(tm)); 885 break; 801 886 case 'V': 802 append("%02d", _iso_week_number(tm)); break; 887 APPEND("%02d", iso_week_number(tm)); 888 break; 803 889 case 'w': 804 append("%d", tm->tm_wday); break; 890 APPEND("%d", tm->tm_wday); 891 break; 805 892 case 'W': 806 append("%02d", _mon_week_number(tm)); break; 893 APPEND("%02d", mon_week_number(tm)); 894 break; 807 895 case 'x': 808 896 // TODO: locale-specific date format 809 recurse("%Y-%m-%d"); break; 897 RECURSE("%Y-%m-%d"); 898 break; 810 899 case 'X': 811 900 // TODO: locale-specific time format 812 recurse("%H:%M:%S"); break; 901 RECURSE("%H:%M:%S"); 902 break; 813 903 case 'y': 814 append("%02d", tm->tm_year % 100); break; 904 APPEND("%02d", tm->tm_year % 100); 905 break; 815 906 case 'Y': 816 append("%d", 1900 + tm->tm_year); break; 907 APPEND("%d", 1900 + tm->tm_year); 908 break; 817 909 case 'z': 818 910 // TODO: timezone … … 822 914 break; 823 915 case '%': 824 append("%%");916 APPEND("%%"); 825 917 break; 826 918 default: 827 919 /* Invalid specifier, print verbatim. */ 828 while (*format != '%') {920 while (*format != '%') 829 921 format--; 830 }831 append("%%");922 923 APPEND("%%"); 832 924 break; 833 925 } 926 834 927 format++; 835 928 } 836 929 837 #undef append838 #undef recurse839 840 930 return maxsize - remaining; 841 931 } 842 932 843 844 /** Converts a time value to a broken-down UTC time 845 * 846 * @param time Time to convert847 * @param result Structure to store the result to848 * 849 * @return EOK or a negative error code933 /** Convert a time value to a broken-down UTC time/ 934 * 935 * @param time Time to convert 936 * @param result Structure to store the result to 937 * 938 * @return EOK or a negative error code 939 * 850 940 */ 851 941 int time_utc2tm(const time_t time, struct tm *restrict result) 852 942 { 853 943 assert(result != NULL); 854 944 855 945 /* Set result to epoch. */ 856 946 result->tm_sec = 0; … … 860 950 result->tm_mon = 0; 861 951 result->tm_year = 70; /* 1970 */ 862 863 if ( _normalize_time(result, time) == -1)952 953 if (normalize_time(result, time) == -1) 864 954 return EOVERFLOW; 865 955 866 956 return EOK; 867 957 } 868 958 869 /** Converts a time value to a null terminated string of the form 870 * "Wed Jun 30 21:49:08 1993\n" expressed in UTC. 871 * 872 * @param time Time to convert. 873 * @param buf Buffer to store the string to, must be at least 874 * ASCTIME_BUF_LEN bytes long. 875 * 876 * @return EOK or a negative error code. 959 /** Convert a time value to a NULL-terminated string. 960 * 961 * The format is "Wed Jun 30 21:49:08 1993\n" expressed in UTC. 962 * 963 * @param time Time to convert. 964 * @param buf Buffer to store the string to, must be at least 965 * ASCTIME_BUF_LEN bytes long. 966 * 967 * @return EOK or a negative error code. 968 * 877 969 */ 878 970 int time_utc2str(const time_t time, char *restrict buf) 879 971 { 880 struct tm t; 881 int r; 882 883 if ((r = time_utc2tm(time, &t)) != EOK) 884 return r; 885 886 time_tm2str(&t, buf); 972 struct tm tm; 973 int ret = time_utc2tm(time, &tm); 974 if (ret != EOK) 975 return ret; 976 977 time_tm2str(&tm, buf); 887 978 return EOK; 888 979 } 889 980 890 891 /** 892 * Converts broken-down time to a string in format 893 * "Sun Jan 1 00:00:00 1970\n". (Obsolete) 981 /** Convert broken-down time to a NULL-terminated string. 982 * 983 * The format is "Sun Jan 1 00:00:00 1970\n". (Obsolete) 894 984 * 895 985 * @param timeptr Broken-down time structure. 896 * @param buf Buffer to store string to, must be at least ASCTIME_BUF_LEN 897 * bytes long. 986 * @param buf Buffer to store string to, must be at least 987 * ASCTIME_BUF_LEN bytes long. 988 * 898 989 */ 899 990 void time_tm2str(const struct tm *restrict timeptr, char *restrict buf) … … 901 992 assert(timeptr != NULL); 902 993 assert(buf != NULL); 903 994 904 995 static const char *wday[] = { 905 996 "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" 906 997 }; 998 907 999 static const char *mon[] = { 908 1000 "Jan", "Feb", "Mar", "Apr", "May", "Jun", 909 1001 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" 910 1002 }; 911 1003 912 1004 snprintf(buf, ASCTIME_BUF_LEN, "%s %s %2d %02d:%02d:%02d %d\n", 913 1005 wday[timeptr->tm_wday], … … 918 1010 } 919 1011 920 /** 921 * Converts a time value to a broken-down local time, expressed relative 922 * to the user's specified timezone. 923 * 924 * @param timer Time to convert. 925 * @param result Structure to store the result to. 926 * 927 * @return EOK on success or a negative error code. 1012 /** Converts a time value to a broken-down local time. 1013 * 1014 * Time is expressed relative to the user's specified timezone. 1015 * 1016 * @param timer Time to convert. 1017 * @param result Structure to store the result to. 1018 * 1019 * @return EOK on success or a negative error code. 1020 * 928 1021 */ 929 1022 int time_local2tm(const time_t time, struct tm *restrict result) 930 1023 { 931 // TODO: deal with timezone932 // currently assumes system and all times are in GMT933 1024 // TODO: Deal with timezones. 1025 // Currently assumes system and all times are in UTC 1026 934 1027 /* Set result to epoch. */ 935 1028 result->tm_sec = 0; … … 939 1032 result->tm_mon = 0; 940 1033 result->tm_year = 70; /* 1970 */ 941 942 if ( _normalize_time(result, time) == -1)1034 1035 if (normalize_time(result, time) == -1) 943 1036 return EOVERFLOW; 944 1037 945 1038 return EOK; 946 1039 } 947 1040 948 /** 949 * Converts the calendar time to a null terminated string950 * of the form"Wed Jun 30 21:49:08 1993\n" expressed relative to the1041 /** Convert the calendar time to a NULL-terminated string. 1042 * 1043 * The format is "Wed Jun 30 21:49:08 1993\n" expressed relative to the 951 1044 * user's specified timezone. 952 * 953 * @param timer Time to convert. 954 * @param buf Buffer to store the string to. Must be at least 955 * ASCTIME_BUF_LEN bytes long. 956 * 957 * @return EOK on success or a negative error code. 1045 * 1046 * @param timer Time to convert. 1047 * @param buf Buffer to store the string to. Must be at least 1048 * ASCTIME_BUF_LEN bytes long. 1049 * 1050 * @return EOK on success or a negative error code. 1051 * 958 1052 */ 959 1053 int time_local2str(const time_t time, char *buf) 960 1054 { 961 1055 struct tm loctime; 962 int r; 963 964 if ((r = time_local2tm(time, &loctime)) != EOK) 965 return r; 966 1056 int ret = time_local2tm(time, &loctime); 1057 if (ret != EOK) 1058 return ret; 1059 967 1060 time_tm2str(&loctime, buf); 968 969 1061 return EOK; 970 1062 } 971 1063 972 /** 973 * Calculate the difference between two times, in seconds. 974 * 1064 /** Calculate the difference between two times, in seconds. 1065 * 975 1066 * @param time1 First time. 976 1067 * @param time0 Second time. 977 * @return Time in seconds. 1068 * 1069 * @return Time difference in seconds. 1070 * 978 1071 */ 979 1072 double difftime(time_t time1, time_t time0) -
uspace/lib/c/include/stats.h
r9696b01 r1ab8539 48 48 extern stats_physmem_t *stats_get_physmem(void); 49 49 extern load_t *stats_get_load(size_t *); 50 extern sysarg_t stats_get_uptime(void);51 50 52 51 extern stats_task_t *stats_get_tasks(size_t *); -
uspace/lib/c/include/sys/time.h
r9696b01 r1ab8539 40 40 #include <sys/types.h> 41 41 42 #define DST_NONE 043 #define ASCTIME_BUF_LEN 2642 #define DST_NONE 0 43 #define ASCTIME_BUF_LEN 26 44 44 45 45 typedef long time_t; … … 50 50 51 51 struct tm { 52 int tm_sec; 53 int tm_min; 54 int tm_hour; 55 int tm_mday; 56 int tm_mon; 57 int tm_year; 58 int tm_wday; 59 int tm_yday; 60 int tm_isdst; 52 int tm_sec; /* Seconds [0,60]. */ 53 int tm_min; /* Minutes [0,59]. */ 54 int tm_hour; /* Hour [0,23]. */ 55 int tm_mday; /* Day of month [1,31]. */ 56 int tm_mon; /* Month of year [0,11]. */ 57 int tm_year; /* Years since 1900. */ 58 int tm_wday; /* Day of week [0,6] (Sunday = 0). */ 59 int tm_yday; /* Day of year [0,365]. */ 60 int tm_isdst; /* Daylight Savings flag. */ 61 61 }; 62 62 … … 71 71 }; 72 72 73 extern void tv_add(struct timeval * tv, suseconds_t usecs);74 extern suseconds_t tv_sub(struct timeval * tv1, struct timeval *tv2);75 extern int tv_gt(struct timeval * tv1, struct timeval *tv2);76 extern int tv_gteq(struct timeval * tv1, struct timeval *tv2);77 extern int gettimeofday(struct timeval *tv, struct timezone *tz);78 extern int getuptime(struct timeval *tv);73 extern void tv_add(struct timeval *, suseconds_t); 74 extern suseconds_t tv_sub(struct timeval *, struct timeval *); 75 extern int tv_gt(struct timeval *, struct timeval *); 76 extern int tv_gteq(struct timeval *, struct timeval *); 77 extern void gettimeofday(struct timeval *, struct timezone *); 78 extern void getuptime(struct timeval *); 79 79 80 80 extern void udelay(useconds_t); 81 81 82 extern time_t mktime(struct tm * tm);83 extern int time_utc2tm(const time_t time, struct tm *result);84 extern int time_utc2str(const time_t time, char *buf);85 extern void time_tm2str(const struct tm * timeptr, char *buf);86 extern int time_local2tm(const time_t time, struct tm *result);87 extern int time_local2str(const time_t time, char *buf);88 extern double difftime(time_t time1, time_t time0);89 extern size_t strftime(char *restrict s, size_t maxsize,90 const char *restrict format, const struct tm *restrict tm);82 extern time_t mktime(struct tm *); 83 extern int time_utc2tm(const time_t, struct tm *); 84 extern int time_utc2str(const time_t, char *); 85 extern void time_tm2str(const struct tm *, char *); 86 extern int time_local2tm(const time_t, struct tm *); 87 extern int time_local2str(const time_t, char *); 88 extern double difftime(time_t, time_t); 89 extern size_t strftime(char *restrict, size_t, const char *restrict, 90 const struct tm *restrict); 91 91 92 92 #endif -
uspace/lib/usbdev/src/hub.c
r9696b01 r1ab8539 162 162 if (hc_conn == NULL) 163 163 return EINVAL; 164 165 int rc; 164 166 165 struct timeval start_time; 167 168 rc = gettimeofday(&start_time, NULL); 169 if (rc != EOK) { 166 gettimeofday(&start_time, NULL); 167 168 /* We are gona do a lot of communication better open it in advance. */ 169 int rc = usb_hc_connection_open(hc_conn); 170 if (rc != EOK) 170 171 return rc; 171 } 172 173 /* We are gona do a lot of communication better open it in advance. */ 174 rc = usb_hc_connection_open(hc_conn); 175 if (rc != EOK) { 176 return rc; 177 } 178 172 179 173 /* Request a new address. */ 180 174 usb_address_t dev_addr = … … 226 220 goto leave_release_default_address; 227 221 } 228 222 229 223 struct timeval end_time; 230 rc = gettimeofday(&end_time, NULL); 231 if (rc != EOK) { 232 goto leave_release_default_address; 233 } 234 224 gettimeofday(&end_time, NULL); 225 235 226 /* According to the USB spec part 9.1.2 host allows 100ms time for 236 227 * the insertion process to complete. According to 7.1.7.1 this is the
Note:
See TracChangeset
for help on using the changeset viewer.