Compare commits

..

64 Commits

Author SHA1 Message Date
56066f332f
wind: Handle ftruncate() and mmap() errors properly
Some checks failed
continuous-integration/drone/pr Build is failing
2023-08-17 11:20:32 +02:00
d535c10061
wind: Fix client references being out-of-date in windows when disconnecting other clients
Classic "keeping a pointer to an element inside a vector after the vector is updated" bug, ah yes.
2023-08-16 20:02:54 +02:00
8b1632f443
taskbar: Wait for terminated child windows
Some checks failed
continuous-integration/drone/pr Build is failing
2023-08-16 16:49:08 +02:00
ed826069e0
wind: Add debug keybind 2023-08-16 16:48:55 +02:00
1b683ffd08
wind+libos+libui: Handle interrupted reads properly 2023-08-16 16:48:39 +02:00
b95d495815
base: Actually add the start icon to source control
Some checks failed
continuous-integration/drone/pr Build is failing
2023-08-16 14:54:59 +02:00
43061a099f
libui: Add Buttons 2023-08-16 14:54:59 +02:00
a529c091f0
libui: Handle other mouse events 2023-08-16 14:54:59 +02:00
efd21c9a1c
libui: Add aligned items using Containers, ImageWidget 2023-08-16 14:54:59 +02:00
88a2e60ea2
libui: Add VerticalLayout 2023-08-16 14:54:59 +02:00
7b55d594d1
wind+libui+taskbar: Add GetScreenRect IPC, non-decorated windows, taskbar 2023-08-16 14:54:58 +02:00
2c3c5b8aea
libui: Actually fill window backgrounds with the correct color 2023-08-16 14:54:58 +02:00
e3f31fb463
libui: Add basic widget and layout system =D 2023-08-16 14:54:58 +02:00
7159de0752
ui+wind: Send mouse move events through IPC 2023-08-16 14:54:58 +02:00
c430146c8b
wind+libui: Add protocol for window close requests 2023-08-16 14:54:58 +02:00
b7086dabf3
libos+libui+wind: Use uppercase for static struct IDs to avoid confusion with fields 2023-08-16 14:54:58 +02:00
6d3fdec98a
libui+gclient: Add basic OOP wrappers around the IPC protocol 2023-08-16 14:54:58 +02:00
c3c1ce150e
wind+gclient: Add SetWindowTitle and support shm buffers 2023-08-16 14:54:57 +02:00
b3dbbbf257
gclient: Create two example windows 2023-08-16 14:54:57 +02:00
537923a5bc
wind: Handle CreateWindow IPC messages 2023-08-16 14:54:57 +02:00
944aa3f3e5
libui: Add CreateWindow IPC message definitions 2023-08-16 14:54:57 +02:00
399edbcf0e
libos: Add basic IPC message framework 2023-08-16 14:54:57 +02:00
bd4c123fdd
kernel: Fix poll syscall 2023-08-16 14:54:57 +02:00
0a3df694c1
wind: Monitor data on client connections 2023-08-16 14:54:57 +02:00
887cc65461
kernel: Add POLLHUP and store it when a polled socket's peer disconnects 2023-08-16 14:54:56 +02:00
2b7bb40d14
libui: Add copyright/author text 2023-08-16 14:54:56 +02:00
b25a9bda6e
libos: Add copyright/author comments to LocalServer and LocalClient 2023-08-16 14:54:56 +02:00
a4fde43d4f
wind: Use init --user and pledge() 2023-08-16 14:54:56 +02:00
84060f2739
Update .gitignore 2023-08-16 14:54:56 +02:00
6bb7707e8d
libos: Remove some shared pointers and change them to owned/live on the stack 2023-08-16 14:54:56 +02:00
9f4a6639fc
wind: Spawn a new client process after startup
Also, create the socket after dropping privileges.
2023-08-16 14:54:55 +02:00
c7d7b9e1ac
apps: Add gclient 2023-08-16 14:54:55 +02:00
c9e172f1c3
libos: Add os::LocalClient 2023-08-16 14:54:55 +02:00
4e1dee5e73
libui: Change 'into' to 'onto' 2023-08-16 14:54:55 +02:00
ad492b42fc
libui: Document ui::Font 2023-08-16 14:54:55 +02:00
88c09edf53
libui+wind: Move some static variables inside functions 2023-08-16 14:54:55 +02:00
2d6300dd65
wind: Generate random windows on keypresses 2023-08-16 14:54:55 +02:00
8cd8896a87
wind: Make sure windows have a minimum size to fit the titlebar 2023-08-16 14:54:55 +02:00
4910f55603
libui: Properly cut off the last drawn character if necessary 2023-08-16 14:54:54 +02:00
23f3e8822b
libui: Add Rect::contains(Rect) 2023-08-16 14:54:54 +02:00
fbeafc7ec2
libui: Render font characters properly with no spacing, matching the width calculations 2023-08-16 14:54:54 +02:00
bdfa05a398
wind: Render an actual TGA mouse cursor 2023-08-16 14:54:54 +02:00
42c398615a
wind: Add a close button to windows using a TGA icon 2023-08-16 14:54:54 +02:00
6599d1a9bd
libui: Add support for TGA image loading 2023-08-16 14:54:54 +02:00
b83e68f6e1
libui: Add an interface to fill a Canvas with an array of pixels 2023-08-16 14:54:54 +02:00
d7ffc5f5a0
wind: Add window titlebars using ui::Font 2023-08-16 14:54:53 +02:00
8a33aa9c86
libui: Add PSF font loading and rendering 2023-08-16 14:54:53 +02:00
9765a03321
libui: Add Color::GRAY 2023-08-16 14:54:53 +02:00
ebbe755f51
libui: Rename Rect::absolute to normalized and add a new absolute function 2023-08-16 14:54:53 +02:00
0f9c5348dd
libluna: Add assignment operators to Buffer 2023-08-16 14:54:53 +02:00
0b3aac37c8
wind: Reorder drag sequence 2023-08-16 14:54:53 +02:00
2b1ce2a8c0
libui: Add Rect::relative 2023-08-16 14:54:53 +02:00
de7f487039
libui: Remove redundant statement 2023-08-16 14:54:52 +02:00
5d6cfc882e
libui: Add getters for separate color values 2023-08-16 14:54:52 +02:00
d6c7092e4b
libui: Remove unnecessary stuff 2023-08-16 14:54:52 +02:00
7c86993896
base: Remove startup items not necessary for GUI startup 2023-08-16 14:54:52 +02:00
e57a3ae23c
libui+wind: (Draggable) windows 2023-08-16 14:54:52 +02:00
2f37877644
wind: Create a local server object 2023-08-16 14:54:52 +02:00
4436ea2332
libos: Add a new LocalServer class for local domain sockets 2023-08-16 14:54:52 +02:00
a0b94ecc6c
kernel: Support listening sockets in poll() 2023-08-16 14:54:51 +02:00
4fe5d15ec1
base: Start wind on startup instead of the shell 2023-08-16 14:54:51 +02:00
3ac925a2d3
wind: Add a simple display server skeleton using libui
No client functionality yet, but it's a start.
2023-08-16 14:54:51 +02:00
6783e9253e
libui: Add a GUI and graphics library 2023-08-16 14:54:51 +02:00
6c40cbd09f
kernel: Fix negative movement in the PS/2 mouse driver 2023-08-16 14:54:51 +02:00
17 changed files with 10 additions and 199 deletions

