Trying to improve threading, thread queue
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user