misc: add timer infrastructure

Timers can be used to measure time-delays with microsecond resolution.
This is heavily used for performance-tests and to improve rendering
performance.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
David Herrmann 2012-08-29 17:54:16 +02:00
parent 1637e7fd30
commit c0047d701a
2 changed files with 107 additions and 1 deletions

View File

@ -32,8 +32,10 @@
#include <errno.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "htable.h"
#include "static_misc.h"
@ -517,3 +519,94 @@ size_t kmscon_array_get_element_size(struct kmscon_array *arr)
return arr->element_size;
}
struct kmscon_timer {
struct timespec start;
uint64_t elapsed;
};
int kmscon_timer_new(struct kmscon_timer **out)
{
struct kmscon_timer *timer;
if (!out)
return -EINVAL;
timer = malloc(sizeof(*timer));
if (!timer)
return -ENOMEM;
memset(timer, 0, sizeof(*timer));
kmscon_timer_reset(timer);
*out = timer;
return 0;
}
void kmscon_timer_free(struct kmscon_timer *timer)
{
if (!timer)
return;
free(timer);
}
void kmscon_timer_reset(struct kmscon_timer *timer)
{
if (!timer)
return;
clock_gettime(CLOCK_MONOTONIC, &timer->start);
timer->elapsed = 0;
}
void kmscon_timer_start(struct kmscon_timer *timer)
{
if (!timer)
return;
clock_gettime(CLOCK_MONOTONIC, &timer->start);
}
uint64_t kmscon_timer_stop(struct kmscon_timer *timer)
{
struct timespec spec;
int64_t off, nsec;
if (!timer)
return 0;
clock_gettime(CLOCK_MONOTONIC, &spec);
off = spec.tv_sec - timer->start.tv_sec;
nsec = spec.tv_nsec - timer->start.tv_nsec;
if (nsec < 0) {
--off;
nsec += 1000000000ULL;
}
off *= 1000000;
off += nsec / 1000;
memcpy(&timer->start, &spec, sizeof(spec));
timer->elapsed += off;
return timer->elapsed;
}
uint64_t kmscon_timer_elapsed(struct kmscon_timer *timer)
{
struct timespec spec;
int64_t off, nsec;
if (!timer)
return 0;
clock_gettime(CLOCK_MONOTONIC, &spec);
off = spec.tv_sec - timer->start.tv_sec;
nsec = spec.tv_nsec - timer->start.tv_nsec;
if (nsec < 0) {
--off;
nsec += 1000000000ULL;
}
off *= 1000000;
off += nsec / 1000;
return timer->elapsed + off;
}

View File

@ -33,8 +33,9 @@
#define KMSCON_MISC_H
#include <stdbool.h>
#include <stdlib.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
/* miscellaneous */
@ -110,6 +111,18 @@ size_t kmscon_array_get_element_size(struct kmscon_array *arr);
#define KMSCON_ARRAY_AT(_arr, _type, _pos) \
(&((_type*)kmscon_array_get_array(_arr))[(_pos)])
/* time measurement */
struct kmscon_timer;
int kmscon_timer_new(struct kmscon_timer **out);
void kmscon_timer_free(struct kmscon_timer *timer);
void kmscon_timer_reset(struct kmscon_timer *timer);
void kmscon_timer_start(struct kmscon_timer *timer);
uint64_t kmscon_timer_stop(struct kmscon_timer *timer);
uint64_t kmscon_timer_elapsed(struct kmscon_timer *timer);
/* double linked list */
struct kmscon_dlist {