reasonably ok multithreading

This commit is contained in:
anon 2024-08-06 23:50:11 +02:00
parent cfafe0498e
commit cb89a9927b
5 changed files with 36 additions and 19 deletions

View File

@ -1,6 +1,7 @@
#include <locale.h> #include <locale.h>
#include <pthread.h> #include <pthread.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <unistd.h>
#include "cli.hpp" #include "cli.hpp"
#include "bash_history.yy.hpp" #include "bash_history.yy.hpp"
#include "storage.hpp" #include "storage.hpp"
@ -67,17 +68,10 @@ void export_result(const char * const result) {
} }
void * async(void * arg) { void * async(void * arg) {
entry_t entry; while (do_run) {
tui_take_input();
while (true) {
if (is_input_changed) { if (is_input_changed) {
query(rl_line_buffer, entry_lines, selection_offset); cancel_all_queries();
is_input_changed = false;
} else {
requery();
}
while (entry = get_entry(), entry.command != NULL) {
tui_append_back(entry);
} }
} }
@ -85,7 +79,6 @@ void * async(void * arg) {
} }
signed main(const int argc, const char * const * const argv) { signed main(const int argc, const char * const * const argv) {
extern void testtest(void);
// NOTE: never returns on error // NOTE: never returns on error
parse_arguments(argc, argv); parse_arguments(argc, argv);
@ -96,12 +89,23 @@ signed main(const int argc, const char * const * const argv) {
pthread_t query_thread; pthread_t query_thread;
pthread_create(&query_thread, NULL, async, NULL); pthread_create(&query_thread, NULL, async, NULL);
while (do_run) { while (do_run) {
tui_take_input(); entry_t entry;
if (is_input_changed) { if (do_redisplay) {
testtest(); do_redisplay = false;
if (is_input_changed) {
is_input_changed = false;
query(rl_line_buffer, entry_lines, selection_offset);
} else {
requery();
}
while (entry = get_entry(), entry.command != NULL) {
tui_append_back(entry);
}
tui_refresh();
} }
tui_refresh(); usleep(1000);
} }
pthread_join(query_thread, NULL);
query(rl_line_buffer, 1, selection_offset + selection_relative); query(rl_line_buffer, 1, selection_offset + selection_relative);
export_result(get_entry().command); export_result(get_entry().command);

View File

@ -137,7 +137,7 @@ void requery(void) {
sqlite3_reset(*stmt); sqlite3_reset(*stmt);
} }
void testtest(void) { void cancel_all_queries(void) {
sqlite3_interrupt(db); sqlite3_interrupt(db);
} }

View File

@ -13,6 +13,7 @@ extern int deinit_storage(void);
extern int insert_entry(const entry_t entry); extern int insert_entry(const entry_t entry);
extern void query(const char * const string, const size_t limit, const size_t offset); extern void query(const char * const string, const size_t limit, const size_t offset);
extern void requery(void); extern void requery(void);
extern void cancel_all_queries(void);
extern entry_t get_entry(void); extern entry_t get_entry(void);
#endif #endif

View File

@ -5,8 +5,10 @@
#include <readline/readline.h> #include <readline/readline.h>
extern bool do_execute; extern bool do_execute;
size_t entry_lines; size_t entry_lines;
bool is_input_changed = true; bool is_input_changed = true;
bool do_redisplay = true;
static WINDOW * main_window; static WINDOW * main_window;
static WINDOW * entry_window; static WINDOW * entry_window;
@ -30,7 +32,7 @@ int init_tui(void) {
// Ncurses // Ncurses
initscr(); initscr();
nonl(); nonl();
halfdelay(1); cbreak(); //halfdelay(1);
noecho(); noecho();
curs_set(0); curs_set(0);
keypad(stdscr, TRUE); keypad(stdscr, TRUE);
@ -136,6 +138,7 @@ void tui_take_input(void) {
case CTRL('k'): { case CTRL('k'): {
if (selection_relative != entry_lines-1) { if (selection_relative != entry_lines-1) {
++selection_relative; ++selection_relative;
do_redisplay = true;
} else { } else {
++selection_offset; ++selection_offset;
is_input_changed = true; is_input_changed = true;
@ -146,6 +149,7 @@ void tui_take_input(void) {
case CTRL('j'): { case CTRL('j'): {
if (selection_relative != 0) { if (selection_relative != 0) {
--selection_relative; --selection_relative;
do_redisplay = true;
} else { } else {
if (selection_offset != 0) { if (selection_offset != 0) {
--selection_offset; --selection_offset;
@ -162,13 +166,15 @@ void tui_take_input(void) {
case CTRL('d'): { case CTRL('d'): {
if (selection_offset == 0) { if (selection_offset == 0) {
selection_relative = 0; selection_relative = 0;
do_redisplay = true;
} else } else
if (selection_offset > paging_size) { if (selection_offset > paging_size) {
selection_offset -= paging_size; selection_offset -= paging_size;
is_input_changed = true;
} else { } else {
selection_offset = 0; selection_offset = 0;
is_input_changed = true;
} }
is_input_changed = true;
} break; } break;
case CTRL('q'): { case CTRL('q'): {
do_execute = false; do_execute = false;
@ -184,4 +190,8 @@ void tui_take_input(void) {
is_input_changed = true; is_input_changed = true;
} break; } break;
} }
if (is_input_changed) {
do_redisplay = true;
}
} }

View File

@ -9,7 +9,9 @@ extern "C" char * rl_line_buffer;
extern size_t entry_lines; extern size_t entry_lines;
extern size_t selection_offset; extern size_t selection_offset;
extern size_t selection_relative; extern size_t selection_relative;
extern bool is_input_changed;
extern bool is_input_changed;
extern bool do_redisplay;
extern int init_tui(void); extern int init_tui(void);
extern int deinit_tui(void); extern int deinit_tui(void);