From: Alan Cox Date: Thu, 15 Jan 2015 23:42:52 +0000 (+0000) Subject: sched_yield: A syscall a day 8) X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=9b8dcfac4551b634013fde92628a38071ed40012;p=FUZIX.git sched_yield: A syscall a day 8) --- diff --git a/Kernel/include/kdata.h b/Kernel/include/kdata.h index 8648f5e5..3eaf81b7 100644 --- a/Kernel/include/kdata.h +++ b/Kernel/include/kdata.h @@ -74,7 +74,7 @@ struct runload { extern struct runload loadavg[]; // the system call dispatch table -#define FUZIX_SYSCALL_COUNT 62 +#define FUZIX_SYSCALL_COUNT 63 typedef int16_t (*syscall_t)(void); extern const syscall_t syscall_dispatch[FUZIX_SYSCALL_COUNT]; diff --git a/Kernel/include/kernel.h b/Kernel/include/kernel.h index 3db5ffe4..60f65b4f 100644 --- a/Kernel/include/kernel.h +++ b/Kernel/include/kernel.h @@ -819,5 +819,6 @@ CODE2 int16_t _nice(void); /* FUZIX system call 58 */ CODE2 int16_t _sigdisp(void); /* FUZIX system call 59 */ CODE2 int16_t _flock(void); /* FUZIX system call 60 */ CODE2 int16_t _getpgrp(void); /* FUZIX system call 61 */ +CODE2 int16_t _sched_yield(void); /* FUZIX system call 62 */ #endif /* __FUZIX__KERNEL_DOT_H__ */ diff --git a/Kernel/include/syscall_name.h b/Kernel/include/syscall_name.h index da40b1d4..10c591ad 100644 --- a/Kernel/include/syscall_name.h +++ b/Kernel/include/syscall_name.h @@ -63,6 +63,7 @@ char *syscall_name[NR_SYSCALL] = { "_sigdisp", "flock", "getpgrp", + "yield", }; int syscall_args[NR_SYSCALL] = { @@ -128,4 +129,5 @@ int syscall_args[NR_SYSCALL] = { 2, //_sigdisp 2, //flock 0, //getpgrp + 0, //yield }; diff --git a/Kernel/kdata.c b/Kernel/kdata.c index 33535f5a..42382202 100644 --- a/Kernel/kdata.c +++ b/Kernel/kdata.c @@ -94,4 +94,5 @@ const syscall_t syscall_dispatch[FUZIX_SYSCALL_COUNT] = { _sigdisp, /* FUZIX system call 59 */ _flock, /* FUZIX system call 60 */ _getpgrp, /* FUZIX system call 61 */ + _sched_yield, /* FUZIX system call 62 */ }; diff --git a/Kernel/syscall_proc.c b/Kernel/syscall_proc.c index 92692250..b7c4a716 100644 --- a/Kernel/syscall_proc.c +++ b/Kernel/syscall_proc.c @@ -554,12 +554,23 @@ int16_t _setpgrp(void) return (0); } -/******************************************* +/******************************************** getpgrp (void) Function 61 -********************************************/ +*********************************************/ int16_t _getpgrp(void) { udata.u_ptab->p_pgrp = udata.u_ptab->p_pid; return (0); } + +/******************************************* +_sched_yield (void) Function 62 +********************************************/ + +int16_t _sched_yield(void) +{ + if (nready > 1) + switchin(getproc()); + return 0; +} diff --git a/Library/include/syscalls.h b/Library/include/syscalls.h index d5a7577f..c11b0213 100644 --- a/Library/include/syscalls.h +++ b/Library/include/syscalls.h @@ -124,6 +124,7 @@ extern int nice(int prio); extern int rename(const char *path, const char *newpath); extern int flock(int fd, int op); extern pid_t getpgrp(void); +extern int sched_yield(void); /* asm syscall hooks with C wrappers */ extern int _getdirent(int fd, void *buf, int len);