View File

@ -47,7 +47,6 @@ luna_app(socket-client.cpp socket-client)
luna_app(input.cpp input) luna_app(input.cpp input)
luna_app(shmem-test.cpp shmem-test) luna_app(shmem-test.cpp shmem-test)
luna_app(touch.cpp touch) luna_app(touch.cpp touch)
luna_app(free.cpp free)
luna_app(gclient.cpp gclient) luna_app(gclient.cpp gclient)
target_link_libraries(gclient PUBLIC ui) target_link_libraries(gclient PUBLIC ui)
luna_app(taskbar.cpp taskbar) luna_app(taskbar.cpp taskbar)

View File

@ -1,50 +0,0 @@
#include <luna/Units.h>
#include <os/ArgumentParser.h>
#include <os/File.h>
#include <sys/memstat.h>
Result<int> luna_main(int argc, char** argv)
{
bool reserved { false };
bool human_readable { false };
os::ArgumentParser parser;
parser.add_description("Query the amount of memory available and used in the system.");
parser.add_system_program_info("free"_sv);
parser.add_switch_argument(reserved, 'r', "show-reserved"_sv, "show reserved system memory"_sv);
parser.add_switch_argument(human_readable, 'h', "human-readable"_sv, "show output in human-readable units"_sv);
parser.parse(argc, argv);
struct membuf buf;
memstat(&buf);
if (human_readable)
{
auto total = TRY(to_dynamic_unit(buf.mem_total, 10, false, Unit::Binary, true));
auto free = TRY(to_dynamic_unit(buf.mem_free, 10, false, Unit::Binary, true));
auto used = TRY(to_dynamic_unit(buf.mem_used, 10, false, Unit::Binary, true));
os::println("%s total memory, out of which:", total.chars());
os::println("%s used", used.chars());
os::println("%s free", free.chars());
}
else
{
os::println("%lu total memory, out of which:", buf.mem_total);
os::println("%lu used", buf.mem_used);
os::println("%lu free", buf.mem_free);
}
if (reserved)
{
if (human_readable)
{
auto reserved_string = TRY(to_dynamic_unit(buf.mem_reserved, 10, false, Unit::Binary, true));
os::println("%s reserved", reserved_string.chars());
}
else { os::println("%lu reserved", buf.mem_reserved); }
}
return 0;
}

