Changeset 80bcaed in mainline for kernel/generic/include/proc/thread.h
- Timestamp:
- 2007-02-03T13:22:24Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f619ec11
- Parents:
- fa8e7d2
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/proc/thread.h
rfa8e7d2 r80bcaed 53 53 54 54 /* Thread flags */ 55 #define THREAD_FLAG_WIRED (1 << 0) /**< Thread cannot be migrated to another CPU. */ 56 #define THREAD_FLAG_STOLEN (1 << 1) /**< Thread was migrated to another CPU and has not run yet. */ 57 #define THREAD_FLAG_USPACE (1 << 2) /**< Thread executes in userspace. */ 55 56 /** Thread cannot be migrated to another CPU. */ 57 #define THREAD_FLAG_WIRED (1 << 0) 58 /** Thread was migrated to another CPU and has not run yet. */ 59 #define THREAD_FLAG_STOLEN (1 << 1) 60 /** Thread executes in userspace. */ 61 #define THREAD_FLAG_USPACE (1 << 2) 58 62 59 63 /** Thread states. */ 60 64 typedef enum { 61 Invalid, /**< It is an error, if thread is found in this state. */ 62 Running, /**< State of a thread that is currently executing on some CPU. */ 63 Sleeping, /**< Thread in this state is waiting for an event. */ 64 Ready, /**< State of threads in a run queue. */ 65 Entering, /**< Threads are in this state before they are first readied. */ 66 Exiting, /**< After a thread calls thread_exit(), it is put into Exiting state. */ 67 Undead /**< Threads that were not detached but exited are in the Undead state. */ 65 /** It is an error, if thread is found in this state. */ 66 Invalid, 67 /** State of a thread that is currently executing on some CPU. */ 68 Running, 69 /** Thread in this state is waiting for an event. */ 70 Sleeping, 71 /** State of threads in a run queue. */ 72 Ready, 73 /** Threads are in this state before they are first readied. */ 74 Entering, 75 /** After a thread calls thread_exit(), it is put into Exiting state. */ 76 Exiting, 77 /** Threads that were not detached but exited are in the Undead state. */ 78 Undead 68 79 } state_t; 69 80 … … 77 88 /** Thread structure. There is one per thread. */ 78 89 typedef struct thread { 79 link_t rq_link; 80 link_t wq_link; 81 link_t th_link; 90 link_t rq_link; /**< Run queue link. */ 91 link_t wq_link; /**< Wait queue link. */ 92 link_t th_link; /**< Links to threads within containing task. */ 82 93 83 94 /** Lock protecting thread structure. … … 89 100 char name[THREAD_NAME_BUFLEN]; 90 101 91 void (* thread_code)(void *); /**< Function implementing the thread. */ 92 void *thread_arg; /**< Argument passed to thread_code() function. */ 93 94 /** From here, the stored context is restored when the thread is scheduled. */ 102 /** Function implementing the thread. */ 103 void (* thread_code)(void *); 104 /** Argument passed to thread_code() function. */ 105 void *thread_arg; 106 107 /** 108 * From here, the stored context is restored when the thread is 109 * scheduled. 110 */ 95 111 context_t saved_context; 96 /** From here, the stored timeout context is restored when sleep times out. */ 112 /** 113 * From here, the stored timeout context is restored when sleep times 114 * out. 115 */ 97 116 context_t sleep_timeout_context; 98 /** From here, the stored interruption context is restored when sleep is interrupted. */ 117 /** 118 * From here, the stored interruption context is restored when sleep is 119 * interrupted. 120 */ 99 121 context_t sleep_interruption_context; 100 122 101 bool sleep_interruptible; /**< If true, the thread can be interrupted from sleep. */ 102 waitq_t *sleep_queue; /**< Wait queue in which this thread sleeps. */ 103 timeout_t sleep_timeout; /**< Timeout used for timeoutable sleeping. */ 104 volatile int timeout_pending; /**< Flag signalling sleep timeout in progress. */ 105 106 /** True if this thread is executing copy_from_uspace(). False otherwise. */ 123 /** If true, the thread can be interrupted from sleep. */ 124 bool sleep_interruptible; 125 /** Wait queue in which this thread sleeps. */ 126 waitq_t *sleep_queue; 127 /** Timeout used for timeoutable sleeping. */ 128 timeout_t sleep_timeout; 129 /** Flag signalling sleep timeout in progress. */ 130 volatile int timeout_pending; 131 132 /** 133 * True if this thread is executing copy_from_uspace(). 134 * False otherwise. 135 */ 107 136 bool in_copy_from_uspace; 108 /** True if this thread is executing copy_to_uspace(). False otherwise. */ 137 /** 138 * True if this thread is executing copy_to_uspace(). 139 * False otherwise. 140 */ 109 141 bool in_copy_to_uspace; 110 142 111 143 /** 112 * If true, the thread will not go to sleep at all and will 113 * callthread_exit() before returning to userspace.144 * If true, the thread will not go to sleep at all and will call 145 * thread_exit() before returning to userspace. 114 146 */ 115 147 bool interrupted; 116 148 117 thread_join_type_t join_type; /**< Who joinins the thread. */ 118 bool detached; /**< If true, thread_join_timeout() cannot be used on this thread. */ 119 waitq_t join_wq; /**< Waitq for thread_join_timeout(). */ 149 /** Who joinins the thread. */ 150 thread_join_type_t join_type; 151 /** If true, thread_join_timeout() cannot be used on this thread. */ 152 bool detached; 153 /** Waitq for thread_join_timeout(). */ 154 waitq_t join_wq; 120 155 121 156 fpu_context_t *saved_fpu_context; … … 124 159 /* 125 160 * Defined only if thread doesn't run. 126 * It means that fpu context is in CPU that last time executes this thread.127 * This disables migration.161 * It means that fpu context is in CPU that last time executes this 162 * thread. This disables migration. 128 163 */ 129 164 int fpu_context_engaged; … … 131 166 rwlock_type_t rwlock_holder_type; 132 167 133 void (* call_me)(void *); /**< Funtion to be called in scheduler before the thread is put asleep. */ 134 void *call_me_with; /**< Argument passed to call_me(). */ 135 136 state_t state; /**< Thread's state. */ 137 int flags; /**< Thread's flags. */ 138 139 cpu_t *cpu; /**< Thread's CPU. */ 140 task_t *task; /**< Containing task. */ 141 142 uint64_t ticks; /**< Ticks before preemption. */ 143 144 uint64_t cycles; /**< Thread accounting. */ 145 uint64_t last_cycle; /**< Last sampled cycle. */ 146 bool uncounted; /**< Thread doesn't affect accumulated accounting. */ 147 148 int priority; /**< Thread's priority. Implemented as index to CPU->rq */ 149 uint32_t tid; /**< Thread ID. */ 150 151 thread_arch_t arch; /**< Architecture-specific data. */ 152 153 uint8_t *kstack; /**< Thread's kernel stack. */ 168 /** Callback fired in scheduler before the thread is put asleep. */ 169 void (* call_me)(void *); 170 /** Argument passed to call_me(). */ 171 void *call_me_with; 172 173 /** Thread's state. */ 174 state_t state; 175 /** Thread's flags. */ 176 int flags; 177 178 /** Thread's CPU. */ 179 cpu_t *cpu; 180 /** Containing task. */ 181 task_t *task; 182 183 /** Ticks before preemption. */ 184 uint64_t ticks; 185 186 /** Thread accounting. */ 187 uint64_t cycles; 188 /** Last sampled cycle. */ 189 uint64_t last_cycle; 190 /** Thread doesn't affect accumulated accounting. */ 191 bool uncounted; 192 193 /** Thread's priority. Implemented as index to CPU->rq */ 194 int priority; 195 /** Thread ID. */ 196 uint32_t tid; 197 198 /** Architecture-specific data. */ 199 thread_arch_t arch; 200 201 /** Thread's kernel stack. */ 202 uint8_t *kstack; 154 203 } thread_t; 155 204 … … 162 211 SPINLOCK_EXTERN(threads_lock); 163 212 164 extern btree_t threads_btree; /**< B+tree containing all threads. */ 213 /** B+tree containing all threads. */ 214 extern btree_t threads_btree; 165 215 166 216 extern void thread_init(void); 167 extern thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, int flags, char *name, bool uncounted); 217 extern thread_t *thread_create(void (* func)(void *), void *arg, task_t *task, 218 int flags, char *name, bool uncounted); 168 219 extern void thread_ready(thread_t *t); 169 220 extern void thread_exit(void) __attribute__((noreturn)); … … 182 233 extern void thread_usleep(uint32_t usec); 183 234 184 #define thread_join(t) thread_join_timeout((t), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) 235 #define thread_join(t) \ 236 thread_join_timeout((t), SYNCH_NO_TIMEOUT, SYNCH_FLAGS_NONE) 185 237 extern int thread_join_timeout(thread_t *t, uint32_t usec, int flags); 186 238 extern void thread_detach(thread_t *t); 187 239 188 extern void thread_register_call_me(void (* call_me)(void *), void *call_me_with); 240 extern void thread_register_call_me(void (* call_me)(void *), 241 void *call_me_with); 189 242 extern void thread_print_list(void); 190 243 extern void thread_destroy(thread_t *t); … … 193 246 extern void thread_interrupt_sleep(thread_t *t); 194 247 195 /* Fpu context slab cache*/248 /** Fpu context slab cache. */ 196 249 extern slab_cache_t *fpu_context_slab; 197 250 198 /* *Thread syscall prototypes. */251 /* Thread syscall prototypes. */ 199 252 unative_t sys_thread_create(uspace_arg_t *uspace_uarg, char *uspace_name); 200 253 unative_t sys_thread_exit(int uspace_status);
Note:
See TracChangeset
for help on using the changeset viewer.