From 6d374a81bfd0a9d79fb60f9657f145c7ffe2fab0 Mon Sep 17 00:00:00 2001 From: Daniel Hammer Date: Sun, 22 Mar 2026 10:40:35 +0100 Subject: [PATCH] fix: new spinlock implementation, ramdisk max files, wallpaper scan locations --- kernel/src/CppLib/Spinlock.cpp | 5 +++ kernel/src/CppLib/Spinlock.hpp | 1 + kernel/src/Fs/Ramdisk.hpp | 2 +- programs/lib/libjpeg/libjpeg.a | Bin 330158 -> 330158 bytes programs/lib/tls/libtls.a | Bin 107778 -> 107778 bytes programs/src/desktop/apps/app_settings.cpp | 4 +-- programs/src/desktop/wallpaper.hpp | 36 ++++++++++++++++++--- 7 files changed, 41 insertions(+), 7 deletions(-) diff --git a/kernel/src/CppLib/Spinlock.cpp b/kernel/src/CppLib/Spinlock.cpp index bd1a376..104624b 100644 --- a/kernel/src/CppLib/Spinlock.cpp +++ b/kernel/src/CppLib/Spinlock.cpp @@ -8,12 +8,17 @@ namespace kcp { void Spinlock::Acquire() { + uint64_t flags; + asm volatile("pushfq; pop %0; cli" : "=r"(flags) :: "memory"); while (atomic_flag.test_and_set(std::memory_order_acquire)) { asm volatile("pause"); } + savedFlags = flags; } void Spinlock::Release() { + uint64_t flags = savedFlags; atomic_flag.clear(std::memory_order_release); + asm volatile("push %0; popfq" :: "r"(flags) : "memory"); } }; \ No newline at end of file diff --git a/kernel/src/CppLib/Spinlock.hpp b/kernel/src/CppLib/Spinlock.hpp index 77112ac..5891f3c 100644 --- a/kernel/src/CppLib/Spinlock.hpp +++ b/kernel/src/CppLib/Spinlock.hpp @@ -10,6 +10,7 @@ namespace kcp { class Spinlock { std::atomic_flag atomic_flag{ATOMIC_FLAG_INIT}; + uint64_t savedFlags = 0; public: void Acquire(); void Release(); diff --git a/kernel/src/Fs/Ramdisk.hpp b/kernel/src/Fs/Ramdisk.hpp index 45195e9..8d54448 100644 --- a/kernel/src/Fs/Ramdisk.hpp +++ b/kernel/src/Fs/Ramdisk.hpp @@ -10,7 +10,7 @@ namespace Fs::Ramdisk { - static constexpr int MaxFiles = 256; + static constexpr int MaxFiles = 512; static constexpr int MaxNameLen = 100; struct FileEntry { diff --git a/programs/lib/libjpeg/libjpeg.a b/programs/lib/libjpeg/libjpeg.a index ea03d4609351a0c5c4940a7cf307f054062a88aa..bf9333681cb2f140765c7dba81735645f6c26ea4 100644 GIT binary patch delta 51 wcmZ2CS!CU0kqI(vhK5EaMg|*|Oqig|<`|~-7$!y_2GPtw%(6X(i8Y8F0BZ;gvH$=8 delta 51 wcmZ2CS!CU0kqI(v1||mPmgXCkOqig|<`|~-7$!y_2GPtw%(6X(i8Y8F0B=(a)Bpeg diff --git a/programs/lib/tls/libtls.a b/programs/lib/tls/libtls.a index 456bad28467ce26d17789231f7a4dc26180d0a37..34f6ed5bdf61da9751d564933bcf3e0cd8de7450 100644 GIT binary patch delta 35 lcmZoV#nyC+ZGsG&p`nq9k-wp_scanned) { - wallpaper_scan_dir(st->desktop->home_dir, &st->wp_files); + wallpaper_scan_home(st->desktop->home_dir, &st->wp_files); st->wp_scanned = true; } @@ -1156,7 +1156,7 @@ static void settings_on_mouse(Window* win, MouseEvent& ev) { s.bg_image = true; s.bg_gradient = false; if (!st->wp_scanned) { - wallpaper_scan_dir(st->desktop->home_dir, &st->wp_files); + wallpaper_scan_home(st->desktop->home_dir, &st->wp_files); st->wp_scanned = true; } settings_persist(st); diff --git a/programs/src/desktop/wallpaper.hpp b/programs/src/desktop/wallpaper.hpp index 2081165..303e2c6 100644 --- a/programs/src/desktop/wallpaper.hpp +++ b/programs/src/desktop/wallpaper.hpp @@ -139,9 +139,11 @@ struct WallpaperFileList { int count; }; -inline void wallpaper_scan_dir(const char* dir_path, WallpaperFileList* list) { - list->count = 0; - +// Scan dir_path for JPEG files and append to list. +// name_prefix is prepended to each stored filename (e.g. "Pictures/"). +// Caller must zero list->count before the first call if starting fresh. +inline void wallpaper_scan_dir(const char* dir_path, WallpaperFileList* list, + const char* name_prefix = nullptr) { const char* raw_names[64]; int total = montauk::readdir(dir_path, raw_names, 64); if (total <= 0) return; @@ -165,6 +167,8 @@ inline void wallpaper_scan_dir(const char* dir_path, WallpaperFileList* list) { } } + int np_len = name_prefix ? montauk::slen(name_prefix) : 0; + auto to_lower = [](char c) -> char { return (c >= 'A' && c <= 'Z') ? (char)(c + 32) : c; }; @@ -206,10 +210,34 @@ inline void wallpaper_scan_dir(const char* dir_path, WallpaperFileList* list) { } if (is_jpeg) { - montauk::strncpy(list->names[list->count], name, 63); + if (np_len > 0) { + montauk::strncpy(list->names[list->count], name_prefix, 63); + int cur = np_len < 63 ? np_len : 63; + montauk::strncpy(list->names[list->count] + cur, name, + 63 - cur); + } else { + montauk::strncpy(list->names[list->count], name, 63); + } list->count++; } } } +// Scan Pictures/ subdirectory first, then home directory. +inline void wallpaper_scan_home(const char* home_dir, WallpaperFileList* list) { + list->count = 0; + + char pictures[256]; + montauk::strcpy(pictures, home_dir); + int hlen = montauk::slen(pictures); + if (hlen > 0 && pictures[hlen - 1] != '/') { + pictures[hlen++] = '/'; + pictures[hlen] = '\0'; + } + montauk::strncpy(pictures + hlen, "Pictures", 256 - hlen); + + wallpaper_scan_dir(pictures, list, "Pictures/"); + wallpaper_scan_dir(home_dir, list); +} + } // namespace gui