From 7bae583a5dc7667e3b6dc8ab072d7b5cad978dc8 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 19 Nov 2002 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2002-11-19 --- port/devrealtime.c | 3 ++- port/edf.c | 3 ++- port/edf.h | 64 ++++++++++++++++++++++++++++++++++------------ port/nulledf.c | 3 ++- 4 files changed, 53 insertions(+), 20 deletions(-) diff --git a/port/devrealtime.c b/port/devrealtime.c index 6817fec9deb92dcb8719876fc370be9b0afe5428..9e01dfa7e54a098d7272ca62ab59b48448f7ed29 100644 --- a/port/devrealtime.c +++ b/port/devrealtime.c @@ -6,7 +6,8 @@ #include "io.h" #include "ureg.h" #include "../port/error.h" -#include "../port/realtime.h" +#include "realtime.h" +#include "../port/edf.h" #pragma varargck type "T" vlong diff --git a/port/edf.c b/port/edf.c index 1d5e2c58098b2174839de2d4c7635baaa199d6c6..aaac61896e8583cea3a5ac11997e47b209fddbcf 100644 --- a/port/edf.c +++ b/port/edf.c @@ -5,7 +5,8 @@ #include "dat.h" #include "fns.h" #include "../port/error.h" -#include "../port/realtime.h" +#include "realtime.h" +#include "../port/edf.h" /* debugging */ int edfprint = 0; diff --git a/port/edf.h b/port/edf.h index 5ec3e5c403272849bef1e39f19c1a4202c731ebd..f9574cb604a87e68e0cd1dea460f99531be1b49e 100644 --- a/port/edf.h +++ b/port/edf.h @@ -9,18 +9,10 @@ enum { /* Edf.flags field */ Verbose = 0x1, Useblocking = 0x2, -}; -typedef vlong Time; -typedef uvlong Ticks; + Infinity = 0xffffffffffffffffULL, -typedef struct Task Task; -typedef struct Resource Resource; -typedef struct ResourceItem ResourceItem; -typedef struct Edf Edf; -typedef struct Taskq Taskq; -typedef struct List List; -typedef struct Head Head; +}; enum Edfstate { EdfUnused, /* task structure not in use */ @@ -36,7 +28,16 @@ enum Edfstate { EdfBlocked, /* none of the procs are runnable as a result of sleeping */ EdfDeadline, /* none of the procs are runnable as a result of scheduling */ }; -typedef enum Edfstate Edfstate; + +typedef enum Edfstate Edfstate; +typedef struct Edf Edf; +typedef struct Head Head; +typedef struct List List; +typedef struct Resource Resource; +typedef struct Task Task; +typedef struct Taskq Taskq; +typedef struct CSN CSN; +typedef struct TaskLink TaskLink; struct List { List * next; /* next in list */ @@ -82,7 +83,8 @@ struct Task { Ticks scheduled; Schedq runq; /* Queue of runnable member procs */ Head procs; /* List of member procs */ - Head res; /* List of resources */ + Head csns; /* List of resources */ + CSN *curcsn; /* Position in CSN tree or nil */ char *user; /* mallocated */ Dirtab dir; int flags; /* e.g., Verbose */ @@ -106,11 +108,21 @@ struct Resource Ticks testDelta; }; -struct ResourceItem { - List; /* links and identifies the resource (must be first) */ - Ticks C; /* cost */ - int x; /* exclusive access (as opposed to shared-read access) */ - Head h; /* sub resource items */ +struct CSN { + List; /* links and identifies the resource (must be first) */ + Task *t; /* task the CSN belongs to */ + Ticks C; /* cost */ + int R; /* read-only access (as opposed to exclusive access) */ + Ticks Delta; /* of the Tasks critical section */ + Ticks testDelta; + Ticks S; /* Remaining slice */ + CSN* p; /* parent resource items */ +}; + +struct TaskLink { + List; /* links and identifies the task (must be first) */ + Ticks C; /* cost */ + int R; /* read-only access (as opposed to exclusive access) */ }; extern QLock edfschedlock; @@ -134,3 +146,21 @@ Ticks time2ticks(Time); int putlist(Head*, List*); int enlist(Head*, void*); int delist(Head*, void*); +char * parsetime(Time*, char*); +void * findlist(Head*, void*); +Task * findtask(int); +List * onlist(Head*, void*); +int timeconv(Fmt*); +void resourcefree(Resource*); +Resource* resource(char*, int); +void removetask(Task*); +void taskfree(Task*); +char * parseresource(Head*, CSN*, char*); +char * seprintresources(char*, char*); +char * seprintcsn(char*, char*, Head*); +void resourcetimes(Task*, Head*); +char* dumpq(char*, char*, Taskq*, Ticks); +char* seprinttask(char*, char*, Task*, Ticks); +char* dumpq(char*, char*, Taskq*, Ticks); + +#define DEBUG if(1){}else iprint diff --git a/port/nulledf.c b/port/nulledf.c index c9aeafee5f9b3df381ac94bae8f481ad7b5a0d50..86415fab45081924797b574208346b71b540e928 100644 --- a/port/nulledf.c +++ b/port/nulledf.c @@ -4,7 +4,8 @@ #include "dat.h" #include "fns.h" #include "../port/error.h" -#include "../port/realtime.h" +#include "realtime.h" +#include "../port/edf.h" static int isedf(Proc*)