Add more error handling

This commit is contained in:
cldemote 2025-08-28 08:52:06 +10:00
parent d3ad58b8f1
commit 557bd26913
7 changed files with 55 additions and 16 deletions

View File

@ -18,3 +18,6 @@ clean:
run: all run: all
cd build; ./twm drm fb uevent ; cd - cd build; ./twm drm fb uevent ; cd -
run_fb: all
cd build; ./twm fb drm uevent ; cd -

17
src/core/abort.c Normal file
View File

@ -0,0 +1,17 @@
#include "../twm.h"
#include <signal.h>
void signal_handler(int signum) {
LOG_ERROR("Recieved signal %d", signum);
twm_abort();
}
void setup_signals() {
signal(SIGINT, signal_handler);
signal(SIGSEGV, signal_handler);
}
void twm_abort() {
unload_modules(loaded_modules);
abort();
}

View File

@ -1,14 +1,19 @@
#include "../twm.h" #include "../twm.h"
#include <stdio.h> #include <stdio.h>
int main(int argc, char* argv[]) { Modules loaded_modules;
uint64_t modules_mask = 0;
Modules modules = load_modules("modules", argv + 1, argc - 1, &modules_mask);
Vec2 (*get_size)() = module_find_func(modules, DISPLAY_GET_SIZE_V1); int main(int argc, char* argv[]) {
void (*flip)() = module_find_func(modules, DISPLAY_FLIP_V1);
void (*put_pixel)(Vec2, Color) = module_find_func(modules, DISPLAY_PUT_PIXEL_V1); setup_signals();
InputEvent (*poll_event)() = module_find_func(modules, INPUT_POLL_V1);
uint64_t modules_mask = 0;
loaded_modules = load_modules("modules", argv + 1, argc - 1, &modules_mask);
Vec2 (*get_size)() = module_find_func(loaded_modules, DISPLAY_GET_SIZE_V1);
void (*flip)() = module_find_func(loaded_modules, DISPLAY_FLIP_V1);
void (*put_pixel)(Vec2, Color) = module_find_func(loaded_modules, DISPLAY_PUT_PIXEL_V1);
InputEvent (*poll_event)() = module_find_func(loaded_modules, INPUT_POLL_V1);
Vec2 display_size = get_size(); Vec2 display_size = get_size();
for (int x = 0; x < display_size.x; x++) { for (int x = 0; x < display_size.x; x++) {
@ -38,6 +43,6 @@ int main(int argc, char* argv[]) {
flip(); flip();
} }
unload_modules(modules); unload_modules(loaded_modules);
return 0; return 0;
} }

View File

@ -14,6 +14,7 @@ int bitcount(uint64_t v) {
} }
void unload_modules(Modules ms) { void unload_modules(Modules ms) {
LOG_INFO("Unloading %d modules", ms.count);
for (size_t i = 0; i < ms.count; i++) { for (size_t i = 0; i < ms.count; i++) {
ms.modules[i].close(); ms.modules[i].close();
dlclose(ms.modules[i].dll); dlclose(ms.modules[i].dll);
@ -21,6 +22,7 @@ void unload_modules(Modules ms) {
} }
Modules load_modules(char* module_dir, char* modules[], size_t num_modules, uint64_t* features) { Modules load_modules(char* module_dir, char* modules[], size_t num_modules, uint64_t* features) {
LOG_INFO("Loading modules from %s", module_dir);
Modules ms = { 0 }; Modules ms = { 0 };
uint64_t needed = BIT(FEATURE_MAX) - 1; uint64_t needed = BIT(FEATURE_MAX) - 1;
@ -59,6 +61,8 @@ Modules load_modules(char* module_dir, char* modules[], size_t num_modules, uint
twm_assert(m.init, "Module doesn't have module_init"); twm_assert(m.init, "Module doesn't have module_init");
m.close = (ModuleClose)dlsym(m.dll, "module_close"); m.close = (ModuleClose)dlsym(m.dll, "module_close");
twm_assert(m.close, "Module doesn't have module_close"); twm_assert(m.close, "Module doesn't have module_close");
void (**mod_twm_abort)() = dlsym(m.dll, "twm_abort");
*mod_twm_abort = twm_abort;
if ((m.funcs = (void*)m.init(best_feature)) == NULL) { if ((m.funcs = (void*)m.init(best_feature)) == NULL) {
LOG_WARNING("Module %s couldn't load", dll_name); LOG_WARNING("Module %s couldn't load", dll_name);

View File

@ -100,8 +100,10 @@ void display_put_pixel(Vec2 position, Color col) {
DRMConnector* conn = data->connectors; DRMConnector* conn = data->connectors;
while (conn) { while (conn) {
if (conn->enabled) { if (conn->enabled) {
if (position.x < 0 || position.x >= conn->size.x || position.y < 0 || position.y >= conn->size.y) if (position.x < 0 || position.x >= conn->size.x || position.y < 0 || position.y >= conn->size.y) {
conn = conn->next;
continue; continue;
}
uint8_t* row = conn->frame.data + position.y * conn->frame.pitch; uint8_t* row = conn->frame.data + position.y * conn->frame.pitch;
row[position.x * 4 + 0] = col.blue; row[position.x * 4 + 0] = col.blue;
row[position.x * 4 + 1] = col.green; row[position.x * 4 + 1] = col.green;

View File

@ -25,13 +25,14 @@ uint32_t get_pixel_color(Color col) {
} }
void display_put_pixel(Vec2 pos, Color col) { void display_put_pixel(Vec2 pos, Color col) {
twm_assert(!(pos.x < 0 || pos.x >= data->vscrinfo.xres || pos.y < 0 || pos.y >= data->vscrinfo.yres), "Writing out of bounds to screen");
long pixel_offset = (pos.x + data->vscrinfo.xoffset) * (data->vscrinfo.bits_per_pixel / 8) + (pos.y + data->vscrinfo.yoffset) * data->fscrinfo.line_length; long pixel_offset = (pos.x + data->vscrinfo.xoffset) * (data->vscrinfo.bits_per_pixel / 8) + (pos.y + data->vscrinfo.yoffset) * data->fscrinfo.line_length;
*((uint32_t*)(data->frame_buffer + pixel_offset)) = get_pixel_color(col); *((uint32_t*)(data->frame_buffer + pixel_offset)) = get_pixel_color(col);
} }
void display_blit(Vec2 pos, Image image) { void display_blit(Vec2 pos, Image image) {
for (int x = 0; x < image.size.x; x++) { for (int y = 0; y < image.size.y; y++) {
for (int y = 0; y < image.size.y; y++) { for (int x = 0; x < image.size.x; x++) {
display_put_pixel((Vec2) { x + pos.x, y + pos.y }, image.data[y][x]); display_put_pixel((Vec2) { x + pos.x, y + pos.y }, image.data[y][x]);
} }
} }

View File

@ -24,6 +24,17 @@ typedef enum {
#define BIT(n) ((uint64_t)1 << (n)) #define BIT(n) ((uint64_t)1 << (n))
#ifdef MODULE_NAME // We're in a module, implement cleanup stuff
void (*twm_abort)();
#else
void twm_abort();
extern Modules loaded_modules;
Modules load_modules(char*, char*[], size_t, uint64_t*);
void unload_modules(Modules);
void* module_find_func(Modules ms, ModuleFunc type);
void setup_signals();
#endif
#ifdef MODULE_NAME #ifdef MODULE_NAME
#define LOG_WARNING(f, ...) \ #define LOG_WARNING(f, ...) \
do { \ do { \
@ -62,7 +73,7 @@ typedef enum {
do { \ do { \
if (!(e)) { \ if (!(e)) { \
LOG_ERROR("Assertion Failed: %s (%s:%d %s)", m, __FILE__, __LINE__, #e); \ LOG_ERROR("Assertion Failed: %s (%s:%d %s)", m, __FILE__, __LINE__, #e); \
abort(); \ twm_abort(); \
} \ } \
} while (0) } while (0)
#define twm_assert_custom(e, m, c) \ #define twm_assert_custom(e, m, c) \
@ -73,10 +84,6 @@ typedef enum {
} \ } \
} while (0) } while (0)
Modules load_modules(char*, char*[], size_t, uint64_t*);
void unload_modules(Modules);
void* module_find_func(Modules ms, ModuleFunc type);
typedef struct { typedef struct {
int x; int x;
int y; int y;