summaryrefslogtreecommitdiff
path: root/src/main/main.c
diff options
context:
space:
mode:
authorAlbert Cervin <albert@acervin.com>2024-03-07 20:19:26 +0100
committerAlbert Cervin <albert@acervin.com>2024-03-07 20:19:26 +0100
commita13750209b3836a4a6a16a7ba881625f397f160f (patch)
tree86c6ee6af1b44b613c6abc913957dda000c069a7 /src/main/main.c
parentf266c624ad197ea6add738df70702dcbf93cb198 (diff)
downloaddged-a13750209b3836a4a6a16a7ba881625f397f160f.tar.gz
dged-a13750209b3836a4a6a16a7ba881625f397f160f.tar.xz
dged-a13750209b3836a4a6a16a7ba881625f397f160f.zip
Implement timers properly
The timers shown with `M-x timers` are now actual timings.
Diffstat (limited to 'src/main/main.c')
-rw-r--r--src/main/main.c46
1 files changed, 14 insertions, 32 deletions
diff --git a/src/main/main.c b/src/main/main.c
index e722ed2..d0d118b 100644
--- a/src/main/main.c
+++ b/src/main/main.c
@@ -19,6 +19,7 @@
#include "dged/path.h"
#include "dged/reactor.h"
#include "dged/settings.h"
+#include "dged/timers.h"
#ifdef SYNTAX_ENABLE
#include "dged/syntax.h"
@@ -52,24 +53,6 @@ void resized() {
signal(SIGWINCH, resized);
}
-uint64_t calc_frame_time_ns(struct timespec *timers, uint32_t num_timer_pairs) {
- uint64_t total = 0;
- for (uint32_t ti = 0; ti < num_timer_pairs * 2; ti += 2) {
- struct timespec *start_timer = &timers[ti];
- struct timespec *end_timer = &timers[ti + 1];
-
- total +=
- ((uint64_t)end_timer->tv_sec * 1e9 + (uint64_t)end_timer->tv_nsec) -
- ((uint64_t)start_timer->tv_sec * 1e9 + (uint64_t)start_timer->tv_nsec);
- }
-
- return total;
-}
-
-#define DECLARE_TIMER(timer) struct timespec timer##_begin, timer##_end
-#define TIMED_SCOPE_BEGIN(timer) clock_gettime(CLOCK_MONOTONIC, &timer##_begin)
-#define TIMED_SCOPE_END(timer) clock_gettime(CLOCK_MONOTONIC, &timer##_end)
-
#define INVALID_WATCH -1
struct watched_file {
uint32_t watch_id;
@@ -297,32 +280,30 @@ int main(int argc, char *argv[]) {
init_bindings();
init_completion(&buflist);
+ timers_init();
- DECLARE_TIMER(buffer);
- DECLARE_TIMER(display);
- DECLARE_TIMER(keyboard);
-
- uint64_t frame_time = 0;
+ float frame_time = 0.f;
static char keyname[64] = {0};
static uint32_t nkeychars = 0;
while (running) {
+ timers_start_frame();
if (display_resized) {
windows_resize(display_height(display), display_width(display));
display_resized = false;
}
/* Update all windows together with the buffers in them. */
- TIMED_SCOPE_BEGIN(buffer);
+ struct timer *update_windows = timer_start("update-windows");
windows_update(frame_alloc, frame_time);
- TIMED_SCOPE_END(buffer);
+ timer_stop(update_windows);
struct window *active_window = windows_get_active();
/* Update the screen by flushing command lists collected
* from updating the buffers.
*/
- TIMED_SCOPE_BEGIN(display);
+ struct timer *update_display = timer_start("display");
display_begin_render(display);
windows_render(display);
struct buffer_view *view = window_buffer_view(active_window);
@@ -330,7 +311,7 @@ int main(int argc, char *argv[]) {
struct window_position winpos = window_position(active_window);
display_move_cursor(display, winpos.y + cursor.line, winpos.x + cursor.col);
display_end_render(display);
- TIMED_SCOPE_END(display);
+ timer_stop(update_display);
/* This blocks for events, so if nothing has happened we block here and let
* the CPU do something more useful than updating this editor for no reason.
@@ -339,7 +320,7 @@ int main(int argc, char *argv[]) {
*/
reactor_update(reactor);
- TIMED_SCOPE_BEGIN(keyboard);
+ struct timer *update_keyboard = timer_start("update-keyboard");
struct keyboard_update kbd_upd =
keyboard_update(&kbd, reactor, frame_alloc);
@@ -413,17 +394,18 @@ int main(int argc, char *argv[]) {
keyname[0] = '\0';
}
}
- TIMED_SCOPE_END(keyboard);
+ timer_stop(update_keyboard);
update_file_watches(reactor);
// calculate frame time
- struct timespec timers[] = {buffer_begin, buffer_end, display_begin,
- display_end, keyboard_begin, keyboard_end};
- frame_time = calc_frame_time_ns(timers, 3);
+ frame_time = timer_average(update_windows) +
+ timer_average(update_keyboard) + timer_average(update_display);
+
frame_allocator_clear(&frame_allocator);
}
+ timers_destroy();
destroy_completion();
windows_destroy();
minibuffer_destroy();