View File

@ -47,7 +47,6 @@ set(SOURCES
src/sys/poll.cpp src/sys/poll.cpp
src/sys/alarm.cpp src/sys/alarm.cpp
src/sys/pledge.cpp src/sys/pledge.cpp
src/sys/memstat.cpp
src/fs/VFS.cpp src/fs/VFS.cpp
src/fs/Pipe.cpp src/fs/Pipe.cpp
src/fs/Mount.cpp src/fs/Mount.cpp

View File

@ -1,6 +1,5 @@
#include "fs/StorageCache.h" #include "fs/StorageCache.h"
#include "Log.h" #include "Log.h"
#include <luna/Heap.h>
#include <luna/ScopeGuard.h> #include <luna/ScopeGuard.h>
static LinkedList<StorageCache> g_storage_caches; static LinkedList<StorageCache> g_storage_caches;
@ -24,13 +23,9 @@ Result<StorageCache::CacheEntry*> StorageCache::fetch_entry(u64 block)
void StorageCache::clear() void StorageCache::clear()
{ {
m_mutex.lock(); ScopedKMutexLock<100> lock(m_mutex);
kdbgln("cache: clearing %lu entries, out of %lu buckets", m_cache_entries.size(), m_cache_entries.capacity());
m_cache_entries.clear(); m_cache_entries.clear();
kdbgln("cache: done");
m_mutex.unlock();
} }
StorageCache::StorageCache() StorageCache::StorageCache()

View File

@ -31,16 +31,6 @@ void reap_thread()
} }
} }
void oom_thread()
{
while (true)
{
kernel_wait_for_event();
// OOM! Do everything we can to recover memory.
StorageCache::clear_caches();
}
}
[[noreturn]] void init() [[noreturn]] void init()
{ {
{ {
@ -68,10 +58,6 @@ void oom_thread()
"Failed to create the process reaper kernel thread"); "Failed to create the process reaper kernel thread");
Scheduler::set_reap_thread(reap); Scheduler::set_reap_thread(reap);
auto oom = mark_critical(Scheduler::new_kernel_thread(oom_thread, "[oom]"),
"Failed to create the out-of-memory kernel thread");
Scheduler::set_oom_thread(oom);
#ifdef ARCH_X86_64 #ifdef ARCH_X86_64
ATA::Controller::scan(); ATA::Controller::scan();
#endif #endif

View File

@ -146,9 +146,9 @@ namespace MemoryManager
bool ok = frame_bitmap->find_and_toggle(false, start_index).try_set_value(index); bool ok = frame_bitmap->find_and_toggle(false, start_index).try_set_value(index);
if (!ok) if (!ok)
{ {
kwarnln("OOM alert! Scheduling the OOM thread..."); kwarnln("OOM alert! Trying to free caches...");
Scheduler::signal_oom_thread(); StorageCache::clear_caches();
return err(ENOMEM); if (!frame_bitmap->find_and_toggle(false, start_index).try_set_value(index)) return err(ENOMEM);
} }
start_index = index + 1; start_index = index + 1;

View File

@ -1,21 +0,0 @@
#include "Pledge.h"
#include "memory/MemoryManager.h"
#include "sys/Syscall.h"
#include "thread/Scheduler.h"
#include <bits/memstat.h>
Result<u64> sys_memstat(Registers*, SyscallArgs args)
{
auto* current = Scheduler::current();
TRY(check_pledge(current, Promise::p_stdio));
struct membuf buf;
buf.mem_total = MemoryManager::total();
buf.mem_used = MemoryManager::used();
buf.mem_free = MemoryManager::free();
buf.mem_reserved = MemoryManager::reserved();
if (!MemoryManager::copy_to_user_typed((struct membuf*)args[0], &buf)) return err(EFAULT);
return 0;
}

View File

@ -13,7 +13,6 @@ static Thread g_idle;
static Thread* g_current = nullptr; static Thread* g_current = nullptr;
static Thread* g_init = nullptr; static Thread* g_init = nullptr;
static Thread* g_reap = nullptr; static Thread* g_reap = nullptr;
static Thread* g_oom = nullptr;
static const usize TICKS_PER_TIMESLICE = 20; static const usize TICKS_PER_TIMESLICE = 20;
@ -71,17 +70,6 @@ namespace Scheduler
if (g_reap) g_reap->wake_up(); if (g_reap) g_reap->wake_up();
} }
void set_oom_thread(Thread* thread)
{
g_oom = thread;
g_oom->unrestricted_task = true;
}
void signal_oom_thread()
{
if (g_oom) g_oom->wake_up();
}
Result<Thread*> new_kernel_thread_impl(Thread* thread, const char* name) Result<Thread*> new_kernel_thread_impl(Thread* thread, const char* name)
{ {
// If anything fails, make sure to clean up. // If anything fails, make sure to clean up.
@ -166,13 +154,8 @@ namespace Scheduler
u64 argv = TRY(image->push_string_vector_on_stack(args)); u64 argv = TRY(image->push_string_vector_on_stack(args));
u64 envp = TRY(image->push_string_vector_on_stack(env)); u64 envp = TRY(image->push_string_vector_on_stack(env));
const u64 kernel_stack_base = TRY(MemoryManager::alloc_for_kernel(4, MMU::ReadWrite | MMU::NoExecute));
Stack kernel_stack { kernel_stack_base, 4 * ARCH_PAGE_SIZE };
guard.deactivate(); guard.deactivate();
thread->kernel_stack = kernel_stack;
image->apply(thread); image->apply(thread);
thread->set_arguments(args.size(), argv, env.size(), envp); thread->set_arguments(args.size(), argv, env.size(), envp);
@ -271,12 +254,8 @@ namespace Scheduler
new_thread->ticks_left = 1; // The idle task only runs for 1 tick so we can check for new runnable tasks new_thread->ticks_left = 1; // The idle task only runs for 1 tick so we can check for new runnable tasks
// as fast as possible. // as fast as possible.
} }
else if (new_thread->unrestricted_task) else
{ new_thread->ticks_left = TICKS_PER_TIMESLICE;
check(new_thread->is_kernel);
new_thread->ticks_left = -1;
}
else { new_thread->ticks_left = TICKS_PER_TIMESLICE; }
} }
void switch_task(Registers* regs) void switch_task(Registers* regs)

View File

@ -13,9 +13,6 @@ namespace Scheduler
void set_reap_thread(Thread*); void set_reap_thread(Thread*);
void signal_reap_thread(); void signal_reap_thread();
void set_oom_thread(Thread*);
void signal_oom_thread();
Result<Thread*> new_kernel_thread(u64 address, const char* name); Result<Thread*> new_kernel_thread(u64 address, const char* name);
Result<Thread*> new_kernel_thread(void (*func)(void), const char* name); Result<Thread*> new_kernel_thread(void (*func)(void), const char* name);
Result<Thread*> new_kernel_thread(void (*func)(void*), void* arg, const char* name); Result<Thread*> new_kernel_thread(void (*func)(void*), void* arg, const char* name);

View File

@ -109,8 +109,6 @@ struct Thread : public LinkedListNode<Thread>
sigset_t pending_signals { 0 }; sigset_t pending_signals { 0 };
bool interrupted { false }; bool interrupted { false };
bool unrestricted_task { false };
FPData fp_data; FPData fp_data;
ThreadState state = ThreadState::Runnable; ThreadState state = ThreadState::Runnable;

View File

@ -33,7 +33,6 @@ set(SOURCES
src/sys/utsname.cpp src/sys/utsname.cpp
src/sys/mount.cpp src/sys/mount.cpp
src/sys/pstat.cpp src/sys/pstat.cpp
src/sys/memstat.cpp
src/sys/resource.cpp src/sys/resource.cpp
src/sys/socket.cpp src/sys/socket.cpp
src/sys/poll.cpp src/sys/poll.cpp

View File

@ -1,14 +0,0 @@
/* bits/memstat.h: The membuf structure for memstat(). */
#ifndef _BITS_MEMSTAT_H
#define _BITS_MEMSTAT_H
struct membuf
{
unsigned long mem_total;
unsigned long mem_used;
unsigned long mem_free;
unsigned long mem_reserved;
};
#endif

View File

@ -1,20 +0,0 @@
/* sys/memstat.h: Memory usage querying. */
#ifndef _SYS_MEMSTAT_H
#define _SYS_MEMSTAT_H
#include <bits/memstat.h>
#ifdef __cplusplus
extern "C"
{
#endif
/* Query system memory usage. */
int memstat(struct membuf* mem);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,13 +0,0 @@
#include <bits/errno-return.h>
#include <sys/memstat.h>
#include <sys/syscall.h>
#include <unistd.h>
extern "C"
{
int memstat(struct membuf* buf)
{
long rc = syscall(SYS_memstat, buf);
__errno_return(rc, int);
}
}

View File

@ -49,16 +49,6 @@ template <typename K, typename V> struct HashMap
return m_table.try_remove(HashPair<K, V> { key, {} }); return m_table.try_remove(HashPair<K, V> { key, {} });
} }
usize capacity() const
{
return m_table.capacity();
}
usize size() const
{
return m_table.size();
}
void clear() void clear()
{ {
m_table.clear(); m_table.clear();

View File

@ -100,25 +100,12 @@ template <typename T> class HashTable
} }
void clear() void clear()
{
if (m_capacity)
{ {
for (usize i = 0; i < m_capacity; i++) m_buckets[i].~Option(); for (usize i = 0; i < m_capacity; i++) m_buckets[i].~Option();
free_impl(m_buckets); free_impl(m_buckets);
m_capacity = m_size = 0; m_capacity = m_size = 0;
} }
}
usize capacity() const
{
return m_capacity;
}
usize size() const
{
return m_size;
}
~HashTable() ~HashTable()
{ {

View File

@ -8,7 +8,7 @@
_e(umount) _e(pstat) _e(getrusage) _e(symlinkat) _e(readlinkat) _e(umask) _e(linkat) _e(faccessat) \ _e(umount) _e(pstat) _e(getrusage) _e(symlinkat) _e(readlinkat) _e(umask) _e(linkat) _e(faccessat) \
_e(pivot_root) _e(sigreturn) _e(sigaction) _e(kill) _e(sigprocmask) _e(setpgid) _e(isatty) \ _e(pivot_root) _e(sigreturn) _e(sigaction) _e(kill) _e(sigprocmask) _e(setpgid) _e(isatty) \
_e(getpgid) _e(socket) _e(bind) _e(connect) _e(listen) _e(accept) _e(poll) _e(msync) \ _e(getpgid) _e(socket) _e(bind) _e(connect) _e(listen) _e(accept) _e(poll) _e(msync) \
_e(truncate) _e(ftruncate) _e(utimensat) _e(alarm) _e(pledge) _e(memstat) _e(truncate) _e(ftruncate) _e(utimensat) _e(alarm) _e(pledge)
enum Syscalls enum Syscalls
{ {