From 55a4f5d8ab69590d367c5d6a5d4af03f01e22743 Mon Sep 17 00:00:00 2001 From: rick Date: Wed, 14 Dec 2022 17:32:36 +0100 Subject: [PATCH] add multithreading for listen --- Makefile | 2 +- src/read_events.c | 33 +++++++++++++++++++++++++++++---- src/read_events.h | 13 +++++++++++++ src/ui.c | 21 +++++++++++++++------ src/ui.h | 2 ++ 5 files changed, 60 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index bb9f6e4..e29187d 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ CFLAGS := -Wall -Wextra -g -I. CXXFLAGS := -fpermissive -DIMGUI_IMPL_OPENGL_LOADER_GLFW -DIMGUI_IMPL_API="" -Wall -Wextra -g -I. #CFLAGS := -ansi -pedantic -Wall -Wextra -g -I. #CFLAGS := -Wall -ansi -g -I. -LDLIBS := -lxdo -lX11 -lglfw -lGL -lcimgui +LDLIBS := -lxdo -lX11 -lglfw -lGL -lcimgui -lpthread all: $(NAME) diff --git a/src/read_events.c b/src/read_events.c index 7113275..e1b4989 100644 --- a/src/read_events.c +++ b/src/read_events.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -7,6 +8,30 @@ #include "event.h" #include "read_events.h" +args_cancel_thread_read* init_args_read(int fd, event *user_event, Display *display) +{ + args_cancel_thread_read *ret = (args_cancel_thread_read *) malloc(sizeof(args_cancel_thread_read)); + ret->fd = fd; + ret->user_event = user_event; + ret->display = display; + + return ret; +} + +void cancel_read_events(args_cancel_thread_read *arg) +{ + int fd = arg->fd; + /* flush the middle button */ + unsigned char data[3]; + read(fd, data, sizeof(data)); + read(fd, data, sizeof(data)); + + free(arg->user_event); + close(fd); + XCloseDisplay(arg->display); + free(arg); +} + void write_event(event *new_event, FILE *file) { fwrite(new_event, sizeof(event), 1, file); @@ -38,6 +63,8 @@ int listen(FILE *file) return -1; } + pthread_cleanup_push(cancel_read_events, init_args_read(fd, user_event, display)); + while (!(left && right)) { /* Read Mouse */ @@ -82,9 +109,7 @@ int listen(FILE *file) free(user_event); close(fd); XCloseDisplay(display); + + pthread_cleanup_pop(1); return 0; - /* - TODO on ecoute la souris - TODO on repete ce qu'on a entre - */ } diff --git a/src/read_events.h b/src/read_events.h index ea21748..3b84eb9 100644 --- a/src/read_events.h +++ b/src/read_events.h @@ -1,7 +1,20 @@ #ifndef READ_EVENTS #define READ_EVENTS +#include #include "event.h" +/* + * Structure utilisée pour passer des arguments à la fonction + * pthread_cleanup_push. + */ +typedef struct { + int fd; + event *user_event; + Display *display; +} args_cancel_thread_read; + +args_cancel_thread_read * init_args_read(int fd, event *user_event, Display *display); + void write_event(event *new_event, FILE *file); /* Just listen the input and write them in the parameter file. */ diff --git a/src/ui.c b/src/ui.c index 8f87a94..e3b7807 100644 --- a/src/ui.c +++ b/src/ui.c @@ -1,5 +1,6 @@ #define CIMGUI_DEFINE_ENUMS_AND_STRUCTS #include +#include #include #include @@ -46,13 +47,15 @@ int draw_ui(ui_infos *ptr) if (ptr->is_recording) { - igButton("Appuyer sur les clics droit et gauche pour arrêter d'enregistrer.", (ImVec2) { 0, 0 }); - - ptr->is_recording = listen(ptr->file); - if (ptr->is_recording) + if (igButton("Arrêter l'enregistrement.", (ImVec2) { 0, 0 })) { - fprintf(stderr, "listen a eu un soucis."); - return -1; + if (pthread_cancel(ptr->pid)) + { + fprintf(stderr, "Erreur lors du cancel du thread listen.\n"); + return -1; + } + + ptr->is_recording = 0; } } else @@ -60,6 +63,12 @@ int draw_ui(ui_infos *ptr) if (igButton("Lancer l'enregistrement.", (ImVec2) { 0, 0 })) { ptr->is_recording = 1; + + if (pthread_create(&ptr->pid, NULL, listen, ptr->file)) + { + fprintf(stderr, "Erreur à la création du thread de listen.\n"); + return -1; + } } if (igButton("Replay", (ImVec2) {0, 0})) diff --git a/src/ui.h b/src/ui.h index d694133..cc27717 100644 --- a/src/ui.h +++ b/src/ui.h @@ -1,10 +1,12 @@ #ifndef UI #define UI +#include typedef struct { char *name; FILE *file; char is_recording; + pthread_t pid; } ui_infos; ui_infos * init_ui(char *name);