mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-11 10:18:15 +09:00
Generate a basic /proc/summary file with some info about all tasks.
This commit is contained in:
parent
ed2422d7af
commit
63e253bac9
Notes:
sideshowbarker
2024-07-19 18:44:48 +09:00
Author: https://github.com/awesomekling
Commit: 63e253bac9
5 changed files with 35 additions and 5 deletions
|
@ -45,7 +45,7 @@ public:
|
||||||
InlineLinkedList() { }
|
InlineLinkedList() { }
|
||||||
|
|
||||||
bool isEmpty() const { return !m_head; }
|
bool isEmpty() const { return !m_head; }
|
||||||
size_t size() const;
|
size_t sizeSlow() const;
|
||||||
void clear();
|
void clear();
|
||||||
|
|
||||||
T* head() const { return m_head; }
|
T* head() const { return m_head; }
|
||||||
|
@ -72,7 +72,7 @@ private:
|
||||||
T* m_tail { nullptr };
|
T* m_tail { nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename T> inline size_t InlineLinkedList<T>::size() const
|
template<typename T> inline size_t InlineLinkedList<T>::sizeSlow() const
|
||||||
{
|
{
|
||||||
size_t size = 0;
|
size_t size = 0;
|
||||||
for (T* node = m_head; node; node = node->next())
|
for (T* node = m_head; node; node = node->next())
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include "ProcFileSystem.h"
|
#include "ProcFileSystem.h"
|
||||||
#include <AK/StdLib.h>
|
#include "Task.h"
|
||||||
|
|
||||||
RetainPtr<ProcFileSystem> ProcFileSystem::create()
|
RetainPtr<ProcFileSystem> ProcFileSystem::create()
|
||||||
{
|
{
|
||||||
|
@ -18,7 +18,24 @@ bool ProcFileSystem::initialize()
|
||||||
{
|
{
|
||||||
SyntheticFileSystem::initialize();
|
SyntheticFileSystem::initialize();
|
||||||
addFile(createGeneratedFile("summary", [] {
|
addFile(createGeneratedFile("summary", [] {
|
||||||
return String("Process summary!").toByteBuffer();
|
cli();
|
||||||
|
auto tasks = Task::allTasks();
|
||||||
|
char* buffer;
|
||||||
|
auto stringImpl = StringImpl::createUninitialized(tasks.size() * 64, buffer);
|
||||||
|
memset(buffer, 0, stringImpl->length());
|
||||||
|
char* ptr = buffer;
|
||||||
|
ptr += ksprintf(ptr, "PID OWNER STATE NAME\n");
|
||||||
|
for (auto* task : tasks) {
|
||||||
|
ptr += ksprintf(ptr, "%w %w:%w %b %s\n",
|
||||||
|
task->pid(),
|
||||||
|
task->uid(),
|
||||||
|
task->gid(),
|
||||||
|
task->state(),
|
||||||
|
task->name().characters());
|
||||||
|
}
|
||||||
|
*ptr = '\0';
|
||||||
|
sti();
|
||||||
|
return ByteBuffer::copy((byte*)buffer, ptr - buffer);
|
||||||
}));
|
}));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,6 +95,15 @@ void Task::allocateLDT()
|
||||||
m_tss.ldt = newLDTSelector;
|
m_tss.ldt = newLDTSelector;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector<Task*> Task::allTasks()
|
||||||
|
{
|
||||||
|
Vector<Task*> tasks;
|
||||||
|
tasks.ensureCapacity(s_tasks->sizeSlow());
|
||||||
|
for (auto* task = s_tasks->head(); task; task = task->next())
|
||||||
|
tasks.append(task);
|
||||||
|
return tasks;
|
||||||
|
}
|
||||||
|
|
||||||
Task::Region* Task::allocateRegion(size_t size, String&& name)
|
Task::Region* Task::allocateRegion(size_t size, String&& name)
|
||||||
{
|
{
|
||||||
// FIXME: This needs sanity checks. What if this overlaps existing regions?
|
// FIXME: This needs sanity checks. What if this overlaps existing regions?
|
||||||
|
|
|
@ -19,6 +19,8 @@ public:
|
||||||
static Task* create(const String& path, uid_t, gid_t);
|
static Task* create(const String& path, uid_t, gid_t);
|
||||||
Task(String&& name, uid_t, gid_t);
|
Task(String&& name, uid_t, gid_t);
|
||||||
|
|
||||||
|
static Vector<Task*> allTasks();
|
||||||
|
|
||||||
#ifdef TASK_SANITY_CHECKS
|
#ifdef TASK_SANITY_CHECKS
|
||||||
static void checkSanity(const char* msg = nullptr);
|
static void checkSanity(const char* msg = nullptr);
|
||||||
#else
|
#else
|
||||||
|
@ -58,6 +60,8 @@ public:
|
||||||
TSS32& tss() { return m_tss; }
|
TSS32& tss() { return m_tss; }
|
||||||
State state() const { return m_state; }
|
State state() const { return m_state; }
|
||||||
IPC::Handle handle() const { return m_handle; }
|
IPC::Handle handle() const { return m_handle; }
|
||||||
|
uid_t uid() const { return m_uid; }
|
||||||
|
uid_t gid() const { return m_gid; }
|
||||||
|
|
||||||
const FarPtr& farPtr() const { return m_farPtr; }
|
const FarPtr& farPtr() const { return m_farPtr; }
|
||||||
|
|
||||||
|
|
|
@ -138,7 +138,7 @@ static void init_stage2()
|
||||||
vfs->mount(procfs.copyRef(), "/proc");
|
vfs->mount(procfs.copyRef(), "/proc");
|
||||||
|
|
||||||
{
|
{
|
||||||
auto motdFile = vfs->open("/motd.txt");
|
auto motdFile = vfs->open("/proc/summary");
|
||||||
ASSERT(motdFile);
|
ASSERT(motdFile);
|
||||||
auto motdData = motdFile->readEntireFile();
|
auto motdData = motdFile->readEntireFile();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue