mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 14:47:44 +00:00

This implements a number of changes related to time: * If a HPET is present, it is now used only as a system timer, unless the Local APIC timer is used (in which case the HPET timer will not trigger any interrupts at all). * If a HPET is present, the current time can now be as accurate as the chip can be, independently from the system timer. We now query the HPET main counter for the current time in CPU #0's system timer interrupt, and use that as a base line. If a high precision time is queried, that base line is used in combination with quering the HPET timer directly, which should give a much more accurate time stamp at the expense of more overhead. For faster time stamps, the more coarse value based on the last interrupt will be returned. This also means that any missed interrupts should not cause the time to drift. * The default system interrupt rate is reduced to about 250 per second. * Fix calculation of Thread CPU usage by using the amount of ticks they used rather than the number of times a context switch happened. * Implement CLOCK_REALTIME_COARSE and CLOCK_MONOTONIC_COARSE and use it for most cases where precise timestamps are not needed.
91 lines
3.1 KiB
C
91 lines
3.1 KiB
C
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
*
|
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
|
* list of conditions and the following disclaimer.
|
|
*
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
* and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <sys/cdefs.h>
|
|
#include <sys/types.h>
|
|
|
|
__BEGIN_DECLS
|
|
|
|
struct tm {
|
|
int tm_sec; /* Seconds (0-60) */
|
|
int tm_min; /* Minutes (0-59) */
|
|
int tm_hour; /* Hours (0-23) */
|
|
int tm_mday; /* Day of the month (1-31) */
|
|
int tm_mon; /* Month (0-11) */
|
|
int tm_year; /* Year - 1900 */
|
|
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
|
|
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
|
|
int tm_isdst; /* Daylight saving time */
|
|
};
|
|
|
|
extern long timezone; /* The difference in seconds between UTC and local time */
|
|
extern long altzone;
|
|
extern char* tzname[2];
|
|
extern int daylight;
|
|
|
|
typedef uint32_t clock_t;
|
|
typedef int64_t time_t;
|
|
|
|
struct tm* localtime(const time_t*);
|
|
struct tm* gmtime(const time_t*);
|
|
time_t mktime(struct tm*);
|
|
time_t timegm(struct tm*);
|
|
time_t time(time_t*);
|
|
char* ctime(const time_t*);
|
|
void tzset();
|
|
char* asctime(const struct tm*);
|
|
|
|
#define CLOCKS_PER_SEC 1000
|
|
clock_t clock();
|
|
|
|
struct timespec {
|
|
time_t tv_sec;
|
|
long tv_nsec;
|
|
};
|
|
|
|
typedef int clockid_t;
|
|
|
|
#define CLOCK_REALTIME 0
|
|
#define CLOCK_MONOTONIC 1
|
|
#define CLOCK_MONOTONIC_RAW 4
|
|
#define CLOCK_REALTIME_COARSE 5
|
|
#define CLOCK_MONOTONIC_COARSE 6
|
|
#define TIMER_ABSTIME 99
|
|
|
|
int clock_gettime(clockid_t, struct timespec*);
|
|
int clock_settime(clockid_t, struct timespec*);
|
|
int clock_nanosleep(clockid_t, int flags, const struct timespec* requested_sleep, struct timespec* remaining_sleep);
|
|
int clock_getres(clockid_t, struct timespec* result);
|
|
int nanosleep(const struct timespec* requested_sleep, struct timespec* remaining_sleep);
|
|
struct tm* gmtime_r(const time_t* timep, struct tm* result);
|
|
struct tm* localtime_r(const time_t* timep, struct tm* result);
|
|
|
|
double difftime(time_t, time_t);
|
|
size_t strftime(char* s, size_t max, const char* format, const struct tm*);
|
|
|
|
__END_DECLS
|