From 3253a23b915df9c6e10d586a4a69181c1f1079bc Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 24 Oct 2018 00:20:34 +0200 Subject: [PATCH] Add a simplified waitpid() so that sh can wait on spawned commands. --- Kernel/Syscall.cpp | 2 ++ Kernel/Syscall.h | 1 + Kernel/Task.cpp | 33 ++++++++++++++++++++++++++------- Kernel/Task.h | 5 +++++ Kernel/_fs_contents | Bin 1024000 -> 1024000 bytes LibC/unistd.cpp | 5 +++++ LibC/unistd.h | 1 + Userland/sh.cpp | 2 ++ 8 files changed, 42 insertions(+), 7 deletions(-) diff --git a/Kernel/Syscall.cpp b/Kernel/Syscall.cpp index ede05bda5f..a5701b452f 100644 --- a/Kernel/Syscall.cpp +++ b/Kernel/Syscall.cpp @@ -88,6 +88,8 @@ DWORD handle(DWORD function, DWORD arg1, DWORD arg2, DWORD arg3) return current->sys$getgid(); case Syscall::PosixGetpid: return current->sys$getpid(); + case Syscall::PosixWaitpid: + return current->sys$waitpid((pid_t)arg1); case Syscall::PosixExit: cli(); locker.unlock(); diff --git a/Kernel/Syscall.h b/Kernel/Syscall.h index 095fc507e7..edc24d610b 100644 --- a/Kernel/Syscall.h +++ b/Kernel/Syscall.h @@ -23,6 +23,7 @@ enum Function { PosixExit = 0x1991, PosixGetgid = 0x1992, PosixGetpid = 0x1993, + PosixWaitpid = 0x1994, }; void initialize(); diff --git a/Kernel/Task.cpp b/Kernel/Task.cpp index 075c4709a8..6c0ba1d43d 100644 --- a/Kernel/Task.cpp +++ b/Kernel/Task.cpp @@ -11,6 +11,9 @@ #include "MemoryManager.h" //#define DEBUG_IO +//#define TASK_DEBUG + +static const DWORD defaultStackSize = 16384; Task* current; Task* s_kernelTask; @@ -169,7 +172,9 @@ Task* Task::create(const String& path, uid_t uid, gid_t gid) s_tasks->prepend(t); system.nprocess++; +#ifdef TASK_DEBUG kprintf("Task %u (%s) spawned @ %p\n", t->pid(), t->name().characters(), t->m_tss.eip); +#endif sti(); return t; @@ -206,9 +211,6 @@ Task::Task(String&& name, uid_t uid, gid_t gid) m_tss.cr3 = MemoryManager::the().pageDirectoryBase().get(); - // NOTE: Each task gets 16KB of stack. - static const DWORD defaultStackSize = 16384; - auto* region = allocateRegion(defaultStackSize, "stack"); ASSERT(region); m_stackTop = region->linearAddress.offset(defaultStackSize).get() & 0xfffffff8; @@ -287,9 +289,6 @@ Task::Task(void (*e)(), const char* n, IPC::Handle h, RingLevel ring) m_tss.eip = codeRegion->linearAddress.get(); } - // NOTE: Each task gets 16KB of stack. - static const DWORD defaultStackSize = 16384; - if (isRing0()) { // FIXME: This memory is leaked. // But uh, there's also no kernel task termination, so I guess it's not technically leaked... @@ -327,8 +326,9 @@ Task::Task(void (*e)(), const char* n, IPC::Handle h, RingLevel ring) s_tasks->prepend(this); system.nprocess++; - +#ifdef TASK_DEBUG kprintf("Task %u (%s) spawned @ %p\n", m_pid, m_name.characters(), m_tss.eip); +#endif } Task::~Task() @@ -359,7 +359,9 @@ void Task::dumpRegions() void Task::sys$exit(int status) { cli(); +#ifdef TASK_DEBUG kprintf("sys$exit: %s(%u) exit with status %d\n", name().characters(), pid(), status); +#endif setState(Exiting); @@ -473,6 +475,13 @@ bool scheduleNewTask() continue; } } + + if (task->state() == Task::BlockedWait) { + if (!Task::fromPID(task->waitee())) { + task->unblock(); + continue; + } + } } auto* prevHead = s_tasks->head(); @@ -693,6 +702,16 @@ pid_t Task::sys$getpid() return m_pid; } +pid_t Task::sys$waitpid(pid_t waitee) +{ + if (!Task::fromPID(waitee)) + return -1; + m_waitee = waitee; + block(BlockedWait); + yield(); + return m_waitee; +} + bool Task::acceptsMessageFrom(Task& peer) { return !ipc.msg.isValid() && (ipc.src == IPC::Handle::Any || ipc.src == peer.handle()); diff --git a/Kernel/Task.h b/Kernel/Task.h index 06c8dc8212..7427daee80 100644 --- a/Kernel/Task.h +++ b/Kernel/Task.h @@ -37,6 +37,7 @@ public: Terminated = 6, Crashing = 7, Exiting = 8, + BlockedWait = 9, }; enum RingLevel { @@ -97,6 +98,7 @@ public: void sys$sleep(DWORD ticks); void sys$exit(int status); int sys$spawn(const char* path); + pid_t sys$waitpid(pid_t); struct { @@ -116,6 +118,8 @@ public: void didSchedule() { ++m_timesScheduled; } dword timesScheduled() const { return m_timesScheduled; } + pid_t waitee() const { return m_waitee; } + private: friend class MemoryManager; @@ -145,6 +149,7 @@ private: int m_error { 0 }; void* m_kernelStack { nullptr }; dword m_timesScheduled { 0 }; + pid_t m_waitee { -1 }; struct Region { Region(LinearAddress, size_t, RetainPtr&&, String&&); diff --git a/Kernel/_fs_contents b/Kernel/_fs_contents index e74551456e35e00dd6d24e4cef5777a3c55b7928..70277d8a7b6b46678562f84003bee4969fa4821e 100644 GIT binary patch delta 12524 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 delta 5989 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 L)$Gk369qT`Qf(=d diff --git a/LibC/unistd.cpp b/LibC/unistd.cpp index 6efa2da1b2..81570ece70 100644 --- a/LibC/unistd.cpp +++ b/LibC/unistd.cpp @@ -35,5 +35,10 @@ int close(int fd) return Syscall::invoke(Syscall::PosixClose, fd); } +pid_t waitpid(pid_t waitee) +{ + return Syscall::invoke(Syscall::PosixWaitpid, waitee); +} + } diff --git a/LibC/unistd.h b/LibC/unistd.h index 2395eadf13..078a90fe0e 100644 --- a/LibC/unistd.h +++ b/LibC/unistd.h @@ -10,6 +10,7 @@ pid_t getpid(); int open(const char* path); ssize_t read(int fd, void* buf, size_t count); int close(int fd); +pid_t waitpid(pid_t); } diff --git a/Userland/sh.cpp b/Userland/sh.cpp index 6ec7a5e42a..68d4cc24b3 100644 --- a/Userland/sh.cpp +++ b/Userland/sh.cpp @@ -18,7 +18,9 @@ static int runcmd(char* cmd) int ret = spawn(buf); if (ret == -1) { printf("spawn failed: %s\n", cmd); + return 1; } + waitpid(ret); return 0; }