reasonably ok multithreading
This commit is contained in:
parent
cfafe0498e
commit
cb89a9927b
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user