sched_yield: A syscall a day 8)
authorAlan Cox <alan@linux.intel.com>
Thu, 15 Jan 2015 23:42:52 +0000 (23:42 +0000)
committerAlan Cox <alan@linux.intel.com>
Thu, 15 Jan 2015 23:42:52 +0000 (23:42 +0000)
Kernel/include/kdata.h
Kernel/include/kernel.h
Kernel/include/syscall_name.h
Kernel/kdata.c
Kernel/syscall_proc.c
Library/include/syscalls.h

index 8648f5e..3eaf81b 100644 (file)
@@ -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];
 
index 3db5ffe..60f65b4 100644 (file)
@@ -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__ */
index da40b1d..10c591a 100644 (file)
@@ -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
 };
index 33535f5..4238220 100644 (file)
@@ -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 */
 };
index 9269225..b7c4a71 100644 (file)
@@ -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;
+}
index d5a7577..c11b021 100644 (file)
@@ -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);