Trying to improve threading, thread queue

This commit is contained in:
Krzosa Karol
2024-07-06 07:55:38 +02:00
parent 30fa22aed5
commit e3a176b2f9
6 changed files with 201 additions and 108 deletions

View File

@@ -1,45 +1,39 @@
Arena MatchesArena;
Array<String> Matches = {MatchesArena};
Array<String> Matches = {};
char Prompt[256];
std::mutex SearchThreadArrayMutex;
bool SearchThreadStopSearching;
std::mutex SearchThreadArrayMutex;
std::binary_semaphore SearchThreadSemaphore{0};
bool SearchThreadStopSearching = false;
bool SearchThreadRunning = true;
void SearchThreadEntry() {
InitArena(&MatchesArena);
for (;;) {
SearchThreadSemaphore.acquire();
if (!SearchThreadRunning) break;
SearchThreadStopSearching = false;
WORK_FUNCTION(SearchForMatchesWork) {
if (Prompt[0] == 0) return;
if (Prompt[0]) {
SearchThreadArrayMutex.lock();
{
Matches.clear();
}
SearchThreadArrayMutex.unlock();
SearchThreadArrayMutex.lock();
Matches.clear();
SearchThreadArrayMutex.unlock();
String buffer = {(char *)XArena.data, (int64_t)XArena.len};
String find = Prompt;
int64_t index = 0;
while (Seek(buffer, find, &index, SeekFlag_IgnoreCase)) {
String found = {buffer.data + index, find.len};
SearchThreadArrayMutex.lock();
{
Matches.add(found);
}
SearchThreadArrayMutex.unlock();
if (SearchThreadStopSearching) break;
buffer = buffer.skip(index + find.len);
}
}
String buffer = {(char *)XArena.data, (int64_t)XArena.len};
String find = Prompt;
int64_t index = 0;
while (Seek(buffer, find, &index, SeekFlag_IgnoreCase)) {
String found = {buffer.data + index, find.len};
Matches.add(found);
buffer = buffer.skip(index + find.len);
if (SearchThreadStopSearching) return;
}
}
void SearchThreadClose(std::thread &thread) {
SearchThreadRunning = false;
SearchThreadSemaphore.release();
thread.join();
void StartSearchingForMatches() {
SearchThreadStopSearching = true;
WaitUntilCompletion(&MainWorkQueue);
SearchThreadStopSearching = false;
PushWork(&MainWorkQueue, NULL, SearchForMatchesWork);
}
Array<String> LockSearchResults() {
SearchThreadArrayMutex.lock();
Array<String> copy = Matches;
return copy;
}
void UnlockSearchResults() {
SearchThreadArrayMutex.unlock();
}