Fix Windows timestamp
This commit is contained in:
parent
283f06f265
commit
2212ec3844
@ -384,6 +384,8 @@ fn void run_tests(Arena* arena, TestOptions const * const test_options, char** e
|
|||||||
|
|
||||||
fn void entry_point(int argc, char* argv[], char* envp[])
|
fn void entry_point(int argc, char* argv[], char* envp[])
|
||||||
{
|
{
|
||||||
|
calibrate_cpu_timer();
|
||||||
|
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
{
|
{
|
||||||
print("Expected some arguments\n");
|
print("Expected some arguments\n");
|
||||||
|
@ -140,11 +140,15 @@ timestamp()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if _WIN32
|
||||||
|
global u64 cpu_frequency;
|
||||||
|
#else
|
||||||
#if LINK_LIBC
|
#if LINK_LIBC
|
||||||
global struct timespec cpu_resolution;
|
global struct timespec cpu_resolution;
|
||||||
#else
|
#else
|
||||||
global u64 cpu_frequency;
|
global u64 cpu_frequency;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
may_be_unused fn void print(const char* format, ...);
|
may_be_unused fn void print(const char* format, ...);
|
||||||
@ -526,10 +530,18 @@ may_be_unused fn f64 resolve_timestamp(
|
|||||||
TimeUnit time_unit)
|
TimeUnit time_unit)
|
||||||
{
|
{
|
||||||
#if _WIN32
|
#if _WIN32
|
||||||
unused(start);
|
auto s = (f64)(end - start) / (f64)cpu_frequency;
|
||||||
unused(end);
|
switch (time_unit)
|
||||||
unused(time_unit);
|
{
|
||||||
todo();
|
case TIME_UNIT_NANOSECONDS:
|
||||||
|
return s * 1000000000.0;
|
||||||
|
case TIME_UNIT_MICROSECONDS:
|
||||||
|
return s * 1000000.0;
|
||||||
|
case TIME_UNIT_MILLISECONDS:
|
||||||
|
return s * 1000.0;
|
||||||
|
case TIME_UNIT_SECONDS:
|
||||||
|
return s;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
#if LINK_LIBC
|
#if LINK_LIBC
|
||||||
assert(end.tv_sec >= start.tv_sec);
|
assert(end.tv_sec >= start.tv_sec);
|
||||||
@ -568,11 +580,11 @@ may_be_unused fn f64 resolve_timestamp(
|
|||||||
switch (time_unit)
|
switch (time_unit)
|
||||||
{
|
{
|
||||||
case TIME_UNIT_NANOSECONDS:
|
case TIME_UNIT_NANOSECONDS:
|
||||||
return s / 1000000000.0;
|
return s * 1000000000.0;
|
||||||
case TIME_UNIT_MICROSECONDS:
|
case TIME_UNIT_MICROSECONDS:
|
||||||
return s / 1000000.0;
|
return s * 1000000.0;
|
||||||
case TIME_UNIT_MILLISECONDS:
|
case TIME_UNIT_MILLISECONDS:
|
||||||
return s / 1000.0;
|
return s * 1000.0;
|
||||||
case TIME_UNIT_SECONDS:
|
case TIME_UNIT_SECONDS:
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
@ -1687,8 +1699,13 @@ may_be_unused fn void os_file_close(FileDescriptor fd)
|
|||||||
may_be_unused fn void calibrate_cpu_timer()
|
may_be_unused fn void calibrate_cpu_timer()
|
||||||
{
|
{
|
||||||
#ifndef SILENT
|
#ifndef SILENT
|
||||||
|
#if _WIN32
|
||||||
|
LARGE_INTEGER li;
|
||||||
|
QueryPerformanceFrequency(&li);
|
||||||
|
cpu_frequency = (u64)li.QuadPart;
|
||||||
|
#else
|
||||||
#if LINK_LIBC
|
#if LINK_LIBC
|
||||||
// clock_getres(CLOCK_MONOTONIC, &cpu_resolution);
|
clock_getres(CLOCK_MONOTONIC, &cpu_resolution);
|
||||||
#else
|
#else
|
||||||
u64 miliseconds_to_wait = 100;
|
u64 miliseconds_to_wait = 100;
|
||||||
u64 cpu_start = timestamp();
|
u64 cpu_start = timestamp();
|
||||||
@ -1708,6 +1725,7 @@ may_be_unused fn void calibrate_cpu_timer()
|
|||||||
cpu_frequency = os_frequency * cpu_elapsed / os_elapsed;
|
cpu_frequency = os_frequency * cpu_elapsed / os_elapsed;
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
STRUCT(OSReserveProtectionFlags)
|
STRUCT(OSReserveProtectionFlags)
|
||||||
@ -3229,9 +3247,14 @@ may_be_unused fn void run_command(Arena* arena, CStringSlice arguments, char* en
|
|||||||
startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE);
|
startup_info.hStdError = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
|
|
||||||
auto handle_inheritance = 1;
|
auto handle_inheritance = 1;
|
||||||
|
auto start = timestamp();
|
||||||
if (CreateProcessA(0, bytes, 0, 0, handle_inheritance, 0, 0, 0, &startup_info, &process_information))
|
if (CreateProcessA(0, bytes, 0, 0, handle_inheritance, 0, 0, 0, &startup_info, &process_information))
|
||||||
{
|
{
|
||||||
WaitForSingleObject(process_information.hProcess, INFINITE);
|
WaitForSingleObject(process_information.hProcess, INFINITE);
|
||||||
|
auto end = timestamp();
|
||||||
|
auto ms = resolve_timestamp(start, end, TIME_UNIT_MILLISECONDS);
|
||||||
|
|
||||||
|
print("Process ran in {f64} ms\n", ms);
|
||||||
DWORD exit_code;
|
DWORD exit_code;
|
||||||
if (GetExitCodeProcess(process_information.hProcess, &exit_code))
|
if (GetExitCodeProcess(process_information.hProcess, &exit_code))
|
||||||
{
|
{
|
||||||
@ -3801,13 +3824,7 @@ may_be_unused fn MD5Result md5_end(MD5Context* context)
|
|||||||
|
|
||||||
fn void entry_point(int argc, char* argv[], char* envp[]);
|
fn void entry_point(int argc, char* argv[], char* envp[]);
|
||||||
|
|
||||||
#if LINK_LIBC
|
#if LINK_LIBC == 0
|
||||||
int main(int argc, char* argv[], char* envp[])
|
|
||||||
{
|
|
||||||
entry_point(argc, argv, envp);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
[[gnu::naked]] [[noreturn]] void _start()
|
[[gnu::naked]] [[noreturn]] void _start()
|
||||||
{
|
{
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
@ -3825,9 +3842,15 @@ int main(int argc, char* argv[], char* envp[])
|
|||||||
void static_entry_point(int argc, char* argv[])
|
void static_entry_point(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
char** envp = (char**)&argv[argc + 1];
|
char** envp = (char**)&argv[argc + 1];
|
||||||
|
#else
|
||||||
|
int main(int argc, char* argv[], char* envp[])
|
||||||
|
{
|
||||||
|
#endif
|
||||||
calibrate_cpu_timer();
|
calibrate_cpu_timer();
|
||||||
entry_point(argc, argv, envp);
|
entry_point(argc, argv, envp);
|
||||||
|
#if LINK_LIBC
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
syscall_exit(0);
|
syscall_exit(0);
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user