diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2024-03-28 19:27:31 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-28 19:27:31 +0100 |
| commit | 7325120ca9c552ea9934c4596e8d91bbafef1cf9 (patch) | |
| tree | dc62ff5cda05686d7bf4a04d26afd7dbcc465335 | |
| parent | 9b43aa3c946147843cc24686cc4ad7b21718a90e (diff) | |
| parent | 9a5a39c07dd16997a434660450a6d62d9932f90f (diff) | |
Merge pull request #3345 from laytan/speed-up-path-to-fullpath
fix not setting ok in cached code path
| -rw-r--r-- | src/build_settings.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/build_settings.cpp b/src/build_settings.cpp index f1a21161f..1ac9e451f 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -1189,12 +1189,19 @@ gb_internal String path_to_fullpath(gbAllocator a, String s, bool *ok_) { return result; } #elif defined(GB_SYSTEM_OSX) || defined(GB_SYSTEM_UNIX) + +struct PathToFullpathResult { + String result; + bool ok; +}; + gb_internal String path_to_fullpath(gbAllocator a, String s, bool *ok_) { - static gb_thread_local StringMap<String> cache; + static gb_thread_local StringMap<PathToFullpathResult> cache; - String* cached = string_map_get(&cache, s); + PathToFullpathResult *cached = string_map_get(&cache, s); if (cached != nullptr) { - return copy_string(a, *cached); + if (ok_) *ok_ = cached->ok; + return copy_string(a, cached->result); } char *p; @@ -1213,12 +1220,22 @@ gb_internal String path_to_fullpath(gbAllocator a, String s, bool *ok_) { // I have opted for 2 because it is much simpler + we already return `ok = false` + further // checks and processes will use the path and cause errors (which we want). String result = copy_string(a, s); - string_map_set(&cache, copy_string(permanent_allocator(), s), copy_string(permanent_allocator(), result)); + + PathToFullpathResult cached_result = {}; + cached_result.result = copy_string(permanent_allocator(), result); + cached_result.ok = false; + string_map_set(&cache, copy_string(permanent_allocator(), s), cached_result); + return result; } if (ok_) *ok_ = true; String result = copy_string(a, make_string_c(p)); - string_map_set(&cache, copy_string(permanent_allocator(), s), copy_string(permanent_allocator(), result)); + + PathToFullpathResult cached_result = {}; + cached_result.result = copy_string(permanent_allocator(), result); + cached_result.ok = true; + string_map_set(&cache, copy_string(permanent_allocator(), s), cached_result); + return result; } #else |