Nilorea Library
C utilities for networking, threading, graphics
Loading...
Searching...
No Matches
n_time.c
Go to the documentation of this file.
1/*
2 * Nilorea Library
3 * Copyright (C) 2005-2026 Castagnier Mickael
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
14 * implied. See the License for the specific language governing
15 * permissions and limitations under the License.
16 *
17 * SPDX-License-Identifier: Apache-2.0
18 */
19
27#include "nilorea/n_time.h"
28
29#include <stdio.h>
30#include <stdlib.h>
31#include <unistd.h>
32
33#if defined(__windows__)
38void u_sleep(__int64 usec) {
39 HANDLE timer;
40 LARGE_INTEGER ft;
41
42 ft.QuadPart = -(10 * usec); // Convert to 100 nanosecond interval, negative value indicates relative time
43
44 timer = CreateWaitableTimer(NULL, TRUE, NULL);
45 SetWaitableTimer(timer, &ft, 0, NULL, NULL, 0);
46 WaitForSingleObject(timer, INFINITE);
47 CloseHandle(timer);
48}
49#else
54void u_sleep(unsigned int usec) {
55 usleep(usec);
56}
57#endif
58
62void PAUSE(void) {
63 char k[2] = "";
64
65 printf("Press enter to continue...");
66
67 int n = scanf("%c", k);
68 int error = errno;
69 if (n == EOF) {
70 n_log(LOG_DEBUG, "Enter key was pressed !");
71 } else if (error != 0) {
72 n_log(LOG_ERR, "error %s when waiting for a key !", strerror(error));
73 } else {
74 n_log(LOG_DEBUG, "No matching characters");
75 }
76
77 printf("\n");
78} /* PAUSE(...) */
79
85int start_HiTimer(N_TIME* timer) {
86 __n_assert(timer, return FALSE);
87 timer->delta = 0;
88
89#if defined(__windows__)
90 if (QueryPerformanceFrequency((LARGE_INTEGER*)&timer->freq) == 0)
91 return FALSE;
92 if (QueryPerformanceCounter(&timer->startTime) == 0)
93 return FALSE;
94#else
95 if (gettimeofday(&timer->startTime, 0) != 0)
96 return FALSE;
97#endif
98
99 return TRUE;
100} /* init_HiTimer(...) */
101
107time_t get_usec(N_TIME* timer) {
108 __n_assert(timer, return 0);
109#ifdef __windows__
110 QueryPerformanceCounter((LARGE_INTEGER*)&timer->currentTime);
111 timer->delta = 1000000 * (timer->currentTime.QuadPart - timer->startTime.QuadPart) / timer->freq.QuadPart;
112 timer->startTime = timer->currentTime;
113#else
114 gettimeofday(&timer->currentTime, 0);
115 timer->delta = (timer->currentTime.tv_sec - timer->startTime.tv_sec) * 1000000 + (timer->currentTime.tv_usec - timer->startTime.tv_usec);
116 timer->startTime.tv_sec = timer->currentTime.tv_sec;
117 timer->startTime.tv_usec = timer->currentTime.tv_usec;
118#endif
119
120 return timer->delta;
121} /* get_usec( ... ) */
122
128time_t get_msec(N_TIME* timer) {
129 __n_assert(timer, return 0);
130#ifdef __windows__
131 QueryPerformanceCounter((LARGE_INTEGER*)&timer->currentTime);
132 timer->delta = 1000 * (timer->currentTime.QuadPart - timer->startTime.QuadPart) / timer->freq.QuadPart;
133 timer->startTime = timer->currentTime;
134#else
135 gettimeofday(&timer->currentTime, 0);
136 timer->delta = (timer->currentTime.tv_sec - timer->startTime.tv_sec) * 1000 + (timer->currentTime.tv_usec - timer->startTime.tv_usec) / 1000;
137 timer->startTime.tv_sec = timer->currentTime.tv_sec;
138 timer->startTime.tv_usec = timer->currentTime.tv_usec;
139#endif
140
141 return timer->delta;
142} /* get_msec(...) */
143
149time_t get_sec(N_TIME* timer) {
150 __n_assert(timer, return 0);
151#ifdef __windows__
152 QueryPerformanceCounter((LARGE_INTEGER*)&timer->currentTime);
153 timer->delta = (timer->currentTime.QuadPart - timer->startTime.QuadPart) / timer->freq.QuadPart;
154 timer->startTime = timer->currentTime;
155#else
156 gettimeofday(&timer->currentTime, 0);
157 timer->delta = (timer->currentTime.tv_sec - timer->startTime.tv_sec) + (timer->currentTime.tv_usec - timer->startTime.tv_usec) / 1000000;
158 timer->startTime.tv_sec = timer->currentTime.tv_sec;
159 timer->startTime.tv_usec = timer->currentTime.tv_usec;
160#endif
161 return timer->delta;
162} /* get_sec(...) */
#define __n_assert(__ptr, __ret)
macro to assert things
Definition n_common.h:279
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
Definition n_log.h:89
#define LOG_DEBUG
debug-level messages
Definition n_log.h:84
#define LOG_ERR
error conditions
Definition n_log.h:76
struct timeval startTime
start time
Definition n_time.h:61
time_t delta
time since last poll
Definition n_time.h:51
struct timeval currentTime
current time
Definition n_time.h:63
void u_sleep(unsigned int usec)
wrapper around usleep for API consistency
Definition n_time.c:54
int start_HiTimer(N_TIME *timer)
Initialize or restart from zero any N_TIME HiTimer.
Definition n_time.c:85
time_t get_usec(N_TIME *timer)
Poll any N_TIME HiTimer, returning usec, and moving currentTime to startTime.
Definition n_time.c:107
time_t get_msec(N_TIME *timer)
Poll any N_TIME HiTimer, returning msec, and moving currentTime to startTime.
Definition n_time.c:128
time_t get_sec(N_TIME *timer)
Poll any N_TIME HiTimer, returning sec, and moving currentTime to startTime.
Definition n_time.c:149
void PAUSE(void)
make a pause in a terminal
Definition n_time.c:62
Timing Structure.
Definition n_time.h:49
Timing utilities.