📄 sched.patch
字号:
diff -c -Nr src.clean/include/minix/callnr.h src/include/minix/callnr.h*** src.clean/include/minix/callnr.h Sat Oct 18 22:06:43 2008--- src/include/minix/callnr.h Sat Oct 18 22:44:14 2008****************** 57,62 ****--- 57,63 ---- #define UNPAUSE 65 /* to MM or FS: check for EINTR */ #define REVIVE 67 /* to FS: revive a sleeping process */ #define TASK_REPLY 68 /* to FS: reply code from tty task */+ #define SETDL 69 /* to MM */ /* Posix signal handling. */ #define SIGACTION 71diff -c -Nr src.clean/include/minix/com.h src/include/minix/com.h*** src.clean/include/minix/com.h Sat Oct 18 22:06:43 2008--- src/include/minix/com.h Sat Oct 18 22:38:51 2008****************** 278,285 **** # define SYS_IOPENABLE (KERNEL_CALL + 28) /* sys_enable_iop() */ # define SYS_VM_SETBUF (KERNEL_CALL + 29) /* sys_vm_setbuf() */ # define SYS_VM_MAP (KERNEL_CALL + 30) /* sys_vm_map() */ ! #define NR_SYS_CALLS 31 /* number of system calls */ /* Subfunctions for SYS_PRIVCTL */ #define SYS_PRIV_INIT 1 /* Initialize a privilege structure */--- 278,286 ---- # define SYS_IOPENABLE (KERNEL_CALL + 28) /* sys_enable_iop() */ # define SYS_VM_SETBUF (KERNEL_CALL + 29) /* sys_vm_setbuf() */ # define SYS_VM_MAP (KERNEL_CALL + 30) /* sys_vm_map() */+ # define SYS_SETDL (KERNEL_CALL + 31) /* sys_setdl() */ ! #define NR_SYS_CALLS 32 /* number of system calls */ /* Subfunctions for SYS_PRIVCTL */ #define SYS_PRIV_INIT 1 /* Initialize a privilege structure */diff -c -Nr src.clean/include/minix/syslib.h src/include/minix/syslib.h*** src.clean/include/minix/syslib.h Sat Oct 18 22:06:43 2008--- src/include/minix/syslib.h Sun Oct 19 00:05:30 2008****************** 42,47 ****--- 42,48 ---- phys_bytes high)); _PROTOTYPE( int sys_vm_map, (int proc_nr, int do_map, phys_bytes base, phys_bytes size, phys_bytes offset));+ _PROTOTYPE( int sys_setdl, (int proc, long deadline)); /* Shorthands for sys_sdevio() system call. */ #define sys_insb(port, proc_nr, buffer, count) \diff -c -Nr src.clean/include/unistd.h src/include/unistd.h*** src.clean/include/unistd.h Sat Oct 18 22:06:43 2008--- src/include/unistd.h Sat Oct 18 22:37:25 2008****************** 144,149 ****--- 144,150 ---- _PROTOTYPE( ssize_t write, (int _fd, const void *_buf, size_t _n) ); _PROTOTYPE( int truncate, (const char *_path, off_t _length) ); _PROTOTYPE( int ftruncate, (int _fd, off_t _length) );+ _PROTOTYPE( int setdl, (long deadline) ); /* Open Group Base Specifications Issue 6 (not complete) */ _PROTOTYPE( int symlink, (const char *path1, const char *path2) );diff -c -Nr src.clean/kernel/config.h src/kernel/config.h*** src.clean/kernel/config.h Sat Oct 18 22:06:43 2008--- src/kernel/config.h Sat Oct 18 22:54:40 2008****************** 42,47 ****--- 42,48 ---- #define USE_PHYSCOPY 1 /* copy using physical addressing */ #define USE_PHYSVCOPY 1 /* vector with physical copy requests */ #define USE_MEMSET 1 /* write char to a given memory area */+ #define USE_SETDL 1 /* we use real time scheduling */ /* Length of program names stored in the process table. This is only used * for the debugging dumps that can be generated with the IS server. The PMdiff -c -Nr src.clean/kernel/proc.c src/kernel/proc.c*** src.clean/kernel/proc.c Sat Oct 18 22:06:44 2008--- src/kernel/proc.c Sat Oct 18 23:19:40 2008****************** 611,617 **** */ if (! time_left) { /* quantum consumed ? */ rp->p_ticks_left = rp->p_quantum_size; /* give new quantum */! if (rp->p_priority < (IDLE_Q-1)) { rp->p_priority += 1; /* lower priority */ } }--- 611,617 ---- */ if (! time_left) { /* quantum consumed ? */ rp->p_ticks_left = rp->p_quantum_size; /* give new quantum */! if (rp->deadline == 0 && rp->p_priority < (IDLE_Q-1) ) { rp->p_priority += 1; /* lower priority */ } }****************** 634,639 ****--- 634,640 ---- * clock task can tell who to bill for system time. */ register struct proc *rp; /* process to run */+ register struct proc *iter; int q; /* iterate over queues */ /* Check each of the scheduling queues for ready processes. The number of****************** 642,647 ****--- 643,658 ---- */ for (q=0; q < NR_SCHED_QUEUES; q++) { if ( (rp = rdy_head[q]) != NIL_PROC) {+ if (q>6)+ {+ for (iter = rdy_head[q];iter!=NIL_PROC;iter = iter->p_nextready)+ {+ if ( rp->deadline ==0 ||( iter->deadline>0 && iter->deadline<rp->deadline))+ {+ rp = iter;+ }+ }+ } next_ptr = rp; /* run process 'rp' next */ if (priv(rp)->s_flags & BILLABLE) bill_ptr = rp; /* bill for system time */diff -c -Nr src.clean/kernel/proc.h src/kernel/proc.h*** src.clean/kernel/proc.h Sat Oct 18 22:06:44 2008--- src/kernel/proc.h Sat Oct 18 22:57:41 2008****************** 53,58 ****--- 53,59 ---- char p_name[P_NAME_LEN]; /* name of the process, including \0 */ int p_endpoint; /* endpoint number, generation-aware */+ long deadline; /* deadline */ #if DEBUG_SCHED_CHECK int p_ready, p_found;diff -c -Nr src.clean/kernel/system/do_times.c src/kernel/system/do_times.c*** src.clean/kernel/system/do_times.c Sat Oct 18 22:06:44 2008--- src/kernel/system/do_times.c Sat Oct 18 22:53:12 2008****************** 40,42 ****--- 40,55 ---- #endif /* USE_TIMES */ + #if USE_SETDL+ PUBLIC int do_setdl(m_ptr)+ register message *m_ptr;+ {+ register struct proc *rp;+ int proc_nr;+ + proc_nr = m_ptr->m2_i1;+ rp = proc_addr(proc_nr);+ rp->deadline = m_ptr->m2_l1*60 + get_uptime();+ return(OK);+ }+ #endif /* use_times */diff -c -Nr src.clean/kernel/system.c src/kernel/system.c*** src.clean/kernel/system.c Sat Oct 18 22:06:44 2008--- src/kernel/system.c Sat Oct 18 22:50:21 2008****************** 179,184 ****--- 179,186 ---- map(SYS_ABORT, do_abort); /* abort MINIX */ map(SYS_GETINFO, do_getinfo); /* request system information */ map(SYS_IOPENABLE, do_iopenable); /* Enable I/O */+ + map(SYS_SETDL, do_setdl); } /*===========================================================================*diff -c -Nr src.clean/kernel/system.h src/kernel/system.h*** src.clean/kernel/system.h Sat Oct 18 22:06:44 2008--- src/kernel/system.h Sat Oct 18 22:48:03 2008****************** 175,179 ****--- 175,181 ---- _PROTOTYPE( int do_iopenable, (message *m_ptr) ); + _PROTOTYPE( int do_setdl, (message *m_ptr));+ #endif /* SYSTEM_H */ diff -c -Nr src.clean/kernel/table.c src/kernel/table.c*** src.clean/kernel/table.c Sat Oct 18 22:06:44 2008--- src/kernel/table.c Sat Oct 18 22:55:34 2008****************** 79,85 **** #define c(n) (1 << ((n)-KERNEL_CALL)) #define RS_C ~0 #define DS_C ~0 ! #define PM_C ~(c(SYS_DEVIO) | c(SYS_SDEVIO) | c(SYS_VDEVIO) | c(SYS_IRQCTL) | c(SYS_INT86)) #define FS_C (c(SYS_KILL) | c(SYS_VIRCOPY) | c(SYS_VIRVCOPY) | c(SYS_UMAP) | c(SYS_GETINFO) | c(SYS_EXIT) | c(SYS_TIMES) | c(SYS_SETALARM)) #define DRV_C (FS_C | c(SYS_SEGCTL) | c(SYS_IRQCTL) | c(SYS_INT86) | c(SYS_DEVIO) | c(SYS_SDEVIO) | c(SYS_VDEVIO)) #define TTY_C (DRV_C | c(SYS_ABORT) | c(SYS_VM_MAP) | c(SYS_IOPENABLE))--- 79,85 ---- #define c(n) (1 << ((n)-KERNEL_CALL)) #define RS_C ~0 #define DS_C ~0 ! #define PM_C ~(c(SYS_DEVIO) | c(SYS_SDEVIO) | c(SYS_VDEVIO) | c(SYS_IRQCTL) | c(SYS_INT86)) | c(SYS_SETDL) #define FS_C (c(SYS_KILL) | c(SYS_VIRCOPY) | c(SYS_VIRVCOPY) | c(SYS_UMAP) | c(SYS_GETINFO) | c(SYS_EXIT) | c(SYS_TIMES) | c(SYS_SETALARM)) #define DRV_C (FS_C | c(SYS_SEGCTL) | c(SYS_IRQCTL) | c(SYS_INT86) | c(SYS_DEVIO) | c(SYS_SDEVIO) | c(SYS_VDEVIO)) #define TTY_C (DRV_C | c(SYS_ABORT) | c(SYS_VM_MAP) | c(SYS_IOPENABLE))diff -c -Nr src.clean/lib/posix/Makefile src/lib/posix/Makefile*** src.clean/lib/posix/Makefile Sat Oct 18 22:06:49 2008--- src/lib/posix/Makefile Sat Oct 18 22:31:53 2008****************** 80,85 ****--- 80,86 ---- ../obj-ack//libc.a: ../obj-ack//libc.a(_rmdir.o) ../obj-ack//libc.a: ../obj-ack//libc.a(_select.o) ../obj-ack//libc.a: ../obj-ack//libc.a(_setgid.o)+ ../obj-ack//libc.a: ../obj-ack//libc.a(_setdl.o) ../obj-ack//libc.a: ../obj-ack//libc.a(_setsid.o) ../obj-ack//libc.a: ../obj-ack//libc.a(_setuid.o) ../obj-ack//libc.a: ../obj-ack//libc.a(_sigaction.o)****************** 241,246 ****--- 242,249 ---- cc -O -D_MINIX -D_POSIX_SOURCE -c -o ../obj-ack//./posix/_rmdir.o _rmdir.c ../obj-ack//libc.a(_select.o): _select.c cc -O -D_MINIX -D_POSIX_SOURCE -c -o ../obj-ack//./posix/_select.o _select.c+ ../obj-ack//libc.a(_setdl.o): _setdl.c+ cc -O -D_MINIX -D_POSIX_SOURCE -c -o ../obj-ack//./posix/_setdl.o _setdl.c ../obj-ack//libc.a(_setgid.o): _setgid.c cc -O -D_MINIX -D_POSIX_SOURCE -c -o ../obj-ack//./posix/_setgid.o _setgid.c ../obj-ack//libc.a(_setsid.o): _setsid.c****************** 377,382 ****--- 380,386 ---- ../obj-gnu/libc.a: ../obj-gnu/./posix/_rename.o ../obj-gnu/libc.a: ../obj-gnu/./posix/_rewinddir.o ../obj-gnu/libc.a: ../obj-gnu/./posix/_rmdir.o+ ../obj-gnu/libc.a: ../obj-gnu/./posix/_setdl.o ../obj-gnu/libc.a: ../obj-gnu/./posix/_select.o ../obj-gnu/libc.a: ../obj-gnu/./posix/_setgid.o ../obj-gnu/libc.a: ../obj-gnu/./posix/_setsid.o****************** 602,607 ****--- 606,615 ---- ../obj-gnu/./posix/_setgid.o: _setgid.c gcc -O -D_MINIX -D_POSIX_SOURCE -c -o ../obj-gnu/./posix/_setgid.o _setgid.c + ../obj-gnu/./posix/_setdl.o: _setdl.c+ gcc -O -D_MINIX -D_POSIX_SOURCE -c -o ../obj-gnu/./posix/_setdl.o _setdl.c+ + ../obj-gnu/./posix/_setsid.o: _setsid.c gcc -O -D_MINIX -D_POSIX_SOURCE -c -o ../obj-gnu/./posix/_setsid.o _setsid.c diff -c -Nr src.clean/lib/posix/_setdl.c src/lib/posix/_setdl.c*** src.clean/lib/posix/_setdl.c Thu Jan 1 00:00:00 1970--- src/lib/posix/_setdl.c Sat Oct 18 22:25:00 2008****************** 0 ****--- 1,9 ----+ #include <lib.h>+ #include <unistd.h>+ + PUBLIC int setdl(long deadline)+ {+ message m;+ m.m4_l1 = deadline;+ return (_syscall(MM,69,&m));+ }diff -c -Nr src.clean/lib/syslib/sys_fork.c src/lib/syslib/sys_fork.c*** src.clean/lib/syslib/sys_fork.c Sat Oct 18 22:06:50 2008--- src/lib/syslib/sys_fork.c Sat Oct 18 22:49:38 2008****************** 16,18 ****--- 16,26 ---- *child_endpoint = m.PR_ENDPT; return r; }+ + PUBLIC int sys_setdl(int proc, long deadline)+ {+ message m;+ m.m2_l1 = deadline;+ m.m2_i1 = proc;+ return(_taskcall(SYSTASK, SYS_SETDL, &m));+ }diff -c -Nr src.clean/servers/pm/misc.c src/servers/pm/misc.c*** src.clean/servers/pm/misc.c Sat Oct 18 22:06:54 2008--- src/servers/pm/misc.c Sat Oct 18 22:15:59 2008****************** 427,429 ****--- 427,439 ---- return(_syscall(FS_PROC_NR, WRITE, &m)); } + /*===========================================================================*+ * do_setdl *+ *===========================================================================*/+ PUBLIC int do_setdl()+ {+ long deadline = (long)m_in.m4_l1;+ sys_setdl(who_p,deadline);+ return(OK);+ }+ diff -c -Nr src.clean/servers/pm/proto.h src/servers/pm/proto.h*** src.clean/servers/pm/proto.h Sat Oct 18 22:06:54 2008--- src/servers/pm/proto.h Sat Oct 18 22:13:50 2008****************** 66,71 ****--- 66,72 ---- _PROTOTYPE( int do_getsetpriority, (void) ); _PROTOTYPE( ssize_t _read_pm, (int _fd, void *_buf, size_t _n, int s, int e)); _PROTOTYPE( ssize_t _write_pm, (int _fd, void *_buf, size_t _n, int s, int e));+ _PROTOTYPE( int do_setdl, (void) ); #if (MACHINE == MACINTOSH)diff -c -Nr src.clean/servers/pm/table.c src/servers/pm/table.c*** src.clean/servers/pm/table.c Sat Oct 18 22:06:54 2008--- src/servers/pm/table.c Sat Oct 18 22:12:49 2008****************** 84,90 **** no_sys, /* 66 = unused */ no_sys, /* 67 = REVIVE */ no_sys, /* 68 = TASK_REPLY */! no_sys, /* 69 = unused */ no_sys, /* 70 = unused */ do_sigaction, /* 71 = sigaction */ do_sigsuspend, /* 72 = sigsuspend */--- 84,90 ---- no_sys, /* 66 = unused */ no_sys, /* 67 = REVIVE */ no_sys, /* 68 = TASK_REPLY */! do_setdl, /* 69 = do_setdl */ no_sys, /* 70 = unused */ do_sigaction, /* 71 = sigaction */ do_sigsuspend, /* 72 = sigsuspend */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -