add kill + example code
scheduler.kill seems like its not implemented comletly or doest work as expected.
This commit is contained in:
@@ -66,6 +66,9 @@ extern "C" size_t syscall_handler(size_t sysnum, size_t p1, size_t p2,
|
|||||||
case Syscall::ID::SYS_EXIT:
|
case Syscall::ID::SYS_EXIT:
|
||||||
Syscall::Skeleton::exit(Guard::enter().vault());
|
Syscall::Skeleton::exit(Guard::enter().vault());
|
||||||
return 0;
|
return 0;
|
||||||
|
case Syscall::ID::SYS_KILL:
|
||||||
|
Syscall::Skeleton::kill(Guard::enter().vault(),p1);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return static_cast<size_t>(-1);
|
return static_cast<size_t>(-1);
|
||||||
|
|||||||
@@ -108,5 +108,8 @@ void exit(Vault &vault) {
|
|||||||
vault.scheduler.exit();
|
vault.scheduler.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void kill(Vault &vault, size_t pid){
|
||||||
|
vault.scheduler.kill(&apps[pid]);
|
||||||
|
}
|
||||||
} // namespace Skeleton
|
} // namespace Skeleton
|
||||||
} // namespace Syscall
|
} // namespace Syscall
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ enum class ID : size_t {
|
|||||||
SEM_SIGNAL=7,
|
SEM_SIGNAL=7,
|
||||||
SYS_GETPID = 8,
|
SYS_GETPID = 8,
|
||||||
SYS_EXIT = 9,
|
SYS_EXIT = 9,
|
||||||
//SYS_KILL=10
|
SYS_KILL = 10
|
||||||
};
|
};
|
||||||
} // namespace Syscall
|
} // namespace Syscall
|
||||||
|
|
||||||
@@ -67,3 +67,7 @@ extern "C" ssize_t sys_safe_call(Syscall::ID id, size_t p1, size_t p2,
|
|||||||
sys_call(Syscall::ID::SYS_EXIT, 0, 0, 0, 0, 0);
|
sys_call(Syscall::ID::SYS_EXIT, 0, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[gnu::always_inline]] static inline void sys_kill(size_t pid){
|
||||||
|
sys_call(Syscall::ID::SYS_KILL, pid, 0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,20 +1,7 @@
|
|||||||
// vim: set noet ts=4 sw=4:
|
// vim: set noet ts=4 sw=4:
|
||||||
|
|
||||||
#include "appl.h"
|
#include "appl.h"
|
||||||
#include "../../syscall/stub.h"
|
#include "../../syscall/stub.h"
|
||||||
|
|
||||||
#include "../../arch/core.h"
|
|
||||||
#include "../../arch/system.h"
|
|
||||||
#include "../../debug/output.h"
|
|
||||||
#include "../../device/textstream.h"
|
|
||||||
#include "../../interrupt/guard.h"
|
|
||||||
#include "../../sync/semaphore.h"
|
|
||||||
#include "../../thread/scheduler.h"
|
|
||||||
extern Semaphore koutsem;
|
|
||||||
extern TextStream kout;
|
|
||||||
|
|
||||||
extern Application apps[];
|
|
||||||
|
|
||||||
void Application::action() { // NOLINT
|
void Application::action() { // NOLINT
|
||||||
// Thread 1 may be an auxiliary thread
|
// Thread 1 may be an auxiliary thread
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "./kappl.h"
|
#include "./kappl.h"
|
||||||
#include "../../syscall/stub.h"
|
#include "../../syscall/stub.h"
|
||||||
|
#include "../../utils/string.h"
|
||||||
|
|
||||||
#include "../../device/textstream.h"
|
#include "../../device/textstream.h"
|
||||||
extern TextStream kout;
|
extern TextStream kout;
|
||||||
@@ -9,49 +10,32 @@ extern TextStream kout;
|
|||||||
extern Semaphore koutsem;
|
extern Semaphore koutsem;
|
||||||
|
|
||||||
void KeyboardApplication::action() { // NOLINT
|
void KeyboardApplication::action() { // NOLINT
|
||||||
|
char cmd_buff[100];
|
||||||
|
uint8_t bufferpos = 0;
|
||||||
while(1){
|
while(1){
|
||||||
char msg[11];
|
char msg[11];
|
||||||
int len;
|
int len;
|
||||||
len = read(0, msg, 10);
|
len = read(0, msg, 10);
|
||||||
if(len)
|
if(len){
|
||||||
write(0, msg, len);
|
write(0, msg, len);
|
||||||
|
memcpy(&cmd_buff[bufferpos], msg, len);
|
||||||
|
bufferpos+=len;
|
||||||
|
for(uint8_t i=0; i<len; i++)
|
||||||
|
if(msg[i] == '\n'){
|
||||||
|
bufferpos = 0;
|
||||||
|
if(strncmp(cmd_buff, "kill ", 5) == 0){
|
||||||
|
int pid = cmd_buff[5]-0x30;
|
||||||
|
char r[] = "killing X\n";
|
||||||
|
r[8] = pid+0x30;
|
||||||
|
write(0, r, 9);
|
||||||
|
sys_kill(pid);
|
||||||
|
}
|
||||||
|
if(strncmp(cmd_buff, "killall", 7) == 0){
|
||||||
|
for(uint8_t i = 0; i<10; i++){
|
||||||
|
sys_kill(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//const unsigned line = 10 + 2;
|
|
||||||
//for (unsigned column = 0;; ++column) {
|
|
||||||
// Key key;
|
|
||||||
// {
|
|
||||||
// Guarded g = Guard::enter();
|
|
||||||
// g.vault().keys_sem.p(g.vault());
|
|
||||||
// assert(g.vault().keys.consume(key) && "No key but sem returned!");
|
|
||||||
// }
|
|
||||||
// if (key.valid()) {
|
|
||||||
// if (column >= CGA::COLUMNS - 1) {
|
|
||||||
// column = 0;
|
|
||||||
// koutsem.p(Guard::enter().vault());
|
|
||||||
// for (unsigned offset = 0; offset < 3; offset++) {
|
|
||||||
// for (unsigned column = 0; column < CGA::COLUMNS; ++column) {
|
|
||||||
// CGA::show(column, line + offset, ' ');
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// koutsem.v(Guard::enter().vault());
|
|
||||||
// }
|
|
||||||
// koutsem.p(Guard::enter().vault());
|
|
||||||
// kout.setPos(column, line);
|
|
||||||
// kout << static_cast<char>(key.ascii());
|
|
||||||
// kout.flush();
|
|
||||||
// koutsem.v(Guard::enter().vault());
|
|
||||||
// }
|
|
||||||
// for (unsigned offset = 0; offset < 3; offset++) {
|
|
||||||
// {
|
|
||||||
// Guarded g = Guard::enter();
|
|
||||||
// g.vault().bellringer.sleep(g.vault(), 10);
|
|
||||||
// koutsem.p(g.vault());
|
|
||||||
// }
|
|
||||||
// kout.setPos(column, line + offset);
|
|
||||||
// kout << static_cast<char>(key.ascii());
|
|
||||||
// kout.flush();
|
|
||||||
// koutsem.v(Guard::enter().vault());
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user