summaryrefslogtreecommitdiff
path: root/Source/Kernel/TaskManager/Process.class.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Kernel/TaskManager/Process.class.cpp')
-rw-r--r--Source/Kernel/TaskManager/Process.class.cpp69
1 files changed, 66 insertions, 3 deletions
diff --git a/Source/Kernel/TaskManager/Process.class.cpp b/Source/Kernel/TaskManager/Process.class.cpp
index a7e7d7c..eec28d8 100644
--- a/Source/Kernel/TaskManager/Process.class.cpp
+++ b/Source/Kernel/TaskManager/Process.class.cpp
@@ -5,6 +5,8 @@
#include <Linker/Binary.proto.h>
#include <Process.iface.h>
#include <UserManager/Usr.ns.h>
+#include <VirtualTerminal.iface.h>
+#include <SyscallManager/Res.ns.h>
#define ISPARENT Task::currProcess()->getPid() == m_ppid
@@ -20,11 +22,30 @@ call_t Process::m_callTable[] = {
CALL0(PRIF_GETPPID, &Process::getPpid),
CALL0(PRIF_ARGC, &Process::argcSC),
CALL1(PRIF_ARGV, &Process::argvSC),
+ CALL0(PRIF_START, &Process::startSC),
+ CALL1(PRIF_AUTODELETE, &Process::autoDeleteSC),
+ CALL1(PRIF_PUSHARG, &Process::pushArgSC),
+ CALL1(PRIF_SETOUTVT, &Process::setOutVTSC),
+ CALL1(PRIF_SETINVT, &Process::setInVTSC),
CALL0(0, 0)
};
u32int Process::scall(u8int wat, u32int a, u32int b, u32int c, u32int d) {
if (wat == PRIF_SGETCPR) return Task::currProcess()->resId();
+ if (wat == PRIF_SRUN) {
+ String* e = (String*)a;
+ Process* p = Process::run(*e, Usr::uid());
+ if (p != 0) return p->resId();
+ }
+ if (wat == PRIF_SWAIT) {
+ Process* p = Res::get<Process>(a, PRIF_OBJTYPE);
+ if (Task::currProcess()->getPid() != p->m_ppid) return 0;
+ while (p->m_state != P_FINISHED and !p->m_autodelete) Task::currThread()->sleep(20);
+ if (p->m_autodelete) return E_AUTODELETE;
+ s32int ret = p->m_retval;
+ delete p;
+ return ret;
+ }
return (u32int) - 1;
}
@@ -57,8 +78,8 @@ Process* Process::createKernel(String cmdline, VirtualTerminal *vt) {
return p;
}
-Process* Process::run(String filename, FSNode* cwd, u32int uid) {
- File file(filename, FM_READ, cwd);
+Process* Process::run(String filename, u32int uid) {
+ File file(filename, FM_READ, (FSNode*)Task::currProcess()->getCwd());
if (!file.valid()) return 0;
Binary* b = Binary::load(file);
if (b == 0) return 0;
@@ -81,6 +102,7 @@ Process::Process(String binfile, u32int uid) : Ressource(PRIF_OBJTYPE, m_callTab
m_retval = 0;
m_state = P_STARTING;
m_uid = uid;
+ m_autodelete = false;
m_cwd = Task::currProcess()->getCwd();
m_inVT = Task::currProcess()->getInVT();
m_outVT = Task::currProcess()->getOutVT();
@@ -128,7 +150,12 @@ void Process::registerThread(Thread* t) {
void Process::threadFinishes(Thread* thread, u32int retval) {
// If it is the main thread of the process, or if it pagefaulted
if (thread == m_threads[0] or retval == E_PAGEFAULT or retval == E_EXIT) {
- exit();
+ m_retval = retval;
+ if (m_autodelete) {
+ delete this;
+ } else {
+ exit();
+ }
} else {
//Simply unregister thread
for (u32int i = 0; i < m_threads.size(); i++) {
@@ -206,6 +233,42 @@ u32int Process::freePageSC(u32int pos) {
m_pagedir->freeFrame(pos);
return 0;
}
+
+u32int Process::startSC() {
+ if (Task::currProcess()->getPid() == m_ppid) {
+ start();
+ return 1;
+ }
+ return 0;
+}
+
+u32int Process::autoDeleteSC(u32int d) {
+ if (Task::currProcess()->getPid() != m_ppid) return 2;
+ m_autodelete = (d != 0);
+ return (m_autodelete ? 1 : 0);
+}
+
+u32int Process::pushArgSC(u32int arg) {
+ String* a = (String*)arg;
+ m_arguments.push(*a);
+ return 0;
+}
+
+u32int Process::setInVTSC(u32int vtid) {
+ if (Task::currProcess()->getPid() != m_ppid) return 0;
+ VirtualTerminal* vt = Res::get<VirtualTerminal>(vtid, VTIF_OBJTYPE);
+ if (vt != 0) setInVT(vt);
+ return 1;
+}
+
+u32int Process::setOutVTSC(u32int vtid) {
+ if (Task::currProcess()->getPid() != m_ppid) return 0;
+ VirtualTerminal* vt = Res::get<VirtualTerminal>(vtid, VTIF_OBJTYPE);
+ if (vt != 0) setOutVT(vt);
+ return 1;
+}
+
+
bool Process::accessible() {
return (m_uid == Usr::uid());
}