summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldrik Ramaekers <aldrikboy@gmail.com>2024-03-04 21:07:21 +0100
committerAldrik Ramaekers <aldrikboy@gmail.com>2024-03-04 21:07:21 +0100
commit5bb723bb02a803f0315f3dd734a19e75706baf06 (patch)
tree688c07fdf13f8e36d92cf72721af4431039016b3
parent305b9dd7c40abf1e8936937e539f7565423183da (diff)
fix racecondition between file and text search threads
-rw-r--r--src/main.cpp16
-rw-r--r--src/search.cpp15
-rw-r--r--src/search.h2
3 files changed, 21 insertions, 12 deletions
diff --git a/src/main.cpp b/src/main.cpp
index f50cd8e..424c1b7 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -10,14 +10,18 @@
#include <stdio.h>
+// Search params.
utf8_int8_t path_buffer[MAX_INPUT_LENGTH];
utf8_int8_t filter_buffer[MAX_INPUT_LENGTH];
utf8_int8_t query_buffer[MAX_INPUT_LENGTH];
+int ts_thread_count = 4;
+int max_file_size = megabytes(1000);
+// Popups
bool open_settings_window = false;
bool open_about_window = false;
-int ts_thread_count = 4;
+// Localization
int current_locale_index = 0;
int locales_count = 2;
char* locales[] = {
@@ -35,7 +39,7 @@ static void _ts_create_popups() {
// Settings window
if (ImGui::BeginPopupModal("Text-Search settings", NULL, ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoMove)) {
ImGui::SetWindowSize({300, 0});
- ImGui::DragInt("Threads", &ts_thread_count, 1.0f, 1, 64);
+ ImGui::DragInt("Threads", &ts_thread_count, 1.0f, 1, 4);
ImGui::Combo("Language", &current_locale_index, locales, locales_count);
ImGui::Dummy({0, 70});
@@ -125,7 +129,7 @@ void ts_init() {
int _tb_query_input_cb(ImGuiInputTextCallbackData* data) {
if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit) {
utf8ncpy(query_buffer, data->Buf, MAX_INPUT_LENGTH);
- ts_start_search(path_buffer, filter_buffer, query_buffer);
+ ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size);
}
return 0;
@@ -230,7 +234,7 @@ void ts_create_gui(int window_w, int window_h) {
ImGui::PushItemWidth(-1);
if (ImGui::InputTextWithHint("query", "Query", query_buffer, MAX_INPUT_LENGTH, ImGuiInputTextFlags_CallbackEdit|ImGuiInputTextFlags_EnterReturnsTrue, _tb_query_input_cb)) {
- ts_start_search(path_buffer, filter_buffer, query_buffer);
+ ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size);
}
ImGui::PopItemWidth();
ImGui::PopStyleVar();
@@ -243,7 +247,7 @@ void ts_create_gui(int window_w, int window_h) {
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
ImGui::PushItemWidth(-1);
if (ImGui::InputTextWithHint("filter-ti", "Filter", filter_buffer, MAX_INPUT_LENGTH, ImGuiInputTextFlags_EnterReturnsTrue)) {
- ts_start_search(path_buffer, filter_buffer, query_buffer);
+ ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size);
}
ImGui::PopItemWidth();
ImGui::PopStyleVar();
@@ -254,7 +258,7 @@ void ts_create_gui(int window_w, int window_h) {
else {
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
if (ImGui::Button("Search")) {
- ts_start_search(path_buffer, filter_buffer, query_buffer);
+ ts_start_search(path_buffer, filter_buffer, query_buffer, ts_thread_count, max_file_size);
}
ImGui::PopStyleVar();
}
diff --git a/src/search.cpp b/src/search.cpp
index 38bda76..82ffc64 100644
--- a/src/search.cpp
+++ b/src/search.cpp
@@ -303,17 +303,20 @@ static void *_ts_search_thread(void *args)
keep_going:;
while (new_result->file_list_read_cursor < new_result->files.length)
{
+ ts_thread_sleep(10);
if (new_result->cancel_search)
goto finish_early;
ts_mutex_lock(&new_result->files.mutex);
- int read_cursor = new_result->file_list_read_cursor++;
+ int read_cursor = new_result->file_list_read_cursor+1;
+ if (read_cursor >= new_result->files.length) {
+ ts_mutex_unlock(&new_result->files.mutex);
+ continue;
+ }
new_result->file_count++;
+ new_result->file_list_read_cursor++;
ts_mutex_unlock(&new_result->files.mutex);
- if (read_cursor >= new_result->files.length)
- continue;
-
ts_found_file *f = *(ts_found_file **)ts_array_at(&new_result->files, read_cursor);
ts_file_content content = ts_platform_read_file(f->path, "rb, ccs=UTF-8");
@@ -366,7 +369,7 @@ static void _ts_list_files(ts_search_result* result)
ts_thread_detach(&thr);
}
-void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query)
+void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query, int thread_count, int max_file_size)
{
if (utf8len(query) > 0 && utf8len(query) <= 2) { // need a string of atleast 3 characters
return;
@@ -381,6 +384,8 @@ void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query)
snprintf(new_result->directory_to_search, MAX_INPUT_LENGTH, "%s", path);
snprintf(new_result->search_text, MAX_INPUT_LENGTH, "%s", query);
new_result->filters = ts_get_filters(filter);
+ new_result->max_ts_thread_count = thread_count;
+ new_result->max_file_size = max_file_size;
if (utf8len(query) == 0) {
new_result->search_text = nullptr;
diff --git a/src/search.h b/src/search.h
index e9464b5..400edbe 100644
--- a/src/search.h
+++ b/src/search.h
@@ -68,6 +68,6 @@ int ts_filter_matches(ts_array *filters, utf8_int8_t *string, utf8_int8_t **
int ts_string_match(utf8_int8_t *first, utf8_int8_t *second);
ts_search_result* ts_create_empty_search_result();
bool ts_string_contains(utf8_int8_t *text_to_search, utf8_int8_t *text_to_find, ts_array *text_matches);
-void ts_start_search(utf8_int8_t* path, utf8_int8_t* filter, utf8_int8_t* query);
+void ts_start_search(utf8_int8_t *path, utf8_int8_t *filter, utf8_int8_t *query, int thread_count, int max_file_size);
#endif \ No newline at end of file