sleep; appl + kappl do smth more or less usefull
This commit is contained in:
@@ -41,15 +41,14 @@ extern "C" size_t syscall_handler(size_t sysnum, size_t p1, size_t p2,
|
|||||||
InterruptContext *user) {
|
InterruptContext *user) {
|
||||||
switch ((Syscall::ID)sysnum) {
|
switch ((Syscall::ID)sysnum) {
|
||||||
case Syscall::ID::TEST:
|
case Syscall::ID::TEST:
|
||||||
Syscall::Skeleton::test(Guard::enter().vault(), p1, p2, p3, p4, p5);
|
return Syscall::Skeleton::test(Guard::enter().vault(), p1, p2, p3, p4, p5);
|
||||||
break;
|
|
||||||
case Syscall::ID::WRITE:
|
case Syscall::ID::WRITE:
|
||||||
Guard::enter().vault().kout.setPos((int)p4, (int)p5);
|
return Syscall::Skeleton::write(Guard::enter().vault(), p1, (char*)p2, p3, (int)p4, (int)p5);
|
||||||
Syscall::Skeleton::write(Guard::enter().vault(), p1, (char*)p2, p3);
|
|
||||||
break;
|
|
||||||
case Syscall::ID::READ:
|
case Syscall::ID::READ:
|
||||||
return Syscall::Skeleton::read(Guard::enter().vault(), 0, (void*) p2, p3);
|
return Syscall::Skeleton::read(Guard::enter().vault(), 0, (void*) p2, p3);
|
||||||
break;
|
case Syscall::ID::SLEEP:
|
||||||
|
Syscall::Skeleton::sleep(Guard::enter().vault(), p1);
|
||||||
|
return 0;
|
||||||
case Syscall::ID::SEM_INIT:
|
case Syscall::ID::SEM_INIT:
|
||||||
Syscall::Skeleton::sem_init(Guard::enter().vault(), p1, p2);
|
Syscall::Skeleton::sem_init(Guard::enter().vault(), p1, p2);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -24,9 +24,19 @@ int getpid(Vault &vault) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t write(Vault &vault, uint32_t id, const void *buffer, size_t size) {
|
size_t write(Vault &vault, uint32_t id, const void *buffer, size_t size, int x, int y) {
|
||||||
(void)id;
|
(void)id;
|
||||||
|
|
||||||
|
int dummy;
|
||||||
|
if(x == -1 && y != -1)
|
||||||
|
vault.kout.getPos(x, dummy);
|
||||||
|
if(x != -1 && y == -1)
|
||||||
|
vault.kout.getPos(dummy, y);
|
||||||
|
if(x == -1 && y == -1)
|
||||||
|
vault.kout.getPos(x, y);
|
||||||
|
|
||||||
|
vault.kout.setPos(x, y);
|
||||||
|
|
||||||
for(size_t i = 0; i<size; i++)
|
for(size_t i = 0; i<size; i++)
|
||||||
vault.kout << ((char*)buffer)[i];
|
vault.kout << ((char*)buffer)[i];
|
||||||
vault.kout.flush();
|
vault.kout.flush();
|
||||||
@@ -48,8 +58,7 @@ size_t read(Vault &vault, uint32_t id, void *buf, size_t len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void sleep(Vault &vault, size_t ms) {
|
void sleep(Vault &vault, size_t ms) {
|
||||||
(void)vault;
|
vault.bellringer.sleep(vault, ms);
|
||||||
(void)ms;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sem_init(Vault &vault, size_t id, uint32_t value) {
|
bool sem_init(Vault &vault, size_t id, uint32_t value) {
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ size_t test(Vault &vault, size_t p1, size_t p2, size_t p3, size_t p4,
|
|||||||
size_t p5);
|
size_t p5);
|
||||||
|
|
||||||
int getpid(Vault &vault);
|
int getpid(Vault &vault);
|
||||||
size_t write(Vault &vault, uint32_t id, const void *buffer, size_t size);
|
size_t write(Vault &vault, uint32_t id, const void *buffer, size_t size, int x, int y);
|
||||||
size_t read(Vault &vault, uint32_t id, void *buf, size_t len);
|
size_t read(Vault &vault, uint32_t id, void *buf, size_t len);
|
||||||
void sleep(Vault &vault, size_t ms);
|
void sleep(Vault &vault, size_t ms);
|
||||||
bool sem_init(Vault &vault, size_t id, uint32_t value);
|
bool sem_init(Vault &vault, size_t id, uint32_t value);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ enum class ID : size_t {
|
|||||||
TEST = 0,
|
TEST = 0,
|
||||||
WRITE = 1,
|
WRITE = 1,
|
||||||
READ = 2,
|
READ = 2,
|
||||||
//SLEEP =3,
|
SLEEP = 3,
|
||||||
SEM_INIT=4,
|
SEM_INIT=4,
|
||||||
SEM_DESTROY=5,
|
SEM_DESTROY=5,
|
||||||
SEM_WAIT=6,
|
SEM_WAIT=6,
|
||||||
@@ -41,6 +41,10 @@ extern "C" ssize_t sys_safe_call(Syscall::ID id, size_t p1, size_t p2,
|
|||||||
return sys_call(Syscall::ID::READ, fd, (size_t)buf, len, 0, 0);
|
return sys_call(Syscall::ID::READ, fd, (size_t)buf, len, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[gnu::always_inline]] static inline int sleep(size_t ms){
|
||||||
|
return sys_call(Syscall::ID::SLEEP, ms,0,0,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
[[gnu::always_inline]] static inline int sem_init(int fd, int semid, int value) {
|
[[gnu::always_inline]] static inline int sem_init(int fd, int semid, int value) {
|
||||||
return sys_call(Syscall::ID::SEM_INIT, fd, semid, value, 0,0);
|
return sys_call(Syscall::ID::SEM_INIT, fd, semid, value, 0,0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,28 +19,14 @@ void Application::action() { // NOLINT
|
|||||||
// Thread 1 may be an auxiliary thread
|
// Thread 1 may be an auxiliary thread
|
||||||
|
|
||||||
//sys_test(1,2,3,4,5);
|
//sys_test(1,2,3,4,5);
|
||||||
write(0, "testestestestestse", 5, 1 , 1);
|
|
||||||
|
|
||||||
unsigned id = 0;
|
unsigned id = 0;
|
||||||
while (&apps[id++] != this);
|
while (&apps[id++] != this);
|
||||||
|
char text[] = "testX";
|
||||||
|
text[4] = 0x30+id;
|
||||||
|
|
||||||
for (unsigned i = 0;; ++i) {
|
for (unsigned i = 0;; ++i) {
|
||||||
//// Make sure that we can use kout exclusively due to the hardware cursor
|
write(0, text, sizeof(text));
|
||||||
//// otherwise we'd get a word jumble
|
sleep(1000);
|
||||||
//koutsem.p(Guard::enter().vault());
|
|
||||||
//kout.setPos(0U, id);
|
|
||||||
//kout << i;
|
|
||||||
//kout.flush();
|
|
||||||
//koutsem.v(Guard::enter().vault());
|
|
||||||
//// XXX: Doing this (the first time) in TASK 16 breaks all scheduling
|
|
||||||
//if (i == 10000) {
|
|
||||||
// if (id % 2 == 1) {
|
|
||||||
// Guard::enter().vault().scheduler.kill(&apps[id - 1]);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//Guard::enter().vault().scheduler.resume();
|
|
||||||
//if (id > 1) {
|
|
||||||
// Guarded g = Guard::enter();
|
|
||||||
// g.vault().bellringer.sleep(g.vault(), id * id * 10);
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,10 @@ extern Semaphore koutsem;
|
|||||||
void KeyboardApplication::action() { // NOLINT
|
void KeyboardApplication::action() { // NOLINT
|
||||||
while(1){
|
while(1){
|
||||||
char msg[11];
|
char msg[11];
|
||||||
if(read(0, msg, 10))
|
int len;
|
||||||
write(0, msg, 10);
|
len = read(0, msg, 10);
|
||||||
|
if(len)
|
||||||
|
write(0, msg, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
//const unsigned line = 10 + 2;
|
//const unsigned line = 10 + 2;
|
||||||
|
|||||||
Reference in New Issue
Block a user