X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Fthread.h;h=7965c0607815eab3275da7babdf669177f18c8e2;hb=3edcfedb8e62970f3293fa676b6691f8658c3c11;hp=d6a3990f1047d795b4255efa278af5f1a1119e32;hpb=f2f8875638593bd5365cfd6a5ba7c9578e52322f;p=pintos-anon diff --git a/src/threads/thread.h b/src/threads/thread.h index d6a3990..7965c06 100644 --- a/src/threads/thread.h +++ b/src/threads/thread.h @@ -1,14 +1,10 @@ -#ifndef HEADER_THREAD_H -#define HEADER_THREAD_H 1 +#ifndef THREADS_THREAD_H +#define THREADS_THREAD_H #include #include #include -#ifdef USERPROG -#include "userprog/addrspace.h" -#endif - /* States in a thread's life cycle. */ enum thread_status { @@ -18,6 +14,16 @@ enum thread_status THREAD_DYING /* About to be destroyed. */ }; +/* Thread identifier type. + You can redefine this to whatever type you like. */ +typedef int tid_t; +#define TID_ERROR ((tid_t) -1) /* Error value for tid_t. */ + +/* Thread priorities. */ +#define PRI_MIN 0 /* Lowest priority. */ +#define PRI_DEFAULT 31 /* Default priority. */ +#define PRI_MAX 63 /* Highest priority. */ + /* A kernel thread or user process. Each thread structure is stored in its own 4 kB page. The @@ -41,11 +47,11 @@ enum thread_status | | | | +---------------------------------+ - | magic | - | : | - | : | - | name | - | status | + | magic | + | : | + | : | + | name | + | status | 0 kB +---------------------------------+ The upshot of this is twofold: @@ -60,7 +66,7 @@ enum thread_status large. If a stack overflows, it will corrupt the thread state. Thus, kernel functions should not allocate large structures or arrays as non-static local variables. Use - dynamic allocation with malloc() or palloc_get() + dynamic allocation with malloc() or palloc_get_page() instead. The first symptom of either of these problems will probably be @@ -76,36 +82,60 @@ enum thread_status blocked state is on a semaphore wait list. */ struct thread { - /* These members are owned by the thread_*() functions. */ + /* Owned by thread.c. */ + tid_t tid; /* Thread identifier. */ enum thread_status status; /* Thread state. */ char name[16]; /* Name (for debugging purposes). */ uint8_t *stack; /* Saved stack pointer. */ - list_elem elem; /* List element. */ + int priority; /* Priority. */ + struct list_elem allelem; /* List element for all threads list. */ + + /* Shared between thread.c and synch.c. */ + struct list_elem elem; /* List element. */ #ifdef USERPROG - /* These members are owned by the addrspace_*() functions. */ + /* Owned by userprog/process.c. */ uint32_t *pagedir; /* Page directory. */ #endif - /* Marker to detect stack overflow. */ - unsigned magic; /* Always set to THREAD_MAGIC. */ + /* Owned by thread.c. */ + unsigned magic; /* Detects stack overflow. */ }; +/* If false (default), use round-robin scheduler. + If true, use multi-level feedback queue scheduler. + Controlled by kernel command-line option "-o mlfqs". */ +extern bool thread_mlfqs; + void thread_init (void); void thread_start (void); +void thread_tick (void); +void thread_print_stats (void); + typedef void thread_func (void *aux); -struct thread *thread_create (const char *name, thread_func *, void *); -#ifdef USERPROG -bool thread_execute (const char *filename); -#endif +tid_t thread_create (const char *name, int priority, thread_func *, void *); +void thread_block (void); void thread_unblock (struct thread *); -const char *thread_name (struct thread *); struct thread *thread_current (void); +tid_t thread_tid (void); +const char *thread_name (void); + void thread_exit (void) NO_RETURN; void thread_yield (void); -void thread_block (void); -#endif /* thread.h */ +/* Performs some operation on thread t, given auxiliary data AUX. */ +typedef void thread_action_func (struct thread *t, void *aux); +void thread_foreach (thread_action_func *, void *); + +int thread_get_priority (void); +void thread_set_priority (int); + +int thread_get_nice (void); +void thread_set_nice (int); +int thread_get_recent_cpu (void); +int thread_get_load_avg (void); + +#endif /* threads/thread.